📄 tree.c
字号:
/*tree.c:管理抽象语法树,打印语法树的调试信息*/#include "cmm.h"static int where = STMT;/*tree:生成语法树*/Tree tree(int op, Type type, Tree left, Tree right){ Tree p; NEW0(p,where); p->op = op; p->type = type; p->kids[0] = left; p->kids[1] = right; return p;}Tree texpr(Tree(*f)(int tok),int tok, int arena){ Tree e; int a = where; where = arena; e = (*f)(tok); where = a; return e;}static int isbinary[] = { 0,/*CNST*/ 0,/*ARG*/ 1,/*ASGN*/ 1,/*INDIR*/ 0,/*CVC*/ 0,/*CVI*/ 0,/*CVP*/ 0,/*CALL*/ 1,/*RET*/ 0,/*ADDRG*/ 0,/*ADDRL*/ 0,/*ADD*/ 1,/*SUB*/ 1,/*MOD*/ 1,/*DIV*/ 1,/*MUL*/ 1,/*EQ*/ 1,/*GE*/ 1,/*GT*/ 1,/*LE*/ 1,/*LT*/ 1,/*NE*/ 1,/*JUMP*/ 0,/*LABEL*/ 0,/*NOT*/ 0,/*NEG*/ 0,/*CVU*/ 0,};static char *operator[] = { "",/*CNST*/ "",/*ARG*/ "",/*ASGN*/ "=",/*INDIR*/ "*",/*CVC*/ "(char)",/*CVI*/ "(int)",/*CVP*/ "(void *)",/*CALL*/ "",/*RET*/ "return ",/*ADDRG*/ "&",/*ADDRL*/ "&",/*ADD*/ "+",/*SUB*/ "-",/*MOD*/ "%",/*DIV*/ "/",/*MUL*/ "*",/*EQ*/ "==",/*GE*/ ">=",/*GT*/ ">",/*LE*/ "<=",/*LT*/ "<",/*NE*/ "!=",/*JUMP*/ "jump ",/*LABEL*/ "label ",/*NOT*/ "!",/*NEG*/ "-",/*CVU*/ "(unsigned)",};static int prec[] = { 0,/*CNST*/ 0,/*ARG*/ 0,/*ASGN*/ 1,/*INDIR*/ 6,/*CVC*/ 0,/*CVI*/ 0,/*CVP*/ 0,/*CALL*/ 6,/*RET*/ 0,/*ADDRG*/ 6,/*ADDRL*/ 6,/*ADD*/ 4,/*SUB*/ 4,/*MOD*/ 5,/*DIV*/ 5,/*MUL*/ 5,/*EQ*/ 2,/*GE*/ 3,/*GT*/ 3,/*LE*/ 3,/*LT*/ 3,/*NE*/ 2,/*JUMP*/ 0,/*LABEL*/ 0,/*NOT*/ 6,/*NEG*/ 6,/*CVU*/ 0,};#define outlpare(NODE,VAR,COND) if(isbinary[index(NODE->kids[VAR]->op)] \ && COND) {\ fprint(2,"(");\ n++;\ }#define outrpare() if(n-- > 0)\ fprint(2, ")");/*printtree:打印抽象语法树e*/void printtree(Tree e){ int op, n = 0; if(NULL == e) return; op = generic(e->op); if(isbinary[index(e->op)]){ if(CALL == op){ printtree(e->kids[1]); fprint(2,"("); printtree(e->kids[0]); fprint(2,")\n"); }else if(ARG == op) { printtree(e->kids[1]); if (e->kids[1]) fprint(2,","); printtree(e->kids[0]); }else { outlpare(e,0,prec[index(e->kids[0]->op)] <= prec[index(e->op)]); printtree(e->kids[0]); outrpare(); n = 0; fprint(2,"%s", operator[index(e->op)]); outlpare(e,1,prec[index(e->kids[1]->op)] <= prec[index(e->op)]); printtree(e->kids[1]); outrpare(); } }else { int b = optype(e->op); switch(op) { case CNST: if (b == U) fprint(2,"%d", e->u.v.u); else if (b == C) fprint(2,"'%c'", e->u.v.c); else if(b == I) fprint(2, "%d", e->u.v.i); else if(b == P) fprint(2, "\"%s\"",e->u.v.p); break; case CVC: case CVI: case CVP: case CVU: switch(b) { case C: fprint(2, "(char)"); break; case I: fprint(2, "(int)"); break; case U: fprint(2, "(unsigned)"); break; case P: fprint(2, "(void *)"); break; } case INDIR: case NOT: case NEG: if (INDIR == op|| NOT == op || NEG == op) fprint(2,operator[index(e->op)]); outlpare(e,0,generic(e->kids[0]->op) != CALL); printtree(e->kids[0]); outrpare(); break; case ADDRG: case ADDRL: fprint(2,"%s%s",operator[index(e->op)], e->u.sym->name); break; case RET: fprint(2,operator[index(e->op)]); printtree(e->kids[0]); break; } }}/*printdag:打印dag*/void print_dag(Node p){ int op, n = 0; if(NULL == p) return; op = generic(p->op); if (LOAD == op) print_dag(p->kids[0]); if(isbinary[index(p->op)]){ if(CALL == op){ print_dag(p->kids[0]); fprint(2,"call "); print_dag(p->kids[1]); }else if(ARG == op) { fprint(2, "push "); print_dag(p->kids[0]); print_dag(p->kids[1]); }else { outlpare(p,0,prec[index(p->kids[0]->op)] <= prec[index(p->op)]); print_dag(p->kids[0]); outrpare(); n = 0; fprint(2,"%s", operator[index(p->op)]); outlpare(p,1,prec[index(p->kids[1]->op)] <= prec[index(p->op)]); print_dag(p->kids[1]); outrpare(); } }else { int b = optype(p->op); switch(op) { case CNST: if (b == U) fprint(2,"%d", p->syms[0]->u.c.v.u); else if (b == C) fprint(2,"'%c'", p->syms[0]->u.c.v.c); else if(b == I) fprint(2, "%d", p->syms[0]->u.c.v.i); else if(b == P) fprint(2, "\"%s\"",p->syms[0]->u.c.v.p); break; case CVC: case CVI: case CVP: case CVU: switch(b) { case C: fprint(2, "(char)"); break; case I: fprint(2, "(int)"); break; case U: fprint(2, "(unsigned)"); break; case P: fprint(2, "(void *)"); break; } case INDIR: case NOT: case NEG: if (INDIR == op|| NOT == op || NEG == op) fprint(2,operator[index(p->op)]); outlpare(p,0,generic(p->kids[0]->op) != CALL); print_dag(p->kids[0]); outrpare(); break; case ADDRG: case ADDRL: case LABEL: fprint(2,"%s%s",operator[index(p->op)], p->syms[0]->name); break; case RET: case JUMP: fprint(2,operator[index(p->op)]); print_dag(p->kids[0]); break; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -