Commit 0b83a7f154dd462300bec448089541d0b1b6521a

Authored by Salvador Abreu
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.
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/TODO 0 → 100644
@@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
  1 +- define AST syntax
  2 +- define type system
  3 +-
0 \ No newline at end of file 4 \ No newline at end of file
fzn-parser/examples/aust.ast
@@ -3,69 +3,69 @@ _T &gt; [[]|_T]. @@ -3,69 +3,69 @@ _T &gt; [[]|_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 &gt; [_:id(&#39;nt&#39;)|_T]. @@ -77,8 +77,9 @@ _T &gt; [_:id(&#39;nt&#39;)|_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 &gt; [_:id(&#39;sa&#39;)|_T]. @@ -88,8 +89,9 @@ _T &gt; [_:id(&#39;sa&#39;)|_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 &gt; [_:id(&#39;sa&#39;)|_T]. @@ -99,8 +101,9 @@ _T &gt; [_:id(&#39;sa&#39;)|_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 &gt; [_:id(&#39;q&#39;)|_T]. @@ -110,8 +113,9 @@ _T &gt; [_:id(&#39;q&#39;)|_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 &gt; [_:id(&#39;q&#39;)|_T]. @@ -121,8 +125,9 @@ _T &gt; [_:id(&#39;q&#39;)|_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 &gt; [_:id(&#39;nsw&#39;)|_T]. @@ -132,8 +137,9 @@ _T &gt; [_:id(&#39;nsw&#39;)|_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 &gt; [_:id(&#39;v&#39;)|_T]. @@ -143,8 +149,9 @@ _T &gt; [_:id(&#39;v&#39;)|_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 &gt; [_:id(&#39;nsw&#39;)|_T]. @@ -154,8 +161,9 @@ _T &gt; [_:id(&#39;nsw&#39;)|_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 &gt; [_:id(&#39;v&#39;)|_T]. @@ -165,8 +173,12 @@ _T &gt; [_:id(&#39;v&#39;)|_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 &gt; [[]|_T]. @@ -3,46 +3,69 @@ _T &gt; [[]|_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: /* -&gt; [ ANNOT,ID | _ ] */ @@ -132,10 +154,10 @@ ident_anns: /* -&gt; [ 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 + exprs ',' exprs { CONS (); }
  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
@@ -11,9 +11,13 @@ main([]). @@ -11,9 +11,13 @@ main([]).
11 11
12 action(load) :- !, load_ast(AST), g_assign(ast, AST). 12 action(load) :- !, load_ast(AST), g_assign(ast, AST).
13 action(dump) :- !, g_read(ast, AST), dump_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).
14 action(halt) :- !, halt. 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 action(ACTION) :- format("%w: unknown action.\n", [ACTION]). 21 action(ACTION) :- format("%w: unknown action.\n", [ACTION]).
18 22
19 23
@@ -35,7 +39,8 @@ load_ast((IN &gt; INT), IN, OUT) :- @@ -35,7 +39,8 @@ load_ast((IN &gt; INT), IN, OUT) :-
35 39
36 load_ast_deb(end_of_file, AST, AST). 40 load_ast_deb(end_of_file, AST, AST).
37 load_ast_deb(IN > INT, IN, OUT) :- read(OP), !, 41 load_ast_deb(IN > INT, IN, OUT) :- read(OP), !,
38 - write(OP), nl, 42 + writeq(IN), write('.'), nl,
  43 + writeq(OP), nl,
39 load_ast_deb(OP, INT, OUT). 44 load_ast_deb(OP, INT, OUT).
40 45
41 % ----------------------------------------------------------------------------- 46 % -----------------------------------------------------------------------------
fzn-parser/semantic.pl 0 → 100644
@@ -0,0 +1,32 @@ @@ -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 +% -----------------------------------------------------------------------------
fzn-parser/stable.pl 0 → 100644
@@ -0,0 +1,10 @@ @@ -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).
fzn-parser/types.pl 0 → 100644
@@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
  1 +% == No, Emacs this is -*-Prolog-*- code, not what you thought... =============
  2 +
  3 +% sa_type/2 - locate the TYPE field
  4 +
  5 +sa_type(var(_NAME,TYPE,_INIT,_ANNOT), TYPE).
  6 +sa_type(constraint(_NAME)).