Commit e1521486ddc0535875e98bc5e54cd1d5d4407641
1 parent
25cb655c
Exists in
master
continue to develop AST
Showing
2 changed files
with
30 additions
and
13 deletions
Show diff stats
fzn-parser/README
fzn-parser/flatzinc.y
... | ... | @@ -31,6 +31,16 @@ |
31 | 31 | printf ("_ -> %s.\n", x); \ |
32 | 32 | } |
33 | 33 | |
34 | +#define PRE() \ | |
35 | +{ \ | |
36 | + printf ("_T -> ["); \ | |
37 | +} | |
38 | + | |
39 | +#define POST() \ | |
40 | +{ \ | |
41 | + printf ("|_T].\n"); \ | |
42 | +} | |
43 | + | |
34 | 44 | #define PUSH(x) \ |
35 | 45 | { \ |
36 | 46 | printf ("_T -> ["); \ |
... | ... | @@ -201,29 +211,35 @@ set_ti_expr_tail: |
201 | 211 | //--------------------------------------------------------------------------- |
202 | 212 | |
203 | 213 | exprs: |
204 | - expr ',' exprs | |
214 | + expr ',' exprs { AST ("T2:E2,T1:E1", ("(T1,T2):(E1,E2)")); } | |
205 | 215 | | expr |
206 | 216 | |
207 | 217 | expr: |
208 | 218 | bool_literal |
209 | - | INT_LITERAL { PUSH (("lit(int, %d)", $1)); } | |
210 | - | FLOAT_LITERAL { PUSH (("lit(float, %g)", $1)); } | |
211 | - | STRING_LITERAL { PUSH (("lit(string, \"%s\")", $1)); } | |
219 | + | INT_LITERAL { PUSH (("int:lit(%d)", $1.ival)); } | |
220 | + | FLOAT_LITERAL { PUSH (("float:lit(%g)", $1.rval)); } | |
221 | + | STRING_LITERAL { PUSH (("string:lit(\"%s\")", $1.sval)); } | |
212 | 222 | | set_literal |
213 | 223 | | array_literal |
214 | 224 | | array_access_expr |
215 | - | IDENT { PUSH (("lit(float, %g)", $1)); } | |
216 | - | UNDERSCORE_IDENT | |
225 | + | IDENT { PUSH (("_:id(\"%s\")", $1)); } | |
226 | + | UNDERSCORE_IDENT { PUSH (("_:uid(\"%s\")", $1)); } | |
217 | 227 | | IDENT '(' exprs ')' /* An annotation value with > 0 arguments. */ |
218 | 228 | |
219 | 229 | bool_literal: |
220 | - FALSE { PUSH (("lit(bool, false)")); } | |
221 | - | TRUE { PUSH (("lit(bool, true)")); } | |
230 | + FALSE { PUSH (("bool:lit(false)")); } | |
231 | + | TRUE { PUSH (("bool:lit(true)")); } | |
222 | 232 | |
223 | 233 | set_literal: |
224 | - '{' exprs '}' { AST ("Es", ("lit(set(_), Es)")); } | |
225 | - | '{' '}' { PUSH (("lit(set(_), [])")); } | |
226 | - | INT_LITERAL DOTDOT INT_LITERAL { PUSH (("lit(set(%d, %d)", $1, $3)); } | |
234 | + '{' exprs '}' { AST ("Ts:Es", ("set(Ts):lit(Es)")); } | |
235 | + | '{' '}' { PUSH (("set(_):lit([])")); } | |
236 | + | INT_LITERAL DOTDOT INT_LITERAL { int i; | |
237 | + PRE(); | |
238 | + printf ("set(int):lit("); | |
239 | + for (i=$1.ival; i<$3.ival; ++i) | |
240 | + printf ("%d, ", i); | |
241 | + printf ("%d)", $3.ival); | |
242 | + POST(); } | |
227 | 243 | |
228 | 244 | array_literal: |
229 | 245 | '[' exprs ']' { AST ("Es", ("alit(Es)")); } | ... | ... |