From e1521486ddc0535875e98bc5e54cd1d5d4407641 Mon Sep 17 00:00:00 2001 From: Salvador Abreu Date: Thu, 18 Jun 2015 10:11:40 +0900 Subject: [PATCH] continue to develop AST --- fzn-parser/README | 5 +++-- fzn-parser/flatzinc.y | 38 +++++++++++++++++++++++++++----------- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/fzn-parser/README b/fzn-parser/README index 5a0170e..555c362 100644 --- a/fzn-parser/README +++ b/fzn-parser/README @@ -1,5 +1,6 @@ AST nodes for fzn parser -lit(TYPE, VALUE) +TYPE : VALUE + +acceptable types: -TYPE = bool diff --git a/fzn-parser/flatzinc.y b/fzn-parser/flatzinc.y index 755508c..8aeaea7 100644 --- a/fzn-parser/flatzinc.y +++ b/fzn-parser/flatzinc.y @@ -31,6 +31,16 @@ printf ("_ -> %s.\n", x); \ } +#define PRE() \ +{ \ + printf ("_T -> ["); \ +} + +#define POST() \ +{ \ + printf ("|_T].\n"); \ +} + #define PUSH(x) \ { \ printf ("_T -> ["); \ @@ -201,29 +211,35 @@ set_ti_expr_tail: //--------------------------------------------------------------------------- exprs: - expr ',' exprs + expr ',' exprs { AST ("T2:E2,T1:E1", ("(T1,T2):(E1,E2)")); } | expr expr: bool_literal - | INT_LITERAL { PUSH (("lit(int, %d)", $1)); } - | FLOAT_LITERAL { PUSH (("lit(float, %g)", $1)); } - | STRING_LITERAL { PUSH (("lit(string, \"%s\")", $1)); } + | INT_LITERAL { PUSH (("int:lit(%d)", $1.ival)); } + | FLOAT_LITERAL { PUSH (("float:lit(%g)", $1.rval)); } + | STRING_LITERAL { PUSH (("string:lit(\"%s\")", $1.sval)); } | set_literal | array_literal | array_access_expr - | IDENT { PUSH (("lit(float, %g)", $1)); } - | UNDERSCORE_IDENT + | IDENT { PUSH (("_:id(\"%s\")", $1)); } + | UNDERSCORE_IDENT { PUSH (("_:uid(\"%s\")", $1)); } | IDENT '(' exprs ')' /* An annotation value with > 0 arguments. */ bool_literal: - FALSE { PUSH (("lit(bool, false)")); } - | TRUE { PUSH (("lit(bool, true)")); } + FALSE { PUSH (("bool:lit(false)")); } + | TRUE { PUSH (("bool:lit(true)")); } set_literal: - '{' exprs '}' { AST ("Es", ("lit(set(_), Es)")); } - | '{' '}' { PUSH (("lit(set(_), [])")); } - | INT_LITERAL DOTDOT INT_LITERAL { PUSH (("lit(set(%d, %d)", $1, $3)); } + '{' exprs '}' { AST ("Ts:Es", ("set(Ts):lit(Es)")); } + | '{' '}' { PUSH (("set(_):lit([])")); } + | INT_LITERAL DOTDOT INT_LITERAL { int i; + PRE(); + printf ("set(int):lit("); + for (i=$1.ival; i<$3.ival; ++i) + printf ("%d, ", i); + printf ("%d)", $3.ival); + POST(); } array_literal: '[' exprs ']' { AST ("Es", ("alit(Es)")); } -- libgit2 0.21.2