Compare View

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