Commit e1521486ddc0535875e98bc5e54cd1d5d4407641

Authored by Salvador Abreu
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
1 AST nodes for fzn parser 1 AST nodes for fzn parser
2 2
3 -lit(TYPE, VALUE) 3 +TYPE : VALUE
  4 +
  5 +acceptable types:
4 6
5 -TYPE = bool  
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)")); }