/* Funkcija kojom se prijavljuje greska */ extern int yyerror(char* s); /* Tip cvora */ typedef enum { typeCon, typeId, typeOpr } nodeEnum; /* Cvor konstante */ typedef struct { int value; /* vrednost konstante */ } conNodeType; /* Cvor promenljive */ typedef struct { int i; /* celobrojni indeks jednoslovne promenljive */ } idNodeType; /* Cvor operatora */ typedef struct { int oper; /* operator: '+', '*', '-', '/', ... */ int nops; /* broj operanada */ struct nodeTypeTag **op; /* niz pokazivaca na operande */ } oprNodeType; /* Cvor */ typedef struct nodeTypeTag { nodeEnum type; /* tip cvora */ /* Koristi se uvek tacno jedno od sledecih polja */ union { conNodeType con; /* cvor konstante */ idNodeType id; /* cvor promenljive */ oprNodeType opr; /* cvor operatora */ }; } nodeType; /* Kreiranje cvora konstante sa datom vrednoscu */ nodeType *con(int value); /* Kreiranje cvora promenljive sa datim celobrojnim indeksom */ nodeType *id(int i); /* Kreiranje cvora unarnog operatora oper sa datim operandom */ nodeType* unOp(int oper, nodeType* op1); /* Kreiranje cvora binarnog operatora oper sa data dva operanda */ nodeType* binOp(int oper, nodeType* op1, nodeType* op2); /* Ispis sintaksnog stabla (korisno samo za debagovanje) */ void print(nodeType* n); /* brisanje drveta */ void freeNode(nodeType* n); /* Interpretacija stabla (za izraze to je izracunavanje vrednosti) */ int interpret(nodeType* p, int table[]);