⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tree.c

📁 unix环境下实现的cmm语言编译器
💻 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 + -