%{ #include #include #include #define YYDEBUG 1 #include "syntree.hpp" using namespace std; void yyerror(string s) { cerr << s << endl; exit(EXIT_FAILURE); } int yylex(); %} %token begin_token end_token print_token while_token do_token if_token else_token then_token %token id_token %token num_token %type Expr Statements Statement %nonassoc then_token %nonassoc else_token %left '<' %left '+' %left '*' %union { string *s; int x; Syntree *t; } %% Program: begin_token Statements end_token '.' { $2->compile(); delete $2; } ; Statements: Statements ';' Statement { $$ = new Seq((InnerNode*)$1, $3); } | Statement { $$ = $1; } ; Statement: print_token Expr { $$ = new Print($2); } | id_token ':' '=' Expr { $$ = new Assign(new Variable(*$1), $4); delete $1; } | while_token Expr do_token Statement { $$ = new While($2, $4); } | begin_token Statements end_token { $$ = $2; } | if_token Expr then_token Statement else_token Statement { $$ = new IfThenElse($2, $4, $6); } | if_token Expr then_token Statement { $$ = new IfThen($2, $4); } | { $$ = new Empty(); } ; Expr: Expr '+' Expr { $$ = new Add($1, $3); } | Expr '*' Expr { $$ = new Mul($1, $3); } | Expr '<' Expr { $$ = new Lt($1, $3); } | '(' Expr ')' { $$ = $2; } | num_token { $$ = new Constant($1); } | id_token { $$ = new Variable(*$1); delete $1; } ; %% int main() { //yydebug = 1; yyparse(); return 0; }