%{ #include #include #include #include "ast.hpp" #define YYDEBUG 1 using namespace std; void yyerror(string s) { cerr << s << endl; exit(EXIT_FAILURE); } int yylex(); int counter = 0; %} %nonassoc else_token %left '<' '>' %left '+' '-' %left '*' '/' %union { double d; string *s; ExprAST *e; vector *v; vector *v1; PrototypeAST *p; } %type E %type NizE %type Argumenti %type

Potpis %token def_token extern_token if_token then_token else_token %token id_token %token num_token %% Program: Program Naredba ';' | Naredba ';' ; Naredba: def_token Potpis E { FunctionAST f(*$2, $3); delete $2; f.codegen(); } | extern_token Potpis { $2->codegen(); delete $2; } | E { PrototypeAST p("neimenovana_fja_" + to_string(counter++), vector()); FunctionAST f(p, $1); f.codegen(); } ; Potpis: id_token '(' Argumenti ')' { $$ = new PrototypeAST(*$1, *$3); delete $1; delete $3; } ; Argumenti: Argumenti id_token { $$ = $1; $$->push_back(*$2); delete $2; } | { $$ = new vector(); } ; E: E '+' E { $$ = new AddExprAST($1, $3); } | E '-' E { $$ = new SubExprAST($1, $3); } | E '*' E { $$ = new MulExprAST($1, $3); } | E '/' E { $$ = new DivExprAST($1, $3); } | E '<' E { $$ = new LessThenExprAST($1, $3); } | E '>' E { $$ = new GreaterThenExprAST($1, $3); } | '(' E ')' { $$ = $2; } | num_token { $$ = new NumberExprAST($1); } | id_token { $$ = new VariableExprAST(*$1); delete $1; } | id_token '(' NizE ')' { $$ = new CallExprAST(*$1, *$3); delete $1; delete $3; } | id_token '(' ')' { $$ = new CallExprAST(*$1, vector()); delete $1; } | if_token E then_token E else_token E { $$ = new IfThenElseAST($2, $4, $6); } ; NizE: NizE ',' E { $$ = $1; $$->push_back($3); } | E { $$ = new vector(); $$->push_back($1); } ; %% extern LLVMContext TheContext; extern Module *TheModule; int main() { //yydebug = 1; InitializeModuleAndPassManager(); yyparse(); TheModule->dump(); delete TheModule; return 0; }