%{ #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(); extern unique_ptr TheJIT; extern unique_ptr TheModule; extern LLVMContext TheContext; extern map FunctionProtos; %} %token def_token extern_token %token id_token %token num_token %left '+' '-' %left '*' %union { ExprAST *e; vector *v; double d; string *s; vector *v1; PrototypeAST* p; } %type Izraz %type Izrazi %type Argumenti %type

Potpis %% Program: Program ';' Naredba | Naredba ; Naredba: def_token Potpis Izraz { auto f = new FunctionAST(*$2, $3); auto tmp = f->codegen(); //tmp->dump(); delete $2; delete f; } | extern_token Potpis { FunctionProtos.insert(pair($2->getName() , *$2)); auto tmp = $2->codegen(); //tmp->dump(); delete $2; } | Izraz { PrototypeAST p("__anon_expr", vector()); FunctionAST *f = new FunctionAST(p, $1); auto tmp = f->codegen(); if (tmp) { TheJIT->addModule(move(TheModule)); InitializeModuleAndPassManager(); auto s = TheJIT->findSymbol("__anon_expr"); double (*FP)() = (double (*)())s.getAddress(); cout << "Vrednost izraza je " << FP() << endl; //tmp->dump(); } 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); } | 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; } ; 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(); return 0; }