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)")); } | ... | ... |