%{ #include #include #include #include #include "ast.hpp" #define YYDEBUG 1 using namespace std; void yyerror(string s) { cerr << s << endl; exit(EXIT_FAILURE); } int yylex(); unique_ptr theJIT; extern unique_ptr theModule; extern map functionProtos; extern "C" double putchard(double x) { return putchar((int)x); } extern "C" double printd(double x) { cout << x << endl; return 0; } %} %token def_token extern_token if_token then_token else_token for_token in_token var_token %token id_token %token num_token %left ':' %right '=' %nonassoc else_token in_token %left '<' %left '+' '-' %left '*' %union { ExprAST *e; vector *v; double d; string *s; vector *v1; PrototypeAST* p; vector< pair > *v2; pair *p1; } %type Izraz Korak %type Izrazi %type Argumenti %type

Potpis %type ListaDodela %type Dodela %% Program: Program ';' Naredba | Naredba ; Naredba: def_token Potpis Izraz { /* definicija funkcije */ auto f = new FunctionAST(*$2, $3); auto tmp = f->codegen(); tmp->dump(); delete $2; delete f; } | extern_token Potpis { /* deklaracija eksterne funkcije */ functionProtos.insert(pair($2->getName() , *$2)); auto tmp = $2->codegen(); tmp->dump(); delete $2; } | Izraz { /* Izraz na globalnom nivou, i njegovo izvrsavanje */ PrototypeAST p("__anon_expr", vector()); FunctionAST *f = new FunctionAST(p, $1); auto tmp = f->codegen(); if (tmp) { tmp->dump(); theJIT->addModule(move(theModule)); initializeModuleAndPassManager(); auto s = theJIT->findSymbol("__anon_expr"); double (*FP)() = (double (*)())s.getAddress(); double value = FP(); cout << endl << "Vrednost izraza je " << value << endl; } delete f; } | ; Potpis: id_token '(' Argumenti ')' { $$ = new PrototypeAST(*$1, *$3); delete $1; delete $3; } ; Argumenti: Argumenti id_token { $$ = $1; $$->push_back(*$2); delete $2; } | { $$ = new vector(); } ; Izraz: Izraz '+' Izraz { $$ = new BinaryExprAST('+', $1, $3); } | Izraz '*' Izraz { $$ = new BinaryExprAST('*', $1, $3); } | Izraz '-' Izraz { $$ = new BinaryExprAST('-', $1, $3); } | Izraz '<' Izraz { $$ = new BinaryExprAST('<', $1, $3); } | id_token { $$ = new VariableExprAST(*$1); delete $1; } | id_token '(' Izrazi ')' { $$ = new CallExprAST(*$1, *$3); delete $1; delete $3; } | num_token { $$ = new NumberExprAST($1); } | '(' Izraz ')' { $$ = $2; } | if_token Izraz then_token Izraz else_token Izraz { $$ = new IfExprAST($2, $4, $6); } | for_token id_token '=' Izraz ',' Izraz Korak in_token Izraz { $$ = new ForExprAST(*$2, $4, $6, $7, $9); delete $2; } | Izraz ':' Izraz { $$ = new BinaryExprAST(':', $1, $3); } | id_token '=' Izraz { $$ = new BinaryExprAST('=', new VariableExprAST(*$1), $3); delete $1; } | var_token ListaDodela in_token Izraz { $$ = new VarExprAST(*$2, $4); delete $2; } ; ListaDodela: ListaDodela ',' Dodela { $1->push_back(*$3); delete $3; $$ = $1; } | Dodela { $$ = new vector< pair >(); $$->push_back(*$1); delete $1; } ; Dodela: id_token '=' Izraz { $$ = new pair(*$1, $3); delete $1; } | id_token { $$ = new pair(*$1, nullptr); delete $1; } ; Korak: ',' Izraz { $$ = $2; } | { $$ = nullptr; } Izrazi: Izrazi ',' Izraz { $$ = $1; $$->push_back($3); } | Izraz { $$ = new vector(); $$->push_back($1); } | { $$ = new vector(); } ; %% int main() { InitializeNativeTarget(); InitializeNativeTargetAsmPrinter(); InitializeNativeTargetAsmParser(); //yydebug = 1; initializeModuleAndPassManager(); theJIT = make_unique(); yyparse(); theModule->dump(); cerr << endl << "; kraj modula" << endl << endl; return 0; }