Compare View

switch
from
...
to
 
Commits (7)
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/TODO 0 → 100644
... ... @@ -0,0 +1,3 @@
  1 +- define AST syntax
  2 +- define type system
  3 +-
0 4 \ No newline at end of file
... ...
fzn-parser/examples/aust.ast
... ... @@ -3,69 +3,69 @@ _T &gt; [[]|_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 &gt; [_:id(&#39;nt&#39;)|_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 &gt; [_:id(&#39;sa&#39;)|_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 &gt; [_:id(&#39;sa&#39;)|_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 &gt; [_:id(&#39;q&#39;)|_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 &gt; [_:id(&#39;q&#39;)|_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 &gt; [_:id(&#39;nsw&#39;)|_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 &gt; [_:id(&#39;v&#39;)|_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 &gt; [_:id(&#39;nsw&#39;)|_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 &gt; [_:id(&#39;v&#39;)|_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 &gt; [[]|_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: /* -&gt; [ 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 + expr ',' exprs { RCONS (); }
  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
... ... @@ -6,24 +6,54 @@ main :-
6 6 argument_list(A),
7 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 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 58 format("AST:\n", []),
29 59 format(" preds:\n", []), PREDS=preds(PS), dump_list(PS),
... ... @@ -39,6 +69,3 @@ dump_list([]).
39 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 @@
  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 @@
  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 @@
  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)).
... ...