Compare View
Commits (2)
Showing
2 changed files
Show diff stats
fzn-parser/flatzinc.y
@@ -54,9 +54,6 @@ | @@ -54,9 +54,6 @@ | ||
54 | // push the empty list | 54 | // push the empty list |
55 | #define NIL() PUSH (("[]")) | 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,6 +84,7 @@ model : { INIT ("[]"); } | ||
87 | var_decl_items { AST ("X", ("vars(X)")); } | 84 | var_decl_items { AST ("X", ("vars(X)")); } |
88 | constraint_items { AST ("X", ("constrs(X)")); } | 85 | constraint_items { AST ("X", ("constrs(X)")); } |
89 | model_end | 86 | model_end |
87 | + { AST ("S,C,V,P", ("fzn(P, V, C, S)")); } | ||
90 | 88 | ||
91 | pred_decl_items : pred_decl_items pred_decl_item ';' { CONS (); } | 89 | pred_decl_items : pred_decl_items pred_decl_item ';' { CONS (); } |
92 | | pred_decl_items error ';' { yyerrok; } | 90 | | pred_decl_items error ';' { yyerrok; } |
@@ -139,8 +137,8 @@ constraint_item: /* -> [ constraint(...) | ] */ | @@ -139,8 +137,8 @@ constraint_item: /* -> [ constraint(...) | ] */ | ||
139 | constraint_elem: /* -> [ CONSTR_ID, EXPRLIST | _ ] */ | 137 | constraint_elem: /* -> [ CONSTR_ID, EXPRLIST | _ ] */ |
140 | IDENT '(' exprs ')' { PUSH (("'%s'", $1)); } | 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 | solve_kind: | 143 | solve_kind: |
146 | SATISFY { PUSH (("satisfy")); } | 144 | SATISFY { PUSH (("satisfy")); } |
@@ -163,7 +161,7 @@ pred_decl_arg: | @@ -163,7 +161,7 @@ pred_decl_arg: | ||
163 | | ARRAY '[' pred_arg_array_index ']' OF pred_arg_array_tail ':' IDENT | 161 | | ARRAY '[' pred_arg_array_index ']' OF pred_arg_array_tail ':' IDENT |
164 | { AST ("T,U,L", ("var(array(T,L,U)):'%s'", $8)); } | 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 | INT { PUSH (("_,1")); } | 165 | INT { PUSH (("_,1")); } |
168 | | INT_LITERAL DOTDOT INT_LITERAL { PUSH (("%d,%d", $3, $1)); } | 166 | | INT_LITERAL DOTDOT INT_LITERAL { PUSH (("%d,%d", $3, $1)); } |
169 | 167 | ||
@@ -265,20 +263,24 @@ char* filename; | @@ -265,20 +263,24 @@ char* filename; | ||
265 | 263 | ||
266 | int main(int argc, char *argv[]) | 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 | filename = argv[1]; | 270 | filename = argv[1]; |
274 | yyin = fopen(filename, "r"); | 271 | yyin = fopen(filename, "r"); |
275 | if (yyin == NULL) { | 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 | int yyerror(char *s) | 286 | int yyerror(char *s) |
fzn-parser/fznslurp.pl
1 | % == No, Emacs this is -*-Prolog-*- code, not what you thought... ============= | 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 | load_ast(AST) :- load_ast(_>[], [], AST). | 15 | load_ast(AST) :- load_ast(_>[], [], AST). |
4 | 16 | ||
5 | load_ast(end_of_file, AST, AST). | 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 | load_ast(IN > INT, IN, OUT) :- read(OP), !, | 21 | load_ast(IN > INT, IN, OUT) :- read(OP), !, |
7 | - ( g_read(ast_debug, true) -> | ||
8 | - write(OP), nl | ||
9 | - ; true ), | ||
10 | load_ast(OP, INT, OUT). | 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 | slurp(FILE, AST) :- see(FILE), load_ast(AST), !, seen. | 43 | slurp(FILE, AST) :- see(FILE), load_ast(AST), !, seen. |
13 | slurp(_, end_of_file) :- seen. | 44 | slurp(_, end_of_file) :- seen. |