%{ #include "syntree.hpp" #include "funct.hpp" #include #include #include #include using namespace std; extern int yylex(); #define YYDEBUG 1 void yyerror(char* s) { cerr<* stringvec_a; vector* syntreevec_a; }; %token PRINT FUNCTION %nonassoc '?' ':' %left EQ %left '+' '-' %left '*' '/' %type code expr statement %token ID %token NUM %type fun_args id_list %type call_args expr_list %% program : program function | ; function : // Funkcija sa povratnom vrednoscu FUNCTION ID '=' ID fun_args '{' code '}' { // Kreiramo novu funkciju sa datim imenom, argumentima, rezultatom i telom Funct* f = new Funct(*$4, *$5, *$2, $7); f->Codegen(); delete $2; delete $4; delete $5; } | // Funkcija bez povratne vrednosti FUNCTION ID fun_args '{' code '}' { // Kreiramo novu funkciju sa datim imenom, argumentima i telom Funct* f = new Funct(*$2, *$3, "", $5); f->Codegen(); delete $2; delete $3; } ; fun_args : '(' id_list ')' { $$ = $2; } | '(' ')' { $$ = new vector(); } ; id_list : id_list ',' ID { $$ = $1; $$->push_back(*$3); delete $3; } | ID { $$ = new vector (); $$->push_back(*$1); delete $1; } ; code : code statement { $$ = new SequenceNode($1, $2); } | statement { $$ = $1; } ; statement : ID '=' expr ';' { $$ = new AssignmentNode(*$1, $3); delete $1; } | PRINT '(' expr ')' ';' { $$ = new PrintNode($3); } | expr ';' { $$ = $1; } ; expr : expr '+' expr { $$ = new PlusNode($1, $3); } | expr '-' expr { $$ = new MinusNode($1, $3); } | expr '*' expr { $$ = new TimesNode($1, $3); } | expr '/' expr { $$ = new DivideNode($1, $3); } | '(' expr ')' { $$ = $2; } | expr '?' expr ':' expr { $$ = new QuestionNode($1, $3, $5); } | expr EQ expr { $$ = new EqNode($1, $3); } // Poziv funkcije | ID call_args { $$ = new FunctCallNode(*$1, *$2); delete $1; delete $2; } | ID { $$ = new VariableNode(*$1); delete $1; } | NUM { $$ = new ConstantNode($1); } ; call_args : '(' ')' { $$ = new vector(); } | '(' expr_list ')' { $$ = $2; } ; expr_list : expr_list ',' expr { $$ = $1; $$->push_back($3); } | expr { $$ = new vector(); $$->push_back($1); } ; %% int main(int argc, char **argv) { yydebug = 0; try { initializeModuleAndPassManager(); // Parsiramo ulaznu datoteku yyparse(); // Pozivamo funkciju main bez argumenata if (argc == 1) { cout << "Interpretacija" << endl; vector empty; Funct::Call("main", empty); } else if ((argc == 2) && (argv[1] == string("-c"))) { //cout << "Kompilacija" << endl; //theModule->dump(); theModule->print(outs(), nullptr); } else { throw string("usage: ") + argv[0] + string(" [-c]"); } // Uklanjamo sve definisane funkcije Funct::DeleteFuncts(); delete theModule; delete theFPM; } catch(char* s) { cerr<