Compare View

switch
from
...
to
 
Commits (2)
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.