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,6 +31,16 @@ | ||
| 31 | printf ("_ -> %s.\n", x); \ | 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 | #define PUSH(x) \ | 44 | #define PUSH(x) \ |
| 35 | { \ | 45 | { \ |
| 36 | printf ("_T -> ["); \ | 46 | printf ("_T -> ["); \ |
| @@ -201,29 +211,35 @@ set_ti_expr_tail: | @@ -201,29 +211,35 @@ set_ti_expr_tail: | ||
| 201 | //--------------------------------------------------------------------------- | 211 | //--------------------------------------------------------------------------- |
| 202 | 212 | ||
| 203 | exprs: | 213 | exprs: |
| 204 | - expr ',' exprs | 214 | + expr ',' exprs { AST ("T2:E2,T1:E1", ("(T1,T2):(E1,E2)")); } |
| 205 | | expr | 215 | | expr |
| 206 | 216 | ||
| 207 | expr: | 217 | expr: |
| 208 | bool_literal | 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 | | set_literal | 222 | | set_literal |
| 213 | | array_literal | 223 | | array_literal |
| 214 | | array_access_expr | 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 | | IDENT '(' exprs ')' /* An annotation value with > 0 arguments. */ | 227 | | IDENT '(' exprs ')' /* An annotation value with > 0 arguments. */ |
| 218 | 228 | ||
| 219 | bool_literal: | 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 | set_literal: | 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 | array_literal: | 244 | array_literal: |
| 229 | '[' exprs ']' { AST ("Es", ("alit(Es)")); } | 245 | '[' exprs ']' { AST ("Es", ("alit(Es)")); } |