%{ #include #include #include #include "polinom.h" #define YYDEBUG 1 void yyerror(char *s) { printf("Sintaksna greska: %s\n", s); exit(EXIT_FAILURE); } extern int yylex(); typedef struct { char *ime; Polinom vrednost; } prom; #define MAX_PROM 32 prom promenljive[MAX_PROM]; int tren_br_prom = 0; void zapamti(char *s, Polinom p) { if (tren_br_prom >= MAX_PROM) yyerror("Dostignut max broj promenljivih"); promenljive[tren_br_prom].ime = malloc(strlen(s) + 1); strcpy(promenljive[tren_br_prom].ime, s); promenljive[tren_br_prom].vrednost = p; tren_br_prom++; } Polinom nadji(char *s) { int i = 0; for (; i num_token %token id_token %type

Niz_koef E %left '+' '-' %left '*' %left UMINUS %left '\'' %% Program: Program Linija | Linija ; Linija: E '\n' { ispisi(&$1); } | id_token ':' '=' E '\n' { zapamti($1, $4); free($1); } | E '=' '=' E '\n' { if (jednaki(&$1, &$4)) printf("True\n"); else printf("False\n"); } | E '!' '=' E '\n' { if (!jednaki(&$1, &$4)) printf("True\n"); else printf("False\n"); } | E '[' num_token ']' '\n' { printf("%g\n", izracunaj(&$1, $3)); } ; E: E '+' E { $$ = saberi(&$1, &$3); } | E '-' E { $$ = oduzmi(&$1, &$3); } | E '*' E { $$ = pomnozi(&$1, &$3); } | '-' E %prec UMINUS { $$ = uminus(&$2); } | '(' E ')' { $$ = $2; } | E '\'' { $$ = izvod(&$1); } | '$' E '|' num_token { $$ = integral (&$2, $4); } | '<' Niz_koef '>' { $$ = $2; } | id_token { $$ = nadji($1); free($1); } ; Niz_koef: Niz_koef ',' num_token { dodaj_koef(&$1, $3); $$ = $1; } | num_token { $$.stepen = 0; $$.koef[0] = $1; } ; %% int main() { //yydebug = 1; yyparse(); return 0; }