Compare View

switch
from
...
to
 
Commits (7)
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 + 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.  
fzn-parser/semantic.pl 0 → 100644
@@ -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 +% -----------------------------------------------------------------------------
fzn-parser/stable.pl 0 → 100644
@@ -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).
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)).