%{ #include #include #include #include "syn_tree.hpp" #include #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 Argumenti1 Argumenti %type Args1 Args %right '?' ':' %left '<' '>' eq_token %left '+' '-' %left '*' '/' %% Program: Program DefFunkcije { } | DefFunkcije { } ; DefFunkcije: function_token id_token Args '{' Niz '}' { map::iterator tmp = tablica.find(*$2); if (tmp != tablica.end()) yyerror("Fja " + *$2 + " je vec definisana"); tablica[*$2] = new Fja("", *$3, new Seq(*$5)); delete $2; delete $3; delete $5; } | function_token id_token '=' id_token Args '{' Niz '}' { map::iterator tmp = tablica.find(*$4); if (tmp != tablica.end()) yyerror("Fja " + *$4 + " je vec definisana"); tablica[*$4] = new Fja(*$2, *$5, new Seq(*$7)); delete $2; delete $4; delete $5; delete $7; } ; Args: '(' ')' { $$ = new vector(); } | '(' Args1 ')' { $$ = $2; } ; Args1: Args1 ',' 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 Argumenti { $$ = new PozivFje(*$1, *$2); delete $1; delete $2; } | E '?' E ':' E { $$ = new Upitnik($1, $3, $5); } ; Argumenti: '(' ')' { $$ = new vector(); } | '(' Argumenti1 ')' { $$ = $2; } ; Argumenti1: Argumenti1 ',' 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("Ne postoji main() fja"); vector empty; tmp->second->pozovi(empty); for (map::iterator tmp = tablica.begin(); tmp != tablica.end(); tmp++) delete tmp->second; return 0; }