%{ #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(); %} %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 tmp = new FunctionAST(*$2, $3); delete $2; } | extern_token Potpis { auto tmp = $2->codegen(); tmp->dump(); } | Izraz { auto tmp = $1->codegen(); tmp->dump(); } ; 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); } ; Izrazi: Izrazi ',' Izraz { $$ = $1; $$->push_back($3); } | Izraz { $$ = new vector(); $$->push_back($1); } | { $$ = new vector(); } ; %% extern Module *TheModule; extern LLVMContext TheContext; int main() { //yydebug = 1; TheModule = new Module("my module", TheContext); yyparse(); TheModule->dump(); delete TheModule; return 0; }