Compare View
Commits (2)
Showing
2 changed files
Show diff stats
fzn-parser/flatzinc.y
... | ... | @@ -54,9 +54,6 @@ |
54 | 54 | // push the empty list |
55 | 55 | #define NIL() PUSH (("[]")) |
56 | 56 | |
57 | -#define BINARY(op) AST ("B,A", ("op(A,B)")) | |
58 | -#define UNARY(op) AST ("X", ("op(X)")) | |
59 | - | |
60 | 57 | %} |
61 | 58 | |
62 | 59 | |
... | ... | @@ -87,6 +84,7 @@ model : { INIT ("[]"); } |
87 | 84 | var_decl_items { AST ("X", ("vars(X)")); } |
88 | 85 | constraint_items { AST ("X", ("constrs(X)")); } |
89 | 86 | model_end |
87 | + { AST ("S,C,V,P", ("fzn(P, V, C, S)")); } | |
90 | 88 | |
91 | 89 | pred_decl_items : pred_decl_items pred_decl_item ';' { CONS (); } |
92 | 90 | | pred_decl_items error ';' { yyerrok; } |
... | ... | @@ -139,8 +137,8 @@ constraint_item: /* -> [ constraint(...) | ] */ |
139 | 137 | constraint_elem: /* -> [ CONSTR_ID, EXPRLIST | _ ] */ |
140 | 138 | IDENT '(' exprs ')' { PUSH (("'%s'", $1)); } |
141 | 139 | |
142 | -solve_item: | |
143 | - SOLVE annotations solve_kind | |
140 | +solve_item: /* -> [ solve(S,A) | _ ] */ | |
141 | + SOLVE annotations solve_kind { AST ("S,A", ("solve(S, A)")); } | |
144 | 142 | |
145 | 143 | solve_kind: |
146 | 144 | SATISFY { PUSH (("satisfy")); } |
... | ... | @@ -163,7 +161,7 @@ pred_decl_arg: |
163 | 161 | | ARRAY '[' pred_arg_array_index ']' OF pred_arg_array_tail ':' IDENT |
164 | 162 | { AST ("T,U,L", ("var(array(T,L,U)):'%s'", $8)); } |
165 | 163 | |
166 | -pred_arg_array_index: | |
164 | +pred_arg_array_index: /* -> [ UB, LB | _ ] */ | |
167 | 165 | INT { PUSH (("_,1")); } |
168 | 166 | | INT_LITERAL DOTDOT INT_LITERAL { PUSH (("%d,%d", $3, $1)); } |
169 | 167 | |
... | ... | @@ -265,20 +263,24 @@ char* filename; |
265 | 263 | |
266 | 264 | int main(int argc, char *argv[]) |
267 | 265 | { |
268 | - if (argc != 2) { | |
269 | - fprintf(stderr, "Usage: %s <file.fzn>\n", argv[0]); | |
270 | - exit(1); | |
271 | - } | |
272 | - | |
266 | + if (argc == 1) { | |
267 | + yyin = stdin; | |
268 | + } | |
269 | + else if (argc == 2) { | |
273 | 270 | filename = argv[1]; |
274 | 271 | yyin = fopen(filename, "r"); |
275 | 272 | if (yyin == NULL) { |
276 | - fprintf(stderr, "cannot open file: '%s'\n", filename); | |
277 | - exit(1); | |
273 | + fprintf(stderr, "cannot open file: '%s'\n", filename); | |
274 | + exit(1); | |
278 | 275 | } |
279 | - | |
280 | - yyparse(); | |
281 | - return 0; | |
276 | + } | |
277 | + else { | |
278 | + fprintf(stderr, "Usage: %s [FILE.fzn]\n", argv[0]); | |
279 | + exit(1); | |
280 | + } | |
281 | + | |
282 | + yyparse(); | |
283 | + return 0; | |
282 | 284 | } |
283 | 285 | |
284 | 286 | int yyerror(char *s) | ... | ... |
fzn-parser/fznslurp.pl
1 | 1 | % == No, Emacs this is -*-Prolog-*- code, not what you thought... ============= |
2 | 2 | |
3 | +:- initialization(main). | |
4 | + | |
5 | +main :- | |
6 | + argument_list(A), | |
7 | + main(A). | |
8 | + | |
9 | +main([load]) :- !, load_ast(AST), dump_ast(AST), halt. | |
10 | +main([]) :- !. | |
11 | + | |
12 | + | |
13 | +% ----------------------------------------------------------------------------- | |
14 | + | |
3 | 15 | load_ast(AST) :- load_ast(_>[], [], AST). |
4 | 16 | |
5 | 17 | 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). | |
6 | 21 | load_ast(IN > INT, IN, OUT) :- read(OP), !, |
7 | - ( g_read(ast_debug, true) -> | |
8 | - write(OP), nl | |
9 | - ; true ), | |
10 | 22 | load_ast(OP, INT, OUT). |
11 | 23 | |
24 | +% ----------------------------------------------------------------------------- | |
25 | + | |
26 | +dump_ast([fzn(PREDS, VARS, CONSTRS, SOLVE)]) :- | |
27 | + !, | |
28 | + format("AST:\n", []), | |
29 | + format(" preds:\n", []), PREDS=preds(PS), dump_list(PS), | |
30 | + format(" vars:\n", []), VARS=vars(VS), dump_list(VS), | |
31 | + format(" constrs:\n", []), CONSTRS=constrs(CS), dump_list(CS), | |
32 | + format(" goal:\n ~w\n", [SOLVE]). | |
33 | + | |
34 | +dump_ast(AST) :- write(AST), nl. | |
35 | + | |
36 | +% ----------------------------------------------------------------------------- | |
37 | + | |
38 | +dump_list([]). | |
39 | +dump_list([I|Is]) :- format(" ~w\n", [I]), dump_list(Is). | |
40 | + | |
41 | +% ----------------------------------------------------------------------------- | |
42 | + | |
12 | 43 | slurp(FILE, AST) :- see(FILE), load_ast(AST), !, seen. |
13 | 44 | slurp(_, end_of_file) :- seen. | ... | ... |