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