Compare View
Commits (7)
-
- new command line structure, now it's a sequence of action verbs.
-
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
Show diff stats
fzn-parser/Makefile
@@ -3,6 +3,8 @@ OBJ = flatzinc.tab.o | @@ -3,6 +3,8 @@ OBJ = flatzinc.tab.o | ||
3 | GENCFILES = flatzinc.tab.c lex.yy.c | 3 | GENCFILES = flatzinc.tab.c lex.yy.c |
4 | OTHER = flatzinc.output | 4 | OTHER = flatzinc.output |
5 | 5 | ||
6 | +PLFILES = $(wildcard *.pl) | ||
7 | + | ||
6 | # NOTE: we need to pass the `-l' flag to ensure the scanner internal | 8 | # NOTE: we need to pass the `-l' flag to ensure the scanner internal |
7 | # variable `yylineno' is available. | 9 | # variable `yylineno' is available. |
8 | # | 10 | # |
@@ -20,13 +22,16 @@ GPLC = gplc | @@ -20,13 +22,16 @@ GPLC = gplc | ||
20 | 22 | ||
21 | RM = /bin/rm -f | 23 | RM = /bin/rm -f |
22 | 24 | ||
23 | -all: fzp fznslurp | 25 | +%.ast:: %.fzn |
26 | + fzp < $< > $@ | ||
27 | + | ||
28 | +all: fzp fzsem | ||
24 | 29 | ||
25 | fzp: $(OBJ) | 30 | fzp: $(OBJ) |
26 | $(CC) $(CFLAGS) -o $@ $(OBJ) $(LEXLIB) | 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 | flatzinc.tab.c: flatzinc.y lex.yy.c | 36 | flatzinc.tab.c: flatzinc.y lex.yy.c |
32 | $(YACC) $(YACCFLAGS) flatzinc.y | 37 | $(YACC) $(YACCFLAGS) flatzinc.y |
fzn-parser/examples/aust.ast
@@ -3,69 +3,69 @@ _T > [[]|_T]. | @@ -3,69 +3,69 @@ _T > [[]|_T]. | ||
3 | [X|_T] > [preds(X)|_T]. | 3 | [X|_T] > [preds(X)|_T]. |
4 | _T > [[]|_T]. | 4 | _T > [[]|_T]. |
5 | _T > [int|_T]. | 5 | _T > [int|_T]. |
6 | -_T > [id('X_INTRODUCED_0')|_T]. | 6 | +_T > ['X_INTRODUCED_0'|_T]. |
7 | _T > [[]|_T]. | 7 | _T > [[]|_T]. |
8 | _T > [int:lit(1)|_T]. | 8 | _T > [int:lit(1)|_T]. |
9 | _T > [int:lit(-1)|_T]. | 9 | _T > [int:lit(-1)|_T]. |
10 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 10 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
11 | [Es|_T] > [array(_):alit(Es)|_T]. | 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 | [H,T|_T] > [[H|T]|_T]. | 13 | [H,T|_T] > [[H|T]|_T]. |
14 | _T > [int(1,3)|_T]. | 14 | _T > [int(1,3)|_T]. |
15 | -_T > [id('wa')|_T]. | 15 | +_T > ['wa'|_T]. |
16 | _T > [_:id('output_var')|_T]. | 16 | _T > [_:id('output_var')|_T]. |
17 | _T > [[]|_T]. | 17 | _T > [[]|_T]. |
18 | -[H,T|_T] > [[H|T]|_T]. | 18 | +[As, E|_T] > [[E|As]|_T]. |
19 | _T > [[]|_T]. | 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 | [H,T|_T] > [[H|T]|_T]. | 21 | [H,T|_T] > [[H|T]|_T]. |
22 | _T > [int(1,3)|_T]. | 22 | _T > [int(1,3)|_T]. |
23 | -_T > [id('nt')|_T]. | 23 | +_T > ['nt'|_T]. |
24 | _T > [_:id('output_var')|_T]. | 24 | _T > [_:id('output_var')|_T]. |
25 | _T > [[]|_T]. | 25 | _T > [[]|_T]. |
26 | -[H,T|_T] > [[H|T]|_T]. | 26 | +[As, E|_T] > [[E|As]|_T]. |
27 | _T > [[]|_T]. | 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 | [H,T|_T] > [[H|T]|_T]. | 29 | [H,T|_T] > [[H|T]|_T]. |
30 | _T > [int(1,3)|_T]. | 30 | _T > [int(1,3)|_T]. |
31 | -_T > [id('sa')|_T]. | 31 | +_T > ['sa'|_T]. |
32 | _T > [_:id('output_var')|_T]. | 32 | _T > [_:id('output_var')|_T]. |
33 | _T > [[]|_T]. | 33 | _T > [[]|_T]. |
34 | -[H,T|_T] > [[H|T]|_T]. | 34 | +[As, E|_T] > [[E|As]|_T]. |
35 | _T > [[]|_T]. | 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 | [H,T|_T] > [[H|T]|_T]. | 37 | [H,T|_T] > [[H|T]|_T]. |
38 | _T > [int(1,3)|_T]. | 38 | _T > [int(1,3)|_T]. |
39 | -_T > [id('q')|_T]. | 39 | +_T > ['q'|_T]. |
40 | _T > [_:id('output_var')|_T]. | 40 | _T > [_:id('output_var')|_T]. |
41 | _T > [[]|_T]. | 41 | _T > [[]|_T]. |
42 | -[H,T|_T] > [[H|T]|_T]. | 42 | +[As, E|_T] > [[E|As]|_T]. |
43 | _T > [[]|_T]. | 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 | [H,T|_T] > [[H|T]|_T]. | 45 | [H,T|_T] > [[H|T]|_T]. |
46 | _T > [int(1,3)|_T]. | 46 | _T > [int(1,3)|_T]. |
47 | -_T > [id('nsw')|_T]. | 47 | +_T > ['nsw'|_T]. |
48 | _T > [_:id('output_var')|_T]. | 48 | _T > [_:id('output_var')|_T]. |
49 | _T > [[]|_T]. | 49 | _T > [[]|_T]. |
50 | -[H,T|_T] > [[H|T]|_T]. | 50 | +[As, E|_T] > [[E|As]|_T]. |
51 | _T > [[]|_T]. | 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 | [H,T|_T] > [[H|T]|_T]. | 53 | [H,T|_T] > [[H|T]|_T]. |
54 | _T > [int(1,3)|_T]. | 54 | _T > [int(1,3)|_T]. |
55 | -_T > [id('v')|_T]. | 55 | +_T > ['v'|_T]. |
56 | _T > [_:id('output_var')|_T]. | 56 | _T > [_:id('output_var')|_T]. |
57 | _T > [[]|_T]. | 57 | _T > [[]|_T]. |
58 | -[H,T|_T] > [[H|T]|_T]. | 58 | +[As, E|_T] > [[E|As]|_T]. |
59 | _T > [[]|_T]. | 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 | [H,T|_T] > [[H|T]|_T]. | 61 | [H,T|_T] > [[H|T]|_T]. |
62 | _T > [int(1,3)|_T]. | 62 | _T > [int(1,3)|_T]. |
63 | -_T > [id('t')|_T]. | 63 | +_T > ['t'|_T]. |
64 | _T > [_:id('output_var')|_T]. | 64 | _T > [_:id('output_var')|_T]. |
65 | _T > [[]|_T]. | 65 | _T > [[]|_T]. |
66 | -[H,T|_T] > [[H|T]|_T]. | 66 | +[As, E|_T] > [[E|As]|_T]. |
67 | _T > [[]|_T]. | 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 | [H,T|_T] > [[H|T]|_T]. | 69 | [H,T|_T] > [[H|T]|_T]. |
70 | [X|_T] > [vars(X)|_T]. | 70 | [X|_T] > [vars(X)|_T]. |
71 | _T > [[]|_T]. | 71 | _T > [[]|_T]. |
@@ -77,8 +77,9 @@ _T > [_:id('nt')|_T]. | @@ -77,8 +77,9 @@ _T > [_:id('nt')|_T]. | ||
77 | _T > [int:lit(0)|_T]. | 77 | _T > [int:lit(0)|_T]. |
78 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 78 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
79 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 79 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
80 | +[AL|_T] > [C|_T] :- C =.. ['int_lin_ne'|AL]. | ||
80 | _T > [[]|_T]. | 81 | _T > [[]|_T]. |
81 | -[A, C|_T] > [constraint(C, A)|_T]. | 82 | +[A,C,E|_T] > [constraint(C,E,A)|_T]. |
82 | [H,T|_T] > [[H|T]|_T]. | 83 | [H,T|_T] > [[H|T]|_T]. |
83 | _T > [_:id('X_INTRODUCED_0')|_T]. | 84 | _T > [_:id('X_INTRODUCED_0')|_T]. |
84 | _T > [_:id('wa')|_T]. | 85 | _T > [_:id('wa')|_T]. |
@@ -88,8 +89,9 @@ _T > [_:id('sa')|_T]. | @@ -88,8 +89,9 @@ _T > [_:id('sa')|_T]. | ||
88 | _T > [int:lit(0)|_T]. | 89 | _T > [int:lit(0)|_T]. |
89 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 90 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
90 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 91 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
92 | +[AL|_T] > [C|_T] :- C =.. ['int_lin_ne'|AL]. | ||
91 | _T > [[]|_T]. | 93 | _T > [[]|_T]. |
92 | -[A, C|_T] > [constraint(C, A)|_T]. | 94 | +[A,C,E|_T] > [constraint(C,E,A)|_T]. |
93 | [H,T|_T] > [[H|T]|_T]. | 95 | [H,T|_T] > [[H|T]|_T]. |
94 | _T > [_:id('X_INTRODUCED_0')|_T]. | 96 | _T > [_:id('X_INTRODUCED_0')|_T]. |
95 | _T > [_:id('nt')|_T]. | 97 | _T > [_:id('nt')|_T]. |
@@ -99,8 +101,9 @@ _T > [_:id('sa')|_T]. | @@ -99,8 +101,9 @@ _T > [_:id('sa')|_T]. | ||
99 | _T > [int:lit(0)|_T]. | 101 | _T > [int:lit(0)|_T]. |
100 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 102 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
101 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 103 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
104 | +[AL|_T] > [C|_T] :- C =.. ['int_lin_ne'|AL]. | ||
102 | _T > [[]|_T]. | 105 | _T > [[]|_T]. |
103 | -[A, C|_T] > [constraint(C, A)|_T]. | 106 | +[A,C,E|_T] > [constraint(C,E,A)|_T]. |
104 | [H,T|_T] > [[H|T]|_T]. | 107 | [H,T|_T] > [[H|T]|_T]. |
105 | _T > [_:id('X_INTRODUCED_0')|_T]. | 108 | _T > [_:id('X_INTRODUCED_0')|_T]. |
106 | _T > [_:id('nt')|_T]. | 109 | _T > [_:id('nt')|_T]. |
@@ -110,8 +113,9 @@ _T > [_:id('q')|_T]. | @@ -110,8 +113,9 @@ _T > [_:id('q')|_T]. | ||
110 | _T > [int:lit(0)|_T]. | 113 | _T > [int:lit(0)|_T]. |
111 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 114 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
112 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 115 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
116 | +[AL|_T] > [C|_T] :- C =.. ['int_lin_ne'|AL]. | ||
113 | _T > [[]|_T]. | 117 | _T > [[]|_T]. |
114 | -[A, C|_T] > [constraint(C, A)|_T]. | 118 | +[A,C,E|_T] > [constraint(C,E,A)|_T]. |
115 | [H,T|_T] > [[H|T]|_T]. | 119 | [H,T|_T] > [[H|T]|_T]. |
116 | _T > [_:id('X_INTRODUCED_0')|_T]. | 120 | _T > [_:id('X_INTRODUCED_0')|_T]. |
117 | _T > [_:id('sa')|_T]. | 121 | _T > [_:id('sa')|_T]. |
@@ -121,8 +125,9 @@ _T > [_:id('q')|_T]. | @@ -121,8 +125,9 @@ _T > [_:id('q')|_T]. | ||
121 | _T > [int:lit(0)|_T]. | 125 | _T > [int:lit(0)|_T]. |
122 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 126 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
123 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 127 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
128 | +[AL|_T] > [C|_T] :- C =.. ['int_lin_ne'|AL]. | ||
124 | _T > [[]|_T]. | 129 | _T > [[]|_T]. |
125 | -[A, C|_T] > [constraint(C, A)|_T]. | 130 | +[A,C,E|_T] > [constraint(C,E,A)|_T]. |
126 | [H,T|_T] > [[H|T]|_T]. | 131 | [H,T|_T] > [[H|T]|_T]. |
127 | _T > [_:id('X_INTRODUCED_0')|_T]. | 132 | _T > [_:id('X_INTRODUCED_0')|_T]. |
128 | _T > [_:id('sa')|_T]. | 133 | _T > [_:id('sa')|_T]. |
@@ -132,8 +137,9 @@ _T > [_:id('nsw')|_T]. | @@ -132,8 +137,9 @@ _T > [_:id('nsw')|_T]. | ||
132 | _T > [int:lit(0)|_T]. | 137 | _T > [int:lit(0)|_T]. |
133 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 138 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
134 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 139 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
140 | +[AL|_T] > [C|_T] :- C =.. ['int_lin_ne'|AL]. | ||
135 | _T > [[]|_T]. | 141 | _T > [[]|_T]. |
136 | -[A, C|_T] > [constraint(C, A)|_T]. | 142 | +[A,C,E|_T] > [constraint(C,E,A)|_T]. |
137 | [H,T|_T] > [[H|T]|_T]. | 143 | [H,T|_T] > [[H|T]|_T]. |
138 | _T > [_:id('X_INTRODUCED_0')|_T]. | 144 | _T > [_:id('X_INTRODUCED_0')|_T]. |
139 | _T > [_:id('sa')|_T]. | 145 | _T > [_:id('sa')|_T]. |
@@ -143,8 +149,9 @@ _T > [_:id('v')|_T]. | @@ -143,8 +149,9 @@ _T > [_:id('v')|_T]. | ||
143 | _T > [int:lit(0)|_T]. | 149 | _T > [int:lit(0)|_T]. |
144 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 150 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
145 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 151 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
152 | +[AL|_T] > [C|_T] :- C =.. ['int_lin_ne'|AL]. | ||
146 | _T > [[]|_T]. | 153 | _T > [[]|_T]. |
147 | -[A, C|_T] > [constraint(C, A)|_T]. | 154 | +[A,C,E|_T] > [constraint(C,E,A)|_T]. |
148 | [H,T|_T] > [[H|T]|_T]. | 155 | [H,T|_T] > [[H|T]|_T]. |
149 | _T > [_:id('X_INTRODUCED_0')|_T]. | 156 | _T > [_:id('X_INTRODUCED_0')|_T]. |
150 | _T > [_:id('q')|_T]. | 157 | _T > [_:id('q')|_T]. |
@@ -154,8 +161,9 @@ _T > [_:id('nsw')|_T]. | @@ -154,8 +161,9 @@ _T > [_:id('nsw')|_T]. | ||
154 | _T > [int:lit(0)|_T]. | 161 | _T > [int:lit(0)|_T]. |
155 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 162 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
156 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 163 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
164 | +[AL|_T] > [C|_T] :- C =.. ['int_lin_ne'|AL]. | ||
157 | _T > [[]|_T]. | 165 | _T > [[]|_T]. |
158 | -[A, C|_T] > [constraint(C, A)|_T]. | 166 | +[A,C,E|_T] > [constraint(C,E,A)|_T]. |
159 | [H,T|_T] > [[H|T]|_T]. | 167 | [H,T|_T] > [[H|T]|_T]. |
160 | _T > [_:id('X_INTRODUCED_0')|_T]. | 168 | _T > [_:id('X_INTRODUCED_0')|_T]. |
161 | _T > [_:id('nsw')|_T]. | 169 | _T > [_:id('nsw')|_T]. |
@@ -165,8 +173,12 @@ _T > [_:id('v')|_T]. | @@ -165,8 +173,12 @@ _T > [_:id('v')|_T]. | ||
165 | _T > [int:lit(0)|_T]. | 173 | _T > [int:lit(0)|_T]. |
166 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 174 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
167 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 175 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
176 | +[AL|_T] > [C|_T] :- C =.. ['int_lin_ne'|AL]. | ||
168 | _T > [[]|_T]. | 177 | _T > [[]|_T]. |
169 | -[A, C|_T] > [constraint(C, A)|_T]. | 178 | +[A,C,E|_T] > [constraint(C,E,A)|_T]. |
170 | [H,T|_T] > [[H|T]|_T]. | 179 | [H,T|_T] > [[H|T]|_T]. |
171 | [X|_T] > [constrs(X)|_T]. | 180 | [X|_T] > [constrs(X)|_T]. |
172 | _T > [[]|_T]. | 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,46 +3,69 @@ _T > [[]|_T]. | ||
3 | [X|_T] > [preds(X)|_T]. | 3 | [X|_T] > [preds(X)|_T]. |
4 | _T > [[]|_T]. | 4 | _T > [[]|_T]. |
5 | _T > [int|_T]. | 5 | _T > [int|_T]. |
6 | +_T > [id('X_INTRODUCED_0')|_T]. | ||
6 | _T > [[]|_T]. | 7 | _T > [[]|_T]. |
7 | _T > [int:lit(1)|_T]. | 8 | _T > [int:lit(1)|_T]. |
8 | _T > [int:lit(-1)|_T]. | 9 | _T > [int:lit(-1)|_T]. |
9 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. | 10 | [T2:E2,T1:E1|_T] > [(T1,T2):(E1,E2)|_T]. |
10 | [Es|_T] > [array(_):alit(Es)|_T]. | 11 | [Es|_T] > [array(_):alit(Es)|_T]. |
12 | +[VAL,AN,T|_T] > [var(array(T,1,2), VAL, AN)|_T]. | ||
11 | [H,T|_T] > [[H|T]|_T]. | 13 | [H,T|_T] > [[H|T]|_T]. |
12 | _T > [int(1,3)|_T]. | 14 | _T > [int(1,3)|_T]. |
15 | +_T > [id('wa')|_T]. | ||
13 | _T > [_:id('output_var')|_T]. | 16 | _T > [_:id('output_var')|_T]. |
14 | _T > [[]|_T]. | 17 | _T > [[]|_T]. |
15 | [H,T|_T] > [[H|T]|_T]. | 18 | [H,T|_T] > [[H|T]|_T]. |
19 | +_T > [[]|_T]. | ||
20 | +[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | ||
16 | [H,T|_T] > [[H|T]|_T]. | 21 | [H,T|_T] > [[H|T]|_T]. |
17 | _T > [int(1,3)|_T]. | 22 | _T > [int(1,3)|_T]. |
23 | +_T > [id('nt')|_T]. | ||
18 | _T > [_:id('output_var')|_T]. | 24 | _T > [_:id('output_var')|_T]. |
19 | _T > [[]|_T]. | 25 | _T > [[]|_T]. |
20 | [H,T|_T] > [[H|T]|_T]. | 26 | [H,T|_T] > [[H|T]|_T]. |
27 | +_T > [[]|_T]. | ||
28 | +[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | ||
21 | [H,T|_T] > [[H|T]|_T]. | 29 | [H,T|_T] > [[H|T]|_T]. |
22 | _T > [int(1,3)|_T]. | 30 | _T > [int(1,3)|_T]. |
31 | +_T > [id('sa')|_T]. | ||
23 | _T > [_:id('output_var')|_T]. | 32 | _T > [_:id('output_var')|_T]. |
24 | _T > [[]|_T]. | 33 | _T > [[]|_T]. |
25 | [H,T|_T] > [[H|T]|_T]. | 34 | [H,T|_T] > [[H|T]|_T]. |
35 | +_T > [[]|_T]. | ||
36 | +[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | ||
26 | [H,T|_T] > [[H|T]|_T]. | 37 | [H,T|_T] > [[H|T]|_T]. |
27 | _T > [int(1,3)|_T]. | 38 | _T > [int(1,3)|_T]. |
39 | +_T > [id('q')|_T]. | ||
28 | _T > [_:id('output_var')|_T]. | 40 | _T > [_:id('output_var')|_T]. |
29 | _T > [[]|_T]. | 41 | _T > [[]|_T]. |
30 | [H,T|_T] > [[H|T]|_T]. | 42 | [H,T|_T] > [[H|T]|_T]. |
43 | +_T > [[]|_T]. | ||
44 | +[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | ||
31 | [H,T|_T] > [[H|T]|_T]. | 45 | [H,T|_T] > [[H|T]|_T]. |
32 | _T > [int(1,3)|_T]. | 46 | _T > [int(1,3)|_T]. |
47 | +_T > [id('nsw')|_T]. | ||
33 | _T > [_:id('output_var')|_T]. | 48 | _T > [_:id('output_var')|_T]. |
34 | _T > [[]|_T]. | 49 | _T > [[]|_T]. |
35 | [H,T|_T] > [[H|T]|_T]. | 50 | [H,T|_T] > [[H|T]|_T]. |
51 | +_T > [[]|_T]. | ||
52 | +[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | ||
36 | [H,T|_T] > [[H|T]|_T]. | 53 | [H,T|_T] > [[H|T]|_T]. |
37 | _T > [int(1,3)|_T]. | 54 | _T > [int(1,3)|_T]. |
55 | +_T > [id('v')|_T]. | ||
38 | _T > [_:id('output_var')|_T]. | 56 | _T > [_:id('output_var')|_T]. |
39 | _T > [[]|_T]. | 57 | _T > [[]|_T]. |
40 | [H,T|_T] > [[H|T]|_T]. | 58 | [H,T|_T] > [[H|T]|_T]. |
59 | +_T > [[]|_T]. | ||
60 | +[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | ||
41 | [H,T|_T] > [[H|T]|_T]. | 61 | [H,T|_T] > [[H|T]|_T]. |
42 | _T > [int(1,3)|_T]. | 62 | _T > [int(1,3)|_T]. |
63 | +_T > [id('t')|_T]. | ||
43 | _T > [_:id('output_var')|_T]. | 64 | _T > [_:id('output_var')|_T]. |
44 | _T > [[]|_T]. | 65 | _T > [[]|_T]. |
45 | [H,T|_T] > [[H|T]|_T]. | 66 | [H,T|_T] > [[H|T]|_T]. |
67 | +_T > [[]|_T]. | ||
68 | +[VAL,AN,T|_T] > [var(T, VAL, AN)|_T]. | ||
46 | [H,T|_T] > [[H|T]|_T]. | 69 | [H,T|_T] > [[H|T]|_T]. |
47 | [X|_T] > [vars(X)|_T]. | 70 | [X|_T] > [vars(X)|_T]. |
48 | _T > [[]|_T]. | 71 | _T > [[]|_T]. |
fzn-parser/flatzinc.y
@@ -19,6 +19,14 @@ | @@ -19,6 +19,14 @@ | ||
19 | 19 | ||
20 | #include "types.h" | 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 | #define AST(pop, push) \ | 30 | #define AST(pop, push) \ |
23 | { \ | 31 | { \ |
24 | printf ("[%s|_T] > [", pop); \ | 32 | printf ("[%s|_T] > [", pop); \ |
@@ -26,6 +34,15 @@ | @@ -26,6 +34,15 @@ | ||
26 | printf ("|_T].\n"); \ | 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 | #define INIT(x) \ | 46 | #define INIT(x) \ |
30 | { \ | 47 | { \ |
31 | printf ("_ > %s.\n", x); \ | 48 | printf ("_ > %s.\n", x); \ |
@@ -51,6 +68,9 @@ | @@ -51,6 +68,9 @@ | ||
51 | // pop an item and a list, push new list (CONS) | 68 | // pop an item and a list, push new list (CONS) |
52 | #define CONS() AST ("H,T", ("[H|T]")) | 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 | // push the empty list | 74 | // push the empty list |
55 | #define NIL() PUSH (("[]")) | 75 | #define NIL() PUSH (("[]")) |
56 | 76 | ||
@@ -67,7 +87,9 @@ | @@ -67,7 +87,9 @@ | ||
67 | <id> IDENT UNDERSCORE_IDENT | 87 | <id> IDENT UNDERSCORE_IDENT |
68 | ARRAY BOOL CONSTRAINT FALSE FLOAT INT MAXIMIZE MINIMIZE OF | 88 | ARRAY BOOL CONSTRAINT FALSE FLOAT INT MAXIMIZE MINIMIZE OF |
69 | PREDICATE SATISFY SET SOLVE TRUE VAR DOTDOT COLONCOLON | 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,10 +154,10 @@ ident_anns: /* -> [ ANNOT,ID | _ ] */ | ||
132 | 154 | ||
133 | constraint_item: /* -> [ constraint(...) | ] */ | 155 | constraint_item: /* -> [ constraint(...) | ] */ |
134 | CONSTRAINT constraint_elem annotations | 156 | CONSTRAINT constraint_elem annotations |
135 | - { AST ("A,C,E", ("constraint(C,E,A)")); } | 157 | + { AST ("A,C", ("constraint(C,A)")); } |
136 | 158 | ||
137 | constraint_elem: /* -> [ CONSTR_ID, EXPRLIST | _ ] */ | 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 | solve_item: /* -> [ solve(S,A) | _ ] */ | 162 | solve_item: /* -> [ solve(S,A) | _ ] */ |
141 | SOLVE annotations solve_kind { AST ("S,A", ("solve(S, A)")); } | 163 | SOLVE annotations solve_kind { AST ("S,A", ("solve(S, A)")); } |
@@ -191,7 +213,7 @@ int_ti_expr_tail: | @@ -191,7 +213,7 @@ int_ti_expr_tail: | ||
191 | | '{' int_literals '}' { AST ("Ls", ("int(Ls)")); } | 213 | | '{' int_literals '}' { AST ("Ls", ("int(Ls)")); } |
192 | 214 | ||
193 | int_literals: | 215 | int_literals: |
194 | - INT_LITERAL ',' int_literals { AST ("Ls, L", ("[L|Ls]")); } | 216 | + INT_LITERAL ',' int_literals { AST ("Ls", ("[%d|Ls]", $1)); } |
195 | | INT_LITERAL { PUSH (("[%d]", $1)); } | 217 | | INT_LITERAL { PUSH (("[%d]", $1)); } |
196 | 218 | ||
197 | float_ti_expr_tail: | 219 | float_ti_expr_tail: |
@@ -206,46 +228,44 @@ set_ti_expr_tail: | @@ -206,46 +228,44 @@ set_ti_expr_tail: | ||
206 | //--------------------------------------------------------------------------- | 228 | //--------------------------------------------------------------------------- |
207 | 229 | ||
208 | exprs: | 230 | exprs: |
209 | - expr ',' exprs { AST ("T2:E2,T1:E1", ("(T1,T2):(E1,E2)")); } | ||
210 | - | expr | 231 | + expr ',' exprs { RCONS (); } |
232 | + | expr { AST ("E", ("[E]")); } | ||
211 | 233 | ||
212 | expr: | 234 | expr: |
213 | bool_literal | 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 | | set_literal | 239 | | set_literal |
218 | | array_literal | 240 | | array_literal |
219 | | array_access_expr | 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 | | IDENT '(' exprs ')' /* An annotation value with > 0 arguments. */ | 244 | | IDENT '(' exprs ')' /* An annotation value with > 0 arguments. */ |
223 | 245 | ||
224 | bool_literal: | 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 | set_literal: | 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 | | INT_LITERAL DOTDOT INT_LITERAL { int i; | 253 | | INT_LITERAL DOTDOT INT_LITERAL { int i; |
232 | PRE(); | 254 | PRE(); |
233 | - printf ("set(int):lit("); | 255 | + printf ("lit(["); |
234 | for (i=$1.ival; i<$3.ival; ++i) | 256 | for (i=$1.ival; i<$3.ival; ++i) |
235 | printf ("%d, ", i); | 257 | printf ("%d, ", i); |
236 | - printf ("%d)", $3.ival); | 258 | + printf ("%d], set(int))", $3.ival); |
237 | POST(); } | 259 | POST(); } |
238 | 260 | ||
239 | array_literal: | 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 | | UNDERSCORE_IDENT '[' INT_LITERAL ']' | 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 | // Annotations | 271 | // Annotations |
fzn-parser/fznslurp.pl
@@ -6,24 +6,54 @@ main :- | @@ -6,24 +6,54 @@ main :- | ||
6 | argument_list(A), | 6 | argument_list(A), |
7 | main(A). | 7 | main(A). |
8 | 8 | ||
9 | -main([load]) :- !, load_ast(AST), dump_ast(AST), halt. | ||
10 | -main([]) :- !. | 9 | +main([ACTION|REST]) :- action(ACTION), !, main(REST). |
10 | +main([]). | ||
11 | + | ||
12 | +action(load) :- !, load_ast(AST), g_assign(ast, AST). | ||
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). | ||
18 | +action(halt) :- !, halt. | ||
19 | +action(debug) :- g_read(ast_debug, true), !, g_assign(ast_debug, false). | ||
20 | +action(debug) :- !, g_assign(ast_debug, true). | ||
21 | +action(ACTION) :- format("%w: unknown action.\n", [ACTION]). | ||
11 | 22 | ||
12 | 23 | ||
13 | % ----------------------------------------------------------------------------- | 24 | % ----------------------------------------------------------------------------- |
14 | 25 | ||
15 | -load_ast(AST) :- load_ast(_>[], [], AST). | 26 | +%% beware: fails if load_ast/3 does not finish with 3rd arg singular list |
27 | + | ||
28 | +load_ast(AST) :- g_read(ast_debug, true), !, load_ast_deb(_>[], [], [AST]). | ||
29 | +load_ast(AST) :- load_ast(_>[], [], [AST]). | ||
16 | 30 | ||
17 | load_ast(end_of_file, AST, AST). | 31 | load_ast(end_of_file, AST, AST). |
18 | -load_ast(IN > INT, IN, OUT) :- g_read(ast_debug, true), read(OP), !, | ||
19 | - write(OP), nl, | ||
20 | - load_ast(OP, INT, OUT). | ||
21 | -load_ast(IN > INT, IN, OUT) :- read(OP), !, | ||
22 | - load_ast(OP, INT, OUT). | 32 | +load_ast((IN > INT :- MOD), IN, OUT) :- |
33 | + call(MOD), | ||
34 | + read(OP), !, | ||
35 | + load_ast(OP, INT, OUT). | ||
36 | +load_ast((IN > INT), IN, OUT) :- | ||
37 | + read(OP), !, | ||
38 | + load_ast(OP, INT, OUT). | ||
39 | + | ||
40 | +load_ast_deb(end_of_file, AST, AST). | ||
41 | +load_ast_deb((IN > INT :- MOD), IN, OUT) :- | ||
42 | + ( call(MOD) -> format("EXT OK ~q\n", [MOD]) ; | ||
43 | + format("EXT FAIL ~q\n", [MOD]), fail ), | ||
44 | + read(OP), !, | ||
45 | + writeq(IN), write('.'), nl, | ||
46 | + writeq(OP), nl, | ||
47 | + load_ast_deb(OP, INT, OUT). | ||
48 | +load_ast_deb(IN > INT, IN, OUT) :- | ||
49 | + read(OP), !, | ||
50 | + writeq(IN), write('.'), nl, | ||
51 | + writeq(OP), nl, | ||
52 | + load_ast_deb(OP, INT, OUT). | ||
23 | 53 | ||
24 | % ----------------------------------------------------------------------------- | 54 | % ----------------------------------------------------------------------------- |
25 | 55 | ||
26 | -dump_ast([fzn(PREDS, VARS, CONSTRS, SOLVE)]) :- | 56 | +dump_ast(fzn(PREDS, VARS, CONSTRS, SOLVE)) :- |
27 | !, | 57 | !, |
28 | format("AST:\n", []), | 58 | format("AST:\n", []), |
29 | format(" preds:\n", []), PREDS=preds(PS), dump_list(PS), | 59 | format(" preds:\n", []), PREDS=preds(PS), dump_list(PS), |
@@ -39,6 +69,3 @@ dump_list([]). | @@ -39,6 +69,3 @@ dump_list([]). | ||
39 | dump_list([I|Is]) :- format(" ~w\n", [I]), dump_list(Is). | 69 | dump_list([I|Is]) :- format(" ~w\n", [I]), dump_list(Is). |
40 | 70 | ||
41 | % ----------------------------------------------------------------------------- | 71 | % ----------------------------------------------------------------------------- |
42 | - | ||
43 | -slurp(FILE, AST) :- see(FILE), load_ast(AST), !, seen. | ||
44 | -slurp(_, end_of_file) :- seen. |
@@ -0,0 +1,42 @@ | @@ -0,0 +1,42 @@ | ||
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, ST), % predicates | ||
6 | + sa_n_traverse(IV, OV, ST), % variables | ||
7 | + sa_n_traverse(IC, OC, ST). % constraints | ||
8 | + | ||
9 | +% ----------------------------------------------------------------------------- | ||
10 | + | ||
11 | +sa_n_traverse([], [], _ST). | ||
12 | +sa_n_traverse([N|Ns], [NN|NNs], ST) :- | ||
13 | + sa_n(N, NN, ST), !, | ||
14 | + sa_n_traverse(Ns, NNs, ST). | ||
15 | +sa_n_traverse([_|Ns], NNs, ST) :- % ignore failing nodes (beware!) | ||
16 | + sa_n_traverse(Ns, NNs, ST). | ||
17 | + | ||
18 | + | ||
19 | +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
20 | +% | ||
21 | +% sa_n(AST_N_IN, AST_N_OUT, ST) | ||
22 | + | ||
23 | +sa_n(var(N,T,I,A), V, ST) :- | ||
24 | + sa_attribs(A, AX, ST), | ||
25 | + sa_n(I, NI, ST), % parse initializer | ||
26 | + V=var(N,T,NI,AX), % new AST node becomes ST entry value | ||
27 | + st_insert(ST, N, V). | ||
28 | + | ||
29 | + | ||
30 | +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
31 | + | ||
32 | +sa_attribs([A|As], [NA|NAs], ST) :- | ||
33 | + sa_attrib(A, NA, ST), !, | ||
34 | + sa_attribs(As, NAs, ST). | ||
35 | +sa_attribs([_|As], NAs, ST) :- % ignore unknown attributes | ||
36 | + sa_attribs(As, NAs, ST). | ||
37 | +sa_attribs([], [], _). | ||
38 | + | ||
39 | + | ||
40 | +sa_attrib(id(output_var), output, _). | ||
41 | + | ||
42 | +% ----------------------------------------------------------------------------- |
@@ -0,0 +1,13 @@ | @@ -0,0 +1,13 @@ | ||
1 | +% == No, Emacs this is -*-Prolog-*- code, not what you thought... ============= | ||
2 | + | ||
3 | +% -- Symbol table ------------------------------------------------------------- | ||
4 | +% | ||
5 | +% Open-ended model. | ||
6 | + | ||
7 | +st_lookup(ST, _, _) :- var(ST), !, fail. | ||
8 | +st_lookup([K=V|_], K, V). | ||
9 | +st_lookup([_|ST], K, V) :- st_lookup(ST, K, V). | ||
10 | + | ||
11 | +st_insert(ST, K, V) :- var(ST), !, ST=[K=V|_]. | ||
12 | +st_insert([K=_|_], K, _) :- !, throw(duplicate(K)). | ||
13 | +st_insert([_|ST], K, V) :- st_insert(ST, K, V). |