%{ #include #include #include #include #include "ast.hpp" #define YYDEBUG 1 using namespace std; int yylex(); void yyerror(string s) { cerr << s << endl; exit(EXIT_FAILURE); } int counter = 0; %} %union { double d; string *s; ExprAST *e; vector *v; vector *v1; PrototypeAST *p; } %token def_token %token id_token %token num_token %type E %type Arguments Arguments1 %type Args %type

Potpis %left '+' '-' %left '*' '/' %% Program: Program Statement ';' { } | Statement ';' { } ; Statement: Potpis E { FunctionAST *f = new FunctionAST(*$1, $2); delete $1; f->codegen(); delete f; } | E { PrototypeAST p(to_string(counter++), vector()); FunctionAST *f = new FunctionAST(p, $1); f->codegen(); delete f; } | Potpis { //TODO: $1->codegen(); delete $1; } ; Potpis: def_token id_token '(' Args ')' { $$ = new PrototypeAST(*$2, *$4); delete $2; delete $4; } ; Args: Args 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 ')' { $$ = $2; } | id_token { $$ = new VariableExprAST(*$1); delete $1; } | num_token { $$ = new NumberExprAST($1); } | id_token Arguments { $$ = new CallExprAST(*$1, *$2); delete $1; delete $2; } ; Arguments: '(' ')' { $$ = new vector(); } | '(' Arguments1 ')' { $$ = $2; } ; Arguments1: Arguments1 ',' E { $$ = $1; $$->push_back($3); } | E { $$ = new vector(); $$->push_back($1); } ; %% extern Module* TheModule; extern LLVMContext TheContext; int main() { //yydebug = 1; TheModule = new Module("my_module", TheContext); yyparse(); TheModule->dump(); delete TheModule; return 0; }