#include #include #include "syntree.h" /* funkcija za prijavljivanje greske */ int yyerror(char* s) { return fprintf(stderr, "%s", s); } /* alokacija cvora */ nodeType* allocNode() { nodeType *p; /* alokacija cvora */ if ((p = malloc(sizeof(nodeType))) == NULL) yyerror("out of memory"); return p; } /* Kreiranje cvora konstante sa datom vrednoscu */ nodeType* con(int value) { nodeType* p = allocNode(); p->type = typeCon; /* Tip cvora je tip konstante */ p->con.value = value; /* Vrednost konstante je prosledjena kao parametar */ return p; } /* Kreiranje cvora promenljive sa datim celobrojnim indeksom */ nodeType *id(int i) { nodeType *p = allocNode(); p->type = typeId; /* Tip cvora je cvor promenljive */ p->id.i = i; /* indeks promenljive je dat kao parametar */ return p; } /* Kreiranje cvora binarnog operatora oper sa data dva operanda */ nodeType* binOp(int oper, nodeType* op1, nodeType* op2) { nodeType* p = allocNode(); p->type = typeOpr; /* Tip cvora je cvor operanda */ p->opr.oper = oper; /* Operator je dat kao parametar */ p->opr.nops = 2; /* Operator je binaran */ /* Alokacija niza operanada */ if ((p->opr.op = malloc(2*sizeof(nodeType*))) == NULL) yyerror("out of memory"); /* Postavljanje operanada */ p->opr.op[0] = op1; p->opr.op[1] = op2; return p; } /* Ispis cvora stabla na datom nivou nazubljivanja */ void print_(nodeType* p, int level) { /* nazubljuemo do dubine level */ int k; for (k = 0; k < level; k++) putchar(' '); /* analiziramo tip cvora */ switch(p->type) { case typeCon: /* cvor konstante */ printf("Con: %d\n", p->con.value); break; case typeId: /* cvor promenljive */ printf("Id: %c\n", 'a' + p->id.i); break; case typeOpr: /* cvor operatora */ printf("Op %c\n", p->opr.oper); /* rekurzivno ispisujemo operande na narednom nivou nazubljivanja */ for (k = 0; k < p->opr.nops; k++) print_(p->opr.op[k], level+1); break; } } /* Ispis sintaksnog stabla (korisno samo za debagovanje) */ void print(nodeType* p) { print_(p, 0); }