#include "syntree.h" #include #include /* funkcija za prijavljivanje greske */ void yyerror(char* s) { fprintf(stderr, "%s", s); } /* alokacija cvora */ node allocNode() { node n = (node)malloc(sizeof(struct node_)); if (n == NULL) yyerror("Out of memory"); return n; } /* konstruktor konstante na osnovu njene vrednosti */ node con(int value) { node n = allocNode(); n->type = typeCon; n->value = value; return n; } /* konstruktor promenljive na osnovu njenog imena */ node id(char name[]) { node n = allocNode(); n->type = typeId; strcpy(n->name, name); return n; } /* konstruktor binarnog operatora na osnovu njegovog simbola i operanada */ node op(char operator, node left, node right) { node n = allocNode(); n->type = typeOp; n->op.operator = operator; n->op.left = left; n->op.right = right; return n; } /* brisanje drveta */ void freeNode(node n) { if (n->type == typeOp) { freeNode(n->op.left); freeNode(n->op.right); } free(n); } /* stampanje cvora n na nivou nazubljenosti indent */ void print_(node n, int indent) { /* nazubljujemo indent karaktera */ int i; for (i = 0; i < indent; i++) printf(" "); /* analiziramo vrstu cvora */ switch(n->type) { case typeCon: /* cvor konstante */ printf("Con: %d\n", n->value); break; case typeId: /* cvor promenljive */ printf("Id: %s\n", n->name); break; case typeOp: /* cvor binarnog operatora */ printf("Op: %c\n", n->op.operator); /* rekurzivno stampamo operande na narednom nivou nazubljenosti */ print_(n->op.left, indent+1); print_(n->op.right, indent+1); break; } } /* stampanje drveta (samo zbog debagovanja) */ void print(node n) { print_(n, 0); }