4
#include "Expressions.h"
5
using namespace PetriEngine::PQL;
7
AssignmentExpression* assignment;
9
void pqlaerror(const char *s) {printf("ERROR: %s\n", s);}
15
/* Possible data representation */
17
PetriEngine::PQL::Expr* expr;
18
PetriEngine::PQL::AssignmentExpression* assExpr;
23
/* Terminal type definition */
24
%token <string> ID INT
25
%token <token> LPAREN RPAREN ASSIGN SEMI
26
%token <token> AND OR NOT
27
%token <token> EQUAL NEQUAL LESS LESSEQUAL GREATER GREATEREQUAL
28
%token <token> PLUS MINUS MULTIPLY
30
/* Nonterminal type definition */
31
%type <expr> expr term factor
32
%type <assExpr> assignment
34
/* Operator precedence, more possibly coming */
40
root : assignment { assignment = (AssignmentExpression*)$1; }
41
| error { assignment = NULL; yyerrok; }
44
assignment : ID ASSIGN expr SEMI assignment { ((AssignmentExpression*)$5)->prepend(*$1, $3); delete $1;
45
$$ = ((AssignmentExpression*)$5)}
46
| ID ASSIGN expr SEMI { AssignmentExpression* a = new AssignmentExpression();
47
a->prepend(*$1, $3); delete $1;
49
| ID ASSIGN expr { AssignmentExpression* a = new AssignmentExpression();
50
a->prepend(*$1, $3); delete $1;
54
expr : expr PLUS term { $$ = new PlusExpr($1, $3); }
55
| expr MINUS term { $$ = new SubtractExpr($1, $3); }
56
| MINUS expr { $$ = new MinusExpr($2); }
60
term : term MULTIPLY factor { $$ = new MultiplyExpr($1, $3); }
64
factor : LPAREN expr RPAREN { $$ = $2; }
65
| INT { $$ = new LiteralExpr(atol($1->c_str())); delete $1; }
66
| ID { $$ = new IdentifierExpr(*$1, @1.first_column); delete $1; }