#include "syntree.h" #include #include #include #include "parser.tab.h" cvor* napraviCvor(tipCvora tip) { cvor* novi = (cvor*)malloc(sizeof(cvor)); /* svesno preskacemo obradu gresaka */ novi -> tip = tip; return novi; } cvor* napraviCvorKonstante(int vrednost) { cvor* novi = napraviCvor(KONST); novi -> c.konst.vrednost = vrednost; return novi; } cvor* napraviCvorPromenljive(char* s) { cvor* novi = napraviCvor(PROM); strncpy(novi -> c.prom.ime, s, 63); return novi; } cvor* napraviCvorOperatora0(int operator) { cvor* novi = napraviCvor(OP); novi -> c.op.operator = operator; novi -> c.op.brojOperanada = 0; return novi; } cvor* napraviCvorOperatora1(int operator, cvor* op1) { cvor* novi = napraviCvor(OP); novi -> c.op.operator = operator; novi -> c.op.brojOperanada = 1; novi -> c.op.operandi = (cvor**)malloc(1 * sizeof(cvor *)); novi -> c.op.operandi[0] = op1; return novi; } cvor* napraviCvorOperatora2(int operator, cvor* op1, cvor* op2) { cvor* novi = napraviCvor(OP); novi -> c.op.operator = operator; novi -> c.op.brojOperanada = 2; novi -> c.op.operandi = (cvor**)malloc(2 * sizeof(cvor *)); novi -> c.op.operandi[0] = op1; novi -> c.op.operandi[1] = op2; return novi; } void ispisi_(cvor* c, int dubina) { int i; for (i = 0; i < dubina; i++) printf(" "); switch(c -> tip) { case KONST: printf("konstanta: %d\n", c->c.konst.vrednost); break; case PROM: printf("promenljiva: %s\n", c->c.prom.ime); break; case OP: if (c->c.op.operator < 128) printf("operator: %c\n", c->c.op.operator); else printf("operator: %d\n", c->c.op.operator); for (i = 0; i < c->c.op.brojOperanada; i++) ispisi_(c->c.op.operandi[i], dubina + 1); break; } } void ispisi(cvor* c) { ispisi_(c, 0); } void kompiliraj(cvor * c) { static int sledecaLabela = 0; int i; switch(c -> tip) { case PROM: printf("push [%s]\n", c->c.prom.ime); break; case KONST: printf("push %d\n", c->c.konst.vrednost); break; case OP: if (c->c.op.operator == '=') { kompiliraj(c->c.op.operandi[1]); printf("pop [%s]\n", c->c.op.operandi[0]->c.prom.ime); } else if (c->c.op.operator == ';') { kompiliraj(c->c.op.operandi[0]); kompiliraj(c->c.op.operandi[1]); } else if (c->c.op.operator == WHILE) { cvor* uslov = c->c.op.operandi[0]; cvor* telo = c->c.op.operandi[1]; int labela1 = ++sledecaLabela; int labela2 = ++sledecaLabela; printf("LBL%d:\n", labela1); kompiliraj(uslov); printf("jz LBL%d\n", labela2); kompiliraj(telo); printf("jmp LBL%d\n", labela1); printf("LBL%d:\n", labela2); } else { for (i = 0; i < c->c.op.brojOperanada; i++) kompiliraj(c->c.op.operandi[i]); switch(c->c.op.operator) { case '+': printf("add\n"); break; case '*': printf("mul\n"); break; case MANJEJED: printf("leq\n"); break; case VECEJED: printf("geq\n"); break; case PRINT: printf("print\n"); break; } break; } } } int interpretiraj(cvor* c) { switch(c->tip) { case KONST: return c->c.konst.vrednost; case PROM: /* malo cekamo dok ne ispricamo tablice simbola u potpunosti */ break; case OP: { if (c->c.op.brojOperanada == 1) { switch(c->c.op.operator) { case PRINT: printf("%d\n", interpretiraj(c->c.op.operandi[0])); } } else if (c->c.op.brojOperanada == 2) { if (c->c.op.operator == '=') { char* prom = c->c.prom.ime; int vr = interpretiraj(c->c.op.operandi[1]); /* ovde se u tablicu simbola imenu prom pridruzuje vrednost vr */ return vr; } else if (c->c.op.operator == WHILE) { cvor* uslov = c->c.op.operandi[0]; cvor* telo = c->c.op.operandi[1]; while (interpretiraj(uslov)) interpretiraj(telo); } else if (c->c.op.operator == IF) { cvor* uslov = c->c.op.operandi[0]; cvor* telo = c->c.op.operandi[1]; if (interpretiraj(uslov)) interpretiraj(telo); } else { int levo = interpretiraj(c->c.op.operandi[0]); int desno = interpretiraj(c->c.op.operandi[1]); switch(c->c.op.operator) { case '+': return levo + desno; case '*': return levo * desno; case '<': return levo < desno; case '>': return levo > desno; } } } } } return 0; }