%{ #include #include #include #include #include #include "naredba.hpp" #include #define YYDEBUG 1 using namespace std; void yyerror(string s) { cerr << s << endl; exit(EXIT_FAILURE); } extern int yylex(); map tablica; %} %union { string *s; int x; Naredba* n; Izraz *i; vector *v; } %token pocetak_token kraj_token ispisi_token mod_token %token ako_je_token onda_token inace_token unesi_token %token dok_je_token radi_sledece_token %token string_token id_token %token broj_token %type Izraz %type Naredba Blok %type NizNaredbi %nonassoc ':' %nonassoc inace_token %left '<' '>' %left '+' '-' %left '*' '/' mod_token %% Program: Blok '.' { $1 -> izvrsi(); delete $1; } ; Blok: pocetak_token NizNaredbi kraj_token { $$ = new Blok(*$2); delete $2; } ; NizNaredbi: NizNaredbi ';' Naredba { $$ = $1; $$->push_back($3); } | Naredba { $$ = new vector(); $$->push_back($1); } ; Naredba: ispisi_token '(' string_token ')' { $$ = new IspisStringa(*$3); delete $3; } | ispisi_token '(' Izraz ')' { $$ = new IspisIzraza($3); delete $3; } | id_token ':' '=' Izraz { $$ = new Dodela(*$1, $4); delete $1; delete $4; } | ako_je_token Izraz onda_token ':' Naredba { $$ = new AkoJeOnda($2, $5); delete $2; } | ako_je_token Izraz onda_token ':' Naredba inace_token ':' Naredba { $$ = new AkoJeOndaInace($2, $5, $8); delete $2; } | unesi_token '(' id_token ')' { $$ = new Unesi(*$3); delete $3; } | dok_je_token Izraz radi_sledece_token ':' Naredba { $$ = new DokJe($2, $5); delete $2; } | Blok { $$ = $1; } ; Izraz: Izraz '+' Izraz { $$ = new Zbir($1, $3); delete $1; delete $3; } | Izraz '-' Izraz { $$ = new Razlika($1, $3); delete $1; delete $3; } | Izraz '*' Izraz { $$ = new Proizvod($1, $3); delete $1; delete $3; } | Izraz '/' Izraz { $$ = new Kolicnik($1, $3); delete $1; delete $3; } | Izraz mod_token Izraz { $$ = new Mod($1, $3); delete $1; delete $3; } | Izraz '<' Izraz { $$ = new Manje($1, $3); delete $1; delete $3; } | Izraz '>' Izraz { $$ = new Vece($1, $3); delete $1; delete $3; } | '(' Izraz ')' { $$ = $2; } | broj_token { $$ = new Konstanta($1); } | id_token { $$ = new Promenljiva(*$1); delete $1; } ; %% extern FILE* yyin; int main(int argc, char **argv) { //yydebug = 1; if (argc != 2) yyerror("Poziv programa: pseudokod paskal_fajl"); yyin = fopen(argv[1], "r"); if (yyin == NULL) yyerror("Nemoguce otvaranje fajla sa paskal kodom"); yyparse(); fclose(yyin); return 0; }