#include #include "syntax_tree.h" #include "y.tab.h" #define NODE_ARRAY_SIZE 1000 #define OBJ_STACK_SIZE 500 /* defined in pc.y (pc.c) */ extern void yyerror(char *); struct node NodeArray[NODE_ARRAY_SIZE]; int NAp=0; struct object ObjStack[OBJ_STACK_SIZE] = { { objFUNC, "STR2INT", 1, 0, 0 }, { objFUNC, "INT2STR", 2, 0, 0 }, /* { objFUNC, "READ", 0, 0, 0 }, { objFUNC, "WRITE", 1, 0, 0 }, */ { objFUNC, "READLN", 1, 0, 0 }, { objFUNC, "WRITELN", -1, 0, 0 } }; int lastGobjIndex=-1, OSp=4; /* OSp=6; */ char *ucase(char *s) { char *p; for(p = s; *p!=0; p++){ *p = toupper(*p); } return s; } Tree mkNode(int type, Tree left, Tree right) { Tree p = &NodeArray[NAp++]; p->type = type; p->left = left; p->right = right; p->third = NUL; return p; } Tree mkNode3(int type, Tree left, Tree right, Tree third) { Tree p = mkNode(type, left, right); p->third = third; return p; } Tree mkNum(int n) { Tree p = &NodeArray[NAp++]; p->type = NUM; p->num = n; return p; } Tree mkStr(char *s) { Tree p = &NodeArray[NAp++]; p->type = STR; p->str = s; return p; } Tree mkSym(char *name) { Tree p = &NodeArray[NAp++]; p->type = SYM; p->name = ucase(name); p->obj = NUL; return p; } Obj pushFunc(char *name) { Obj p = &ObjStack[OSp]; p->type = objFUNC; p->name = name; p->size = 0; lastGobjIndex = OSp++; return p; } void popScope() { OSp = lastGobjIndex+1; } Obj pushGvar(char *name) { Obj p = &ObjStack[OSp]; p->type = objGVAR; p->name = name; lastGobjIndex = OSp++; return p; } Obj pushGarr(char *name, int size) { Obj p = &ObjStack[OSp]; p->type = objGARR; p->name = name; p->size = size; lastGobjIndex = OSp++; return p; } Obj pushLvar(char *name) { Obj p = &ObjStack[OSp++]; p->type = objLVAR; p->name = name; p->scope = &ObjStack[lastGobjIndex]; p->offset = p->scope->size++; return p; } Obj pushLarr(char *name, int size) { Obj p = &ObjStack[OSp++]; p->type = objLARR; p->name = name; p->scope = &ObjStack[lastGobjIndex]; p->offset = p->scope->size; p->scope->size += (p->size = size); return p; } Obj getObj(char *name) { int i; for (i=OSp-1; i>=0; i--) { if (strcmp(ObjStack[i].name, name)==0) return &ObjStack[i]; } return NUL; }