%{ #include extern int yylex(); void yyerror(char* s) { fprintf(stderr, "%s", s); } #include "syntree.h" #define YYDEBUG 1 %} %union { int broj_atr; char* str_atr; struct cvor* cvor_atr; } %token ID %token BROJ %token PRINT IF THEN ELSE WHILE BEGIN_ END_ PRAZNA FOR TO DO MANJEJED VECEJED %type izraz naredba program niz_naredbi %nonassoc '<' '>' MANJEJED VECEJED %left '+' '-' %left '*' '/' %% start : program { kompiliraj($1); } ; program : niz_naredbi { $$ = $1; } ; naredba : ID ':' '=' izraz { struct cvor* op1 = napraviCvorPromenljive($1); free($1); $$ = napraviCvorOperatora2('=', op1, $4); } | PRINT '(' izraz ')' { $$ = napraviCvorOperatora1(PRINT, $3); } | WHILE izraz DO naredba { $$ = napraviCvorOperatora2(WHILE, $2, $4); } | IF izraz THEN naredba { $$ = napraviCvorOperatora2(IF, $2, $4); } | FOR ID ':' '=' izraz TO izraz DO naredba { cvor* inic = napraviCvorOperatora2('=', napraviCvorPromenljive($2), $5); cvor* uslov = napraviCvorOperatora2(MANJEJED, napraviCvorPromenljive($2), $7); cvor* korak = napraviCvorOperatora2('=', napraviCvorPromenljive($2), napraviCvorOperatora2('+', napraviCvorPromenljive($2), napraviCvorKonstante(1))); $$ = napraviCvorOperatora2(';', inic, napraviCvorOperatora2(WHILE, uslov, napraviCvorOperatora2(';', $9, korak))); free($2); } | BEGIN_ niz_naredbi END_ { $$ = $2; } | { $$ = napraviCvorOperatora0(PRAZNA); } ; niz_naredbi : niz_naredbi ';' naredba { $$ = napraviCvorOperatora2(';', $1, $3); } | naredba { $$ = $1; } ; izraz : izraz '+' izraz { $$ = napraviCvorOperatora2('+', $1, $3); } | izraz '-' izraz { $$ = napraviCvorOperatora2('-', $1, $3); } | izraz '*' izraz { $$ = napraviCvorOperatora2('*', $1, $3); } | izraz '/' izraz { $$ = napraviCvorOperatora2('/', $1, $3); } | izraz '<' izraz { $$ = napraviCvorOperatora2('<', $1, $3); } | izraz '>' izraz { $$ = napraviCvorOperatora2('>', $1, $3); } | izraz MANJEJED izraz { $$ = napraviCvorOperatora2(MANJEJED, $1, $3); } | izraz VECEJED izraz { $$ = napraviCvorOperatora2(VECEJED, $1, $3); } | '(' izraz ')' { $$ = $2; } | BROJ { $$ = napraviCvorKonstante($1); } | ID { $$ = napraviCvorPromenljive($1); free($1); } ; %%