Commit 0b83a7f154dd462300bec448089541d0b1b6521a
1 parent
175087c1
Exists in
master
First stab at semantic analysis (names & types).
New Prolog files for semantic analysis (semantic.pl), symbol table (stable.pl) and known types (types.pl). Lots of changes in grammar. fznslurp is now fzsem; new "name" action.
Showing
9 changed files
with
178 additions
and
62 deletions
Show diff stats
fzn-parser/Makefile
| ... | ... | @@ -3,6 +3,8 @@ OBJ = flatzinc.tab.o |
| 3 | 3 | GENCFILES = flatzinc.tab.c lex.yy.c |
| 4 | 4 | OTHER = flatzinc.output |
| 5 | 5 | |
| 6 | +PLFILES = $(wildcard *.pl) | |
| 7 | + | |
| 6 | 8 | # NOTE: we need to pass the `-l' flag to ensure the scanner internal |
| 7 | 9 | # variable `yylineno' is available. |
| 8 | 10 | # |
| ... | ... | @@ -20,13 +22,16 @@ GPLC = gplc |
| 20 | 22 | |
| 21 | 23 | RM = /bin/rm -f |
| 22 | 24 | |
| 23 | -all: fzp fznslurp | |
| 25 | +%.ast:: %.fzn | |
| 26 | + fzp < $< > $@ | |
| 27 | + | |
| 28 | +all: fzp fzsem | |
| 24 | 29 | |
| 25 | 30 | fzp: $(OBJ) |
| 26 | 31 | $(CC) $(CFLAGS) -o $@ $(OBJ) $(LEXLIB) |
| 27 | 32 | |
| 28 | -fznslurp: fznslurp.pl | |
| 29 | - $(GPLC) -o $@ $< | |
| 33 | +fzsem: $(PLFILES) | |
| 34 | + $(GPLC) -o $@ $(PLFILES) | |
| 30 | 35 | |
| 31 | 36 | flatzinc.tab.c: flatzinc.y lex.yy.c |
| 32 | 37 | $(YACC) $(YACCFLAGS) flatzinc.y | ... | ... |
fzn-parser/examples/aust.ast
| ... | ... | @@ -3,69 +3,69 @@ _T > [[]|_T]. |
| 3 | 3 | [X|_T] > [preds(X)|_T]. |
| 4 | 4 | _T > [[]|_T]. |
| 5 | 5 | _T > [int|_T]. |
| 6 | -_T > [id('X_INTRODUCED_0')|_T]. | |
| 6 | +_T > ['X_INTRODUCED_0'|_T]. | |
| 7 | 7 | _T > [[]|_T]. |
| 8 | 8 | _T > [int:lit(1)|_T]. |
| 9 | 9 | _T > [int:lit(-1)|_T]. |
| 10 | 10 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 11 | 11 | [Es|_T] > [array(_):alit(Es)|_T]. |
| 12 | -[VAL,AN,T|_T] > [var(array(T,1,2), VAL, AN)|_T]. | |
| 12 | +[VAL,AN,ID,T|_T] > [var(ID, array(T,1,2), VAL, AN)|_T]. | |
| 13 | 13 | [H,T|_T] > [[H|T]|_T]. |
| 14 | 14 | _T > [int(1,3)|_T]. |
| 15 | -_T > [id('wa')|_T]. | |
| 15 | +_T > ['wa'|_T]. | |
| 16 | 16 | _T > [_:id('output_var')|_T]. |
| 17 | 17 | _T > [[]|_T]. |
| 18 | -[H,T|_T] > [[H|T]|_T]. | |
| 18 | +[As, E|_T] > [[E|As]|_T]. | |
| 19 | 19 | _T > [[]|_T]. |
| 20 | -[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | |
| 20 | +[VAL,AN,ID,T|_T] > [var(ID, T, VAL, AN)|_T]. | |
| 21 | 21 | [H,T|_T] > [[H|T]|_T]. |
| 22 | 22 | _T > [int(1,3)|_T]. |
| 23 | -_T > [id('nt')|_T]. | |
| 23 | +_T > ['nt'|_T]. | |
| 24 | 24 | _T > [_:id('output_var')|_T]. |
| 25 | 25 | _T > [[]|_T]. |
| 26 | -[H,T|_T] > [[H|T]|_T]. | |
| 26 | +[As, E|_T] > [[E|As]|_T]. | |
| 27 | 27 | _T > [[]|_T]. |
| 28 | -[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | |
| 28 | +[VAL,AN,ID,T|_T] > [var(ID, T, VAL, AN)|_T]. | |
| 29 | 29 | [H,T|_T] > [[H|T]|_T]. |
| 30 | 30 | _T > [int(1,3)|_T]. |
| 31 | -_T > [id('sa')|_T]. | |
| 31 | +_T > ['sa'|_T]. | |
| 32 | 32 | _T > [_:id('output_var')|_T]. |
| 33 | 33 | _T > [[]|_T]. |
| 34 | -[H,T|_T] > [[H|T]|_T]. | |
| 34 | +[As, E|_T] > [[E|As]|_T]. | |
| 35 | 35 | _T > [[]|_T]. |
| 36 | -[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | |
| 36 | +[VAL,AN,ID,T|_T] > [var(ID, T, VAL, AN)|_T]. | |
| 37 | 37 | [H,T|_T] > [[H|T]|_T]. |
| 38 | 38 | _T > [int(1,3)|_T]. |
| 39 | -_T > [id('q')|_T]. | |
| 39 | +_T > ['q'|_T]. | |
| 40 | 40 | _T > [_:id('output_var')|_T]. |
| 41 | 41 | _T > [[]|_T]. |
| 42 | -[H,T|_T] > [[H|T]|_T]. | |
| 42 | +[As, E|_T] > [[E|As]|_T]. | |
| 43 | 43 | _T > [[]|_T]. |
| 44 | -[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | |
| 44 | +[VAL,AN,ID,T|_T] > [var(ID, T, VAL, AN)|_T]. | |
| 45 | 45 | [H,T|_T] > [[H|T]|_T]. |
| 46 | 46 | _T > [int(1,3)|_T]. |
| 47 | -_T > [id('nsw')|_T]. | |
| 47 | +_T > ['nsw'|_T]. | |
| 48 | 48 | _T > [_:id('output_var')|_T]. |
| 49 | 49 | _T > [[]|_T]. |
| 50 | -[H,T|_T] > [[H|T]|_T]. | |
| 50 | +[As, E|_T] > [[E|As]|_T]. | |
| 51 | 51 | _T > [[]|_T]. |
| 52 | -[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | |
| 52 | +[VAL,AN,ID,T|_T] > [var(ID, T, VAL, AN)|_T]. | |
| 53 | 53 | [H,T|_T] > [[H|T]|_T]. |
| 54 | 54 | _T > [int(1,3)|_T]. |
| 55 | -_T > [id('v')|_T]. | |
| 55 | +_T > ['v'|_T]. | |
| 56 | 56 | _T > [_:id('output_var')|_T]. |
| 57 | 57 | _T > [[]|_T]. |
| 58 | -[H,T|_T] > [[H|T]|_T]. | |
| 58 | +[As, E|_T] > [[E|As]|_T]. | |
| 59 | 59 | _T > [[]|_T]. |
| 60 | -[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | |
| 60 | +[VAL,AN,ID,T|_T] > [var(ID, T, VAL, AN)|_T]. | |
| 61 | 61 | [H,T|_T] > [[H|T]|_T]. |
| 62 | 62 | _T > [int(1,3)|_T]. |
| 63 | -_T > [id('t')|_T]. | |
| 63 | +_T > ['t'|_T]. | |
| 64 | 64 | _T > [_:id('output_var')|_T]. |
| 65 | 65 | _T > [[]|_T]. |
| 66 | -[H,T|_T] > [[H|T]|_T]. | |
| 66 | +[As, E|_T] > [[E|As]|_T]. | |
| 67 | 67 | _T > [[]|_T]. |
| 68 | -[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | |
| 68 | +[VAL,AN,ID,T|_T] > [var(ID, T, VAL, AN)|_T]. | |
| 69 | 69 | [H,T|_T] > [[H|T]|_T]. |
| 70 | 70 | [X|_T] > [vars(X)|_T]. |
| 71 | 71 | _T > [[]|_T]. |
| ... | ... | @@ -77,8 +77,9 @@ _T > [_:id('nt')|_T]. |
| 77 | 77 | _T > [int:lit(0)|_T]. |
| 78 | 78 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 79 | 79 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 80 | +[AL|_T] > [C|_T] :- C =.. ['int_lin_ne'|AL]. | |
| 80 | 81 | _T > [[]|_T]. |
| 81 | -[A, C|_T] > [constraint(C, A)|_T]. | |
| 82 | +[A,C,E|_T] > [constraint(C,E,A)|_T]. | |
| 82 | 83 | [H,T|_T] > [[H|T]|_T]. |
| 83 | 84 | _T > [_:id('X_INTRODUCED_0')|_T]. |
| 84 | 85 | _T > [_:id('wa')|_T]. |
| ... | ... | @@ -88,8 +89,9 @@ _T > [_:id('sa')|_T]. |
| 88 | 89 | _T > [int:lit(0)|_T]. |
| 89 | 90 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 90 | 91 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 92 | +[AL|_T] > [C|_T] :- C =.. ['int_lin_ne'|AL]. | |
| 91 | 93 | _T > [[]|_T]. |
| 92 | -[A, C|_T] > [constraint(C, A)|_T]. | |
| 94 | +[A,C,E|_T] > [constraint(C,E,A)|_T]. | |
| 93 | 95 | [H,T|_T] > [[H|T]|_T]. |
| 94 | 96 | _T > [_:id('X_INTRODUCED_0')|_T]. |
| 95 | 97 | _T > [_:id('nt')|_T]. |
| ... | ... | @@ -99,8 +101,9 @@ _T > [_:id('sa')|_T]. |
| 99 | 101 | _T > [int:lit(0)|_T]. |
| 100 | 102 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 101 | 103 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 104 | +[AL|_T] > [C|_T] :- C =.. ['int_lin_ne'|AL]. | |
| 102 | 105 | _T > [[]|_T]. |
| 103 | -[A, C|_T] > [constraint(C, A)|_T]. | |
| 106 | +[A,C,E|_T] > [constraint(C,E,A)|_T]. | |
| 104 | 107 | [H,T|_T] > [[H|T]|_T]. |
| 105 | 108 | _T > [_:id('X_INTRODUCED_0')|_T]. |
| 106 | 109 | _T > [_:id('nt')|_T]. |
| ... | ... | @@ -110,8 +113,9 @@ _T > [_:id('q')|_T]. |
| 110 | 113 | _T > [int:lit(0)|_T]. |
| 111 | 114 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 112 | 115 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 116 | +[AL|_T] > [C|_T] :- C =.. ['int_lin_ne'|AL]. | |
| 113 | 117 | _T > [[]|_T]. |
| 114 | -[A, C|_T] > [constraint(C, A)|_T]. | |
| 118 | +[A,C,E|_T] > [constraint(C,E,A)|_T]. | |
| 115 | 119 | [H,T|_T] > [[H|T]|_T]. |
| 116 | 120 | _T > [_:id('X_INTRODUCED_0')|_T]. |
| 117 | 121 | _T > [_:id('sa')|_T]. |
| ... | ... | @@ -121,8 +125,9 @@ _T > [_:id('q')|_T]. |
| 121 | 125 | _T > [int:lit(0)|_T]. |
| 122 | 126 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 123 | 127 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 128 | +[AL|_T] > [C|_T] :- C =.. ['int_lin_ne'|AL]. | |
| 124 | 129 | _T > [[]|_T]. |
| 125 | -[A, C|_T] > [constraint(C, A)|_T]. | |
| 130 | +[A,C,E|_T] > [constraint(C,E,A)|_T]. | |
| 126 | 131 | [H,T|_T] > [[H|T]|_T]. |
| 127 | 132 | _T > [_:id('X_INTRODUCED_0')|_T]. |
| 128 | 133 | _T > [_:id('sa')|_T]. |
| ... | ... | @@ -132,8 +137,9 @@ _T > [_:id('nsw')|_T]. |
| 132 | 137 | _T > [int:lit(0)|_T]. |
| 133 | 138 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 134 | 139 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 140 | +[AL|_T] > [C|_T] :- C =.. ['int_lin_ne'|AL]. | |
| 135 | 141 | _T > [[]|_T]. |
| 136 | -[A, C|_T] > [constraint(C, A)|_T]. | |
| 142 | +[A,C,E|_T] > [constraint(C,E,A)|_T]. | |
| 137 | 143 | [H,T|_T] > [[H|T]|_T]. |
| 138 | 144 | _T > [_:id('X_INTRODUCED_0')|_T]. |
| 139 | 145 | _T > [_:id('sa')|_T]. |
| ... | ... | @@ -143,8 +149,9 @@ _T > [_:id('v')|_T]. |
| 143 | 149 | _T > [int:lit(0)|_T]. |
| 144 | 150 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 145 | 151 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 152 | +[AL|_T] > [C|_T] :- C =.. ['int_lin_ne'|AL]. | |
| 146 | 153 | _T > [[]|_T]. |
| 147 | -[A, C|_T] > [constraint(C, A)|_T]. | |
| 154 | +[A,C,E|_T] > [constraint(C,E,A)|_T]. | |
| 148 | 155 | [H,T|_T] > [[H|T]|_T]. |
| 149 | 156 | _T > [_:id('X_INTRODUCED_0')|_T]. |
| 150 | 157 | _T > [_:id('q')|_T]. |
| ... | ... | @@ -154,8 +161,9 @@ _T > [_:id('nsw')|_T]. |
| 154 | 161 | _T > [int:lit(0)|_T]. |
| 155 | 162 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 156 | 163 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 164 | +[AL|_T] > [C|_T] :- C =.. ['int_lin_ne'|AL]. | |
| 157 | 165 | _T > [[]|_T]. |
| 158 | -[A, C|_T] > [constraint(C, A)|_T]. | |
| 166 | +[A,C,E|_T] > [constraint(C,E,A)|_T]. | |
| 159 | 167 | [H,T|_T] > [[H|T]|_T]. |
| 160 | 168 | _T > [_:id('X_INTRODUCED_0')|_T]. |
| 161 | 169 | _T > [_:id('nsw')|_T]. |
| ... | ... | @@ -165,8 +173,12 @@ _T > [_:id('v')|_T]. |
| 165 | 173 | _T > [int:lit(0)|_T]. |
| 166 | 174 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 167 | 175 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 176 | +[AL|_T] > [C|_T] :- C =.. ['int_lin_ne'|AL]. | |
| 168 | 177 | _T > [[]|_T]. |
| 169 | -[A, C|_T] > [constraint(C, A)|_T]. | |
| 178 | +[A,C,E|_T] > [constraint(C,E,A)|_T]. | |
| 170 | 179 | [H,T|_T] > [[H|T]|_T]. |
| 171 | 180 | [X|_T] > [constrs(X)|_T]. |
| 172 | 181 | _T > [[]|_T]. |
| 182 | +_T > [satisfy|_T]. | |
| 183 | +[S,A|_T] > [solve(S, A)|_T]. | |
| 184 | +[S,C,V,P|_T] > [fzn(P, V, C, S)|_T]. | ... | ... |
fzn-parser/examples/aust.ast.old
| ... | ... | @@ -3,46 +3,69 @@ _T > [[]|_T]. |
| 3 | 3 | [X|_T] > [preds(X)|_T]. |
| 4 | 4 | _T > [[]|_T]. |
| 5 | 5 | _T > [int|_T]. |
| 6 | +_T > [id('X_INTRODUCED_0')|_T]. | |
| 6 | 7 | _T > [[]|_T]. |
| 7 | 8 | _T > [int:lit(1)|_T]. |
| 8 | 9 | _T > [int:lit(-1)|_T]. |
| 9 | 10 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
| 10 | 11 | [Es|_T] > [array(_):alit(Es)|_T]. |
| 12 | +[VAL,AN,T|_T] > [var(array(T,1,2), VAL, AN)|_T]. | |
| 11 | 13 | [H,T|_T] > [[H|T]|_T]. |
| 12 | 14 | _T > [int(1,3)|_T]. |
| 15 | +_T > [id('wa')|_T]. | |
| 13 | 16 | _T > [_:id('output_var')|_T]. |
| 14 | 17 | _T > [[]|_T]. |
| 15 | 18 | [H,T|_T] > [[H|T]|_T]. |
| 19 | +_T > [[]|_T]. | |
| 20 | +[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | |
| 16 | 21 | [H,T|_T] > [[H|T]|_T]. |
| 17 | 22 | _T > [int(1,3)|_T]. |
| 23 | +_T > [id('nt')|_T]. | |
| 18 | 24 | _T > [_:id('output_var')|_T]. |
| 19 | 25 | _T > [[]|_T]. |
| 20 | 26 | [H,T|_T] > [[H|T]|_T]. |
| 27 | +_T > [[]|_T]. | |
| 28 | +[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | |
| 21 | 29 | [H,T|_T] > [[H|T]|_T]. |
| 22 | 30 | _T > [int(1,3)|_T]. |
| 31 | +_T > [id('sa')|_T]. | |
| 23 | 32 | _T > [_:id('output_var')|_T]. |
| 24 | 33 | _T > [[]|_T]. |
| 25 | 34 | [H,T|_T] > [[H|T]|_T]. |
| 35 | +_T > [[]|_T]. | |
| 36 | +[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | |
| 26 | 37 | [H,T|_T] > [[H|T]|_T]. |
| 27 | 38 | _T > [int(1,3)|_T]. |
| 39 | +_T > [id('q')|_T]. | |
| 28 | 40 | _T > [_:id('output_var')|_T]. |
| 29 | 41 | _T > [[]|_T]. |
| 30 | 42 | [H,T|_T] > [[H|T]|_T]. |
| 43 | +_T > [[]|_T]. | |
| 44 | +[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | |
| 31 | 45 | [H,T|_T] > [[H|T]|_T]. |
| 32 | 46 | _T > [int(1,3)|_T]. |
| 47 | +_T > [id('nsw')|_T]. | |
| 33 | 48 | _T > [_:id('output_var')|_T]. |
| 34 | 49 | _T > [[]|_T]. |
| 35 | 50 | [H,T|_T] > [[H|T]|_T]. |
| 51 | +_T > [[]|_T]. | |
| 52 | +[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | |
| 36 | 53 | [H,T|_T] > [[H|T]|_T]. |
| 37 | 54 | _T > [int(1,3)|_T]. |
| 55 | +_T > [id('v')|_T]. | |
| 38 | 56 | _T > [_:id('output_var')|_T]. |
| 39 | 57 | _T > [[]|_T]. |
| 40 | 58 | [H,T|_T] > [[H|T]|_T]. |
| 59 | +_T > [[]|_T]. | |
| 60 | +[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | |
| 41 | 61 | [H,T|_T] > [[H|T]|_T]. |
| 42 | 62 | _T > [int(1,3)|_T]. |
| 63 | +_T > [id('t')|_T]. | |
| 43 | 64 | _T > [_:id('output_var')|_T]. |
| 44 | 65 | _T > [[]|_T]. |
| 45 | 66 | [H,T|_T] > [[H|T]|_T]. |
| 67 | +_T > [[]|_T]. | |
| 68 | +[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | |
| 46 | 69 | [H,T|_T] > [[H|T]|_T]. |
| 47 | 70 | [X|_T] > [vars(X)|_T]. |
| 48 | 71 | _T > [[]|_T]. | ... | ... |
fzn-parser/flatzinc.y
| ... | ... | @@ -19,6 +19,14 @@ |
| 19 | 19 | |
| 20 | 20 | #include "types.h" |
| 21 | 21 | |
| 22 | +// -- AST stack macros: ------------------------------------------------------- | |
| 23 | +// AST (POP, (PUSH)) | |
| 24 | +// ASTT (POP, (PUSH), TRANS) | |
| 25 | +// INIT (STACK) | |
| 26 | +// PUSH (ITEM) | |
| 27 | +// CONS () | |
| 28 | +// NIL () | |
| 29 | + | |
| 22 | 30 | #define AST(pop, push) \ |
| 23 | 31 | { \ |
| 24 | 32 | printf ("[%s|_T] > [", pop); \ |
| ... | ... | @@ -26,6 +34,15 @@ |
| 26 | 34 | printf ("|_T].\n"); \ |
| 27 | 35 | } |
| 28 | 36 | |
| 37 | +#define ASTT(pop, push, trans) \ | |
| 38 | +{ \ | |
| 39 | + printf ("[%s|_T] > [", pop); \ | |
| 40 | + printf push; \ | |
| 41 | + printf ("|_T] :- "); \ | |
| 42 | + printf trans; \ | |
| 43 | + printf (".\n"); \ | |
| 44 | +} | |
| 45 | + | |
| 29 | 46 | #define INIT(x) \ |
| 30 | 47 | { \ |
| 31 | 48 | printf ("_ > %s.\n", x); \ |
| ... | ... | @@ -51,6 +68,9 @@ |
| 51 | 68 | // pop an item and a list, push new list (CONS) |
| 52 | 69 | #define CONS() AST ("H,T", ("[H|T]")) |
| 53 | 70 | |
| 71 | + // pop a list and an item, push new list (RCONS) | |
| 72 | +#define RCONS() AST ("T,H", ("[H|T]")) | |
| 73 | + | |
| 54 | 74 | // push the empty list |
| 55 | 75 | #define NIL() PUSH (("[]")) |
| 56 | 76 | |
| ... | ... | @@ -67,7 +87,9 @@ |
| 67 | 87 | <id> IDENT UNDERSCORE_IDENT |
| 68 | 88 | ARRAY BOOL CONSTRAINT FALSE FLOAT INT MAXIMIZE MINIMIZE OF |
| 69 | 89 | PREDICATE SATISFY SET SOLVE TRUE VAR DOTDOT COLONCOLON |
| 70 | - | |
| 90 | + | |
| 91 | +%right ',' | |
| 92 | + | |
| 71 | 93 | %% |
| 72 | 94 | |
| 73 | 95 | //--------------------------------------------------------------------------- |
| ... | ... | @@ -132,10 +154,10 @@ ident_anns: /* -> [ ANNOT,ID | _ ] */ |
| 132 | 154 | |
| 133 | 155 | constraint_item: /* -> [ constraint(...) | ] */ |
| 134 | 156 | CONSTRAINT constraint_elem annotations |
| 135 | - { AST ("A,C,E", ("constraint(C,E,A)")); } | |
| 157 | + { AST ("A,C", ("constraint(C,A)")); } | |
| 136 | 158 | |
| 137 | 159 | constraint_elem: /* -> [ CONSTR_ID, EXPRLIST | _ ] */ |
| 138 | - IDENT '(' exprs ')' { PUSH (("'%s'", $1)); } | |
| 160 | + IDENT '(' exprs ')' { ASTT ("AL", ("C"), ("C =.. ['%s'|AL]", $1)); } | |
| 139 | 161 | |
| 140 | 162 | solve_item: /* -> [ solve(S,A) | _ ] */ |
| 141 | 163 | SOLVE annotations solve_kind { AST ("S,A", ("solve(S, A)")); } |
| ... | ... | @@ -191,7 +213,7 @@ int_ti_expr_tail: |
| 191 | 213 | | '{' int_literals '}' { AST ("Ls", ("int(Ls)")); } |
| 192 | 214 | |
| 193 | 215 | int_literals: |
| 194 | - INT_LITERAL ',' int_literals { AST ("Ls, L", ("[L|Ls]")); } | |
| 216 | + INT_LITERAL ',' int_literals { AST ("Ls", ("[%d|Ls]", $1)); } | |
| 195 | 217 | | INT_LITERAL { PUSH (("[%d]", $1)); } |
| 196 | 218 | |
| 197 | 219 | float_ti_expr_tail: |
| ... | ... | @@ -206,46 +228,44 @@ set_ti_expr_tail: |
| 206 | 228 | //--------------------------------------------------------------------------- |
| 207 | 229 | |
| 208 | 230 | exprs: |
| 209 | - expr ',' exprs { AST ("T2:E2,T1:E1", ("(T1,T2):(E1,E2)")); } | |
| 210 | - | expr | |
| 231 | + exprs ',' exprs { CONS (); } | |
| 232 | + | expr { AST ("E", ("[E]")); } | |
| 211 | 233 | |
| 212 | 234 | expr: |
| 213 | 235 | bool_literal |
| 214 | - | INT_LITERAL { PUSH (("int:lit(%d)", $1.ival)); } | |
| 215 | - | FLOAT_LITERAL { PUSH (("float:lit(%g)", $1.rval)); } | |
| 216 | - | STRING_LITERAL { PUSH (("string:lit(\"%s\")", $1.sval)); } | |
| 236 | + | INT_LITERAL { PUSH (("lit(%d,int)", $1.ival)); } | |
| 237 | + | FLOAT_LITERAL { PUSH (("lit(%g,float)", $1.rval)); } | |
| 238 | + | STRING_LITERAL { PUSH (("lit(\"%s\",string)", $1.sval)); } | |
| 217 | 239 | | set_literal |
| 218 | 240 | | array_literal |
| 219 | 241 | | array_access_expr |
| 220 | - | IDENT { PUSH (("_:id('%s')", $1)); } | |
| 221 | - | UNDERSCORE_IDENT { PUSH (("_:uid('%s')", $1)); } | |
| 242 | + | IDENT { PUSH (("id('%s')", $1)); } | |
| 243 | + | UNDERSCORE_IDENT { PUSH (("id('%s')", $1)); } | |
| 222 | 244 | | IDENT '(' exprs ')' /* An annotation value with > 0 arguments. */ |
| 223 | 245 | |
| 224 | 246 | bool_literal: |
| 225 | - FALSE { PUSH (("bool:lit(false)")); } | |
| 226 | - | TRUE { PUSH (("bool:lit(true)")); } | |
| 247 | + FALSE { PUSH (("lit(false,bool)")); } | |
| 248 | + | TRUE { PUSH (("lit(true,bool)")); } | |
| 227 | 249 | |
| 228 | 250 | set_literal: |
| 229 | - '{' exprs '}' { AST ("Ts:Es", ("set(Ts):lit(Es)")); } | |
| 230 | - | '{' '}' { PUSH (("set(_):lit([])")); } | |
| 251 | + '{' exprs '}' { AST ("Es", ("lit(Es,set(_))")); } | |
| 252 | + | '{' '}' { PUSH (("lit([],set(_))")); } | |
| 231 | 253 | | INT_LITERAL DOTDOT INT_LITERAL { int i; |
| 232 | 254 | PRE(); |
| 233 | - printf ("set(int):lit("); | |
| 255 | + printf ("lit(["); | |
| 234 | 256 | for (i=$1.ival; i<$3.ival; ++i) |
| 235 | 257 | printf ("%d, ", i); |
| 236 | - printf ("%d)", $3.ival); | |
| 258 | + printf ("%d], set(int))", $3.ival); | |
| 237 | 259 | POST(); } |
| 238 | 260 | |
| 239 | 261 | array_literal: |
| 240 | - '[' exprs ']' { AST ("Es", ("array(_):alit(Es)")); } | |
| 241 | - | '[' ']' { PUSH (("array(_):alit([])")); } | |
| 262 | + '[' exprs ']' { AST ("Es", ("lit(Es,array(_))")); } | |
| 263 | + | '[' ']' { PUSH (("lit([],array(_))")); } | |
| 242 | 264 | |
| 243 | -array_access_expr: IDENT '[' INT_LITERAL ']' | |
| 244 | - { AST ("int:EI,array(T):ID", | |
| 245 | - ("T:aref(array(T):ID,int:EI)")); } | |
| 265 | +array_access_expr: | |
| 266 | + IDENT '[' INT_LITERAL ']' { PUSH (("aref('%s',lit(%d,int),_)",$1,$3)); } | |
| 246 | 267 | | UNDERSCORE_IDENT '[' INT_LITERAL ']' |
| 247 | - { AST ("int:EI,array(T):ID", | |
| 248 | - ("T:aref(array(T):ID,int:EI)")); } | |
| 268 | + { PUSH (("aref('%s',lit(%d,int),_)",$1,$3)); } | |
| 249 | 269 | |
| 250 | 270 | //--------------------------------------------------------------------------- |
| 251 | 271 | // Annotations | ... | ... |
fzn-parser/fznslurp.pl
| ... | ... | @@ -11,9 +11,13 @@ main([]). |
| 11 | 11 | |
| 12 | 12 | action(load) :- !, load_ast(AST), g_assign(ast, AST). |
| 13 | 13 | action(dump) :- !, g_read(ast, AST), dump_ast(AST). |
| 14 | +action(name) :- !, | |
| 15 | + g_read(ast, AST), | |
| 16 | + sa_names(AST, NAST), | |
| 17 | + g_assign(ast, NAST). | |
| 14 | 18 | action(halt) :- !, halt. |
| 15 | -action(debug) :- g_read(ast_debug, true), !, g_write(ast_debug, false). | |
| 16 | -action(debug) :- !, g_write(ast_debug, true). | |
| 19 | +action(debug) :- g_read(ast_debug, true), !, g_assign(ast_debug, false). | |
| 20 | +action(debug) :- !, g_assign(ast_debug, true). | |
| 17 | 21 | action(ACTION) :- format("%w: unknown action.\n", [ACTION]). |
| 18 | 22 | |
| 19 | 23 | |
| ... | ... | @@ -35,7 +39,8 @@ load_ast((IN > INT), IN, OUT) :- |
| 35 | 39 | |
| 36 | 40 | load_ast_deb(end_of_file, AST, AST). |
| 37 | 41 | load_ast_deb(IN > INT, IN, OUT) :- read(OP), !, |
| 38 | - write(OP), nl, | |
| 42 | + writeq(IN), write('.'), nl, | |
| 43 | + writeq(OP), nl, | |
| 39 | 44 | load_ast_deb(OP, INT, OUT). |
| 40 | 45 | |
| 41 | 46 | % ----------------------------------------------------------------------------- | ... | ... |
| ... | ... | @@ -0,0 +1,32 @@ |
| 1 | +% == No, Emacs this is -*-Prolog-*- code, not what you thought... ============= | |
| 2 | + | |
| 3 | +sa_names(fzn(preds(IP), vars(IV), constrs(IC), SOLVE), | |
| 4 | + fzn(preds(OP), vars(OV), constrs(OC), SOLVE, ST)) :- | |
| 5 | + sa_n_traverse(IP, OP, [], ST1), % predicates | |
| 6 | + sa_n_traverse(IV, OV, ST1, ST2), % variables | |
| 7 | + sa_n_traverse(IC, OC, ST2, ST). % constraints | |
| 8 | + | |
| 9 | +% ----------------------------------------------------------------------------- | |
| 10 | + | |
| 11 | +sa_n_traverse([], [], ST, ST). | |
| 12 | +sa_n_traverse([N|Ns], [NN|NNs], IST, OST) :- | |
| 13 | + sa_n(N, NN, IST, MST), | |
| 14 | + sa_n_traverse(Ns, NNs, MST, OST). | |
| 15 | + | |
| 16 | + | |
| 17 | +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
| 18 | +% | |
| 19 | +% sa_n(AST_N_IN, AST_N_OUT, ST_IN, ST_OUT) | |
| 20 | + | |
| 21 | +sa_n(var(N,T,I,A), var(N,T), IST, OST) :- | |
| 22 | + sa_attribs(A, AX, IST, ST1), | |
| 23 | + st_insert(ST1, N, var(N,T,I,AX), OST). | |
| 24 | + | |
| 25 | +sa_n(constraint(_C)). | |
| 26 | + | |
| 27 | +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
| 28 | + | |
| 29 | +sa_attribs(A, NA, IST, OST) :- | |
| 30 | + true. | |
| 31 | + | |
| 32 | +% ----------------------------------------------------------------------------- | ... | ... |
| ... | ... | @@ -0,0 +1,10 @@ |
| 1 | +% == No, Emacs this is -*-Prolog-*- code, not what you thought... ============= | |
| 2 | + | |
| 3 | +% -- Symbol table ------------------------------------------------------------- | |
| 4 | + | |
| 5 | +st_lookup([K=V|_], K, V). | |
| 6 | +st_lookup([_|ST], K, V) :- st_lookup(ST, K, V). | |
| 7 | + | |
| 8 | +st_insert([], K, V, [K=V]) :- !. | |
| 9 | +st_insert([K=_|_], K, _, _) :- !, throw(duplicate(K)). | |
| 10 | +st_insert([KV0|ST], K, V, [KV0|STx]) :- st_insert(ST, K, V, STx). | ... | ... |