/* * tree printer routine for C */ #include "c1.h" char *strop[] { "0", ";", "{", "}", "[", "]", "(", ")", ":", ",", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "", "", "string", "fcon", "sfcon", "25", "26", "", "", "sizeof", "++pre", "--pre", "++post", "--post", "!un", "&un", "*un", "-un", "~un", ".", "+", "-", "*", "/", "%", ">>", "<<", "&", "|", "^", "->", "itof", "ftoi", "&&", "||", "&~", "ftol", "ltof", "itol", "ltoi", "==", "!=", "<=", "<", ">=", ">", "p", ">=p", "=+", "=-", "=*", "=/", "=%", "=>>", "=<<", "=&", "=|", "=^", "=", "&(test)", "82", "83", "84", "=&~", "86", "87", "88", "89", "?", "91", "92", "93", "94", "95", "96", "97", "98", "99", "call", "mcall", "jump", "cbranch", "init", "setreg", "106", "107", "108", "109", "forcereg", }; treeprint(tp) struct tnode *tp; { register f; extern fout; static tout; if (tout==0) tout = dup(1); flush(); f = fout; fout = tout; printf("\n"); tprt(tp, 0); flush(); fout = f; } tprt(at, al) struct tnode *at; { register struct tnode *t; register i, l; t = at; l = al; if (i=l) do printf(". "); while (--i); if (t=spacemax) { printf("%o: bad tree ptr\n", t); return; } if (t->op<0 || t->op>RFORCE) { printf("%d\n", t->op); return; } printf("%s", strop[t->op]); switch (t->op) { case SETREG: printf("%d\n", t->type); return; case PLUS: case MINUS: case TIMES: case DIVIDE: case MOD: case LSHIFT: case RSHIFT: case AND: case OR: case EXOR: case NAND: case LOGAND: case LOGOR: case EQUAL: case NEQUAL: case LESSEQ: case LESS: case GREATEQ: case GREAT: case LESSEQP: case LESSP: case GREATQP: case GREATP: case ASPLUS: case ASMINUS: case ASTIMES: case ASDIV: case ASMOD: case ASRSH: case ASLSH: case ASSAND: case ASSNAND: case ASOR: case ASXOR: case ASSIGN: case QUEST: case CALL: case MCALL: case CALL1: case CALL2: case TAND: prtype(t); case COLON: case COMMA: printf("\n"); tprt(t->tr1, l+1); tprt(t->tr2, l+1); return; case INCBEF: case INCAFT: case DECBEF: case DECAFT: printf(" (%d)", t->tr2); case EXCLA: case AMPER: case STAR: case NEG: case COMPL: case INIT: case JUMP: case LOAD: case RFORCE: case ITOF: case FTOI: case FTOL: case LTOF: case LTOI: case ITOL: prtype(t); printf("\n"); tprt(t->tr1, l+1); return; case NAME: case CON: case SFCON: case FCON: case AUTOI: case AUTOD: pname(t, 0); prtype(t); printf("\n"); return; case CBRANCH: printf(" (L%d)\n", t->lbl); tprt(t->btree, l+1); return; default: printf(" unknown\n"); return; } } char *typetab[] { "int", "char", "float", "double", "struct", "(?5)", "long", "(?7)", }; char *modtab[] { 0, "*", "()", "[]", }; prtype(atp) struct tnode *atp; { register struct tnode *tp; register t; tp = atp; printf(" %s", typetab[tp->type&07]); t = (tp->type>>3) & 017777; while (t&03) { printf(modtab[t&03]); t =>> 2; } printf(" (%d)", tp->degree); }