%{ #include #include #include #include "syn_tree.hpp" #include #define YYDEBUG 1 using namespace std; int yylex(); void yyerror(string s) { cerr << s << endl; exit(EXIT_FAILURE); } map tablica; %} %union { int i; string *s; SynTree *t; vector *v; vector *v1; } %token print_token function_token eq_token %token id_token %token num_token %type E Naredba Program %type Niz NizEova ArgumentiPoziva %type ImenaPromenljivih Argumenti %right '?' ':' %left '<' '>' eq_token %left '+' '-' %left '*' '/' %% Program: Program DefinicijaFunkcije { } | DefinicijaFunkcije { } ; DefinicijaFunkcije: function_token id_token '=' id_token Argumenti '{' Niz '}' { map::iterator tmp = tablica.find(*$4); if (tmp != tablica.end()) yyerror("Nije dozvoljena redefinicija fje " + *$4); tablica[*$4] = new Fja(*$2, *$5, new Seq(*$7)); delete $2; delete $4; delete $5; delete $7; } | function_token id_token Argumenti '{' Niz '}' { map::iterator tmp = tablica.find(*$2); if (tmp != tablica.end()) yyerror("Nije dozvoljena redefinicija fje " + *$2); tablica[*$2] = new Fja("", *$3, new Seq(*$5)); delete $2; delete $3; delete $5; } ; Argumenti: '(' ')' { $$ = new vector(); } | '(' ImenaPromenljivih ')' { $$ = $2; } ; ImenaPromenljivih: ImenaPromenljivih ',' id_token { $$ = $1; $$->push_back(*$3); delete $3; } | id_token { $$ = new vector(); $$->push_back(*$1); delete $1; } ; Niz: Niz Naredba ';' { $$ = $1; $$->push_back($2); } | { $$ = new vector(); } ; Naredba: id_token '=' E { $$ = new Assign(new Variable(*$1), $3); delete $1; } | print_token E { $$ = new Print($2); } | E { $$ = $1; } ; E: E '+' E { $$ = new Add($1, $3); } | E '-' E { $$ = new Sub($1, $3); } | E '*' E { $$ = new Mul($1, $3); } | E '/' E { $$ = new Div($1, $3); } | E '<' E { $$ = new Less($1, $3); } | E '>' E { $$ = new Greater($1, $3); } | E eq_token E { $$ = new Eq($1, $3); } | '(' E ')' { $$ = $2; } | num_token { $$ = new Constant($1); } | id_token { $$ = new Variable(*$1); delete $1; } | id_token ArgumentiPoziva { $$ = new PozivFje(*$1, *$2); delete $1; delete $2; } | E '?' E ':' E { $$ = new Upitnik($1, $3, $5); } ; ArgumentiPoziva: '(' ')' { $$ = new vector(); } | '(' NizEova ')' { $$ = $2; } ; NizEova: NizEova ',' E { $$ = $1; $$->push_back($3); } | E { $$ = new vector(); $$->push_back($1); } ; %% int main() { //yydebug = 1; yyparse(); map::iterator tmp = tablica.find("main"); if (tmp == tablica.end()) yyerror("Fja main() nije definisana"); vector empty; try { tmp->second->pozovi(empty); } catch (const char* s) { yyerror(s); } for (map::iterator i = tablica.begin(); i != tablica.end(); i++) delete i->second; return 0; }