#include #include "syntax_tree.h" #include "y.tab.h" int Mode=0; Tree putTree(int, Tree); void putList(int, Tree); void putObj(int, Obj); char *type2str(int t) { char *p; switch (t) { case FUNC_DEF: return "FUNC_DEF"; case GVAR_DECL: return "GVAR_DECL"; case LVAR_DECL: return "LVAR_DECL"; case SCALAR: return "SCALAR"; case ARRAY: return "ARRAY"; case LIST: return "LIST"; case EXP: return "EXP"; case FUNC_CALL: return "FUNC_CALL"; case ARR_REF: return "ARR_REF"; case VAR: return "VAR"; case RETURN: return "RETURN"; case IF: return "IF"; case ELSE: return "ELSE"; case WHILE: return "WHILE"; case SYM: return "SYM"; case NUM: return "NUM"; case STR: return "STR"; case EQEQ: return "EQEQ"; case EXEQ: return "EXEQ"; case LTEQ: return "LTEQ"; case GTEQ: return "GTEQ"; case UMINUS: return "UMINUS"; default: p = malloc(2); *p = t; *(p+1) = '\000'; return p; } } Tree putTree(int n, Tree t) { int i; if (t == NUL) return t; if (t->type == LIST) { putList(n,t); return t; } printf(";"); for (i=0; itype) { case NUM: printf("\n",t->num); return t; case STR: printf("\n",t->str); return t; case SYM: printf(" ",t->name); putObj(n,t->obj); return t; default: printf("<%s>\n", type2str(t->type)); putTree(n+2, t->left); putTree(n+2, t->right); putTree(n+2, t->third); return t; } } void putList(int n, Tree t) { int i; printf(";"); for (i=0; iright) { putTree(n+2, t->left); } printf(";"); for (i=0; itype) { case objFUNC: printf("(objFUNC %s[%d]: size=%d)\n", ob->name, ob->args, ob->size); return; case objGVAR: printf("(objGVAR %s)\n", ob->name); return; case objGARR: printf("(objGARR %s: size=%d)\n", ob->name, ob->size); return; case objLVAR: printf("(objLVAR %s: offset=%d)\n", ob->name, ob->offset); return; case objLARR: printf("(objLARR %s: offset=%d, size=%d)\n", ob->name, ob->offset, ob->size); } }