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

📄 yufa.cpp

📁 自定义简单语法类C语言编译器
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			insertpara(root);
			funlist[funnum].pvartable[paranum].Rva=paranum;
			paranum++;
			funlist[funnum].paraVarSize=paranum;
			if(root->sibling!=0)
				ScanTree(root->sibling);
		}

		if(root->ntype==ReturnStm)
		{
			needreturn=1;
			printtree(root);
			if(root->child[0]!=0)
			{
				yfoutfile<<"<child>\n";
				ScanTree(root->child[0]);
				yfoutfile<<"</child>\n";
				yfoutfile<<"</tree>\n";
			}
			if(root->sibling!=0)
				ScanTree(root->sibling);
		}

		if(root->ntype==FunDecl)
		{
			isroot=0;
			varnum=0;
			paranum=0;
			needreturn=0;
			strcpy(curfunname,root->nodestr);
			printtree(root);
			if(root->child[0]!=0&&root->child[0]->ntype!=OTHER)
			{
				yfoutfile<<"<child>\n";
				ScanTree(root->child[0]);
				yfoutfile<<"</child>\n";
			}
			if(root->child[1]!=0)
			{
				yfoutfile<<"<child>\n";
				ScanTree(root->child[1]);
				yfoutfile<<"</child>\n";
			}
			yfoutfile<<"</tree>\n";
			insertfun(root);
			isroot=1;//当函数退出时变为全局状态
			if((strcmp(funlist[funnum].rettype,"void")==0&&needreturn==1)
				||(strcmp(funlist[funnum].rettype,"int")==0&&needreturn==0))
			{
				cout<<"line"<<root->lineno<<"函数"<<funlist[funnum].funname<<"返回错误";
				exit(1);
			}
			funnum++;//函数结束时再将函数计数器加1
			if(root->sibling!=0)
				ScanTree(root->sibling);
		}

		if(root->ntype==VarDecl)
		{
			printtree(root);
			if(isroot==1)
			{
				insertgloablevar(root);
				gloablevarnum++;
			}
			else {
					insertvar(root);
					varnum++;
					}
			if(root->child[0]!=0)
			{
				yfoutfile<<"<child>\n";
				ScanTree(root->child[0]);
				yfoutfile<<"</child>\n";
			}
			if(root->sibling!=0)
				ScanTree(root->sibling);
		}

		if(root->ntype==FunCall)
		{
			int i,dypara=0;//函数调用时的参数个数
			NodeList temproot=root;
			printtree(root);
			i=searchfun(root);
	        if(root->child[0]!=0)
			{
				dypara++;
				root=root->child[0];
				while(root->sibling!=0)
				{
					root=root->sibling;
					dypara++;
				}
			}
			funlist[funnum].size+=dypara;
			cout<<dypara<<i<<funlist[i].paraVarSize;
			root=temproot;
			if(dypara!=funlist[i].paraVarSize)
			{
				cout<<"line:"<<root->lineno<<"函数"<<root->nodestr<<"调用参数个数错误"<<endl;
				exit(1);
			}
			
			if(root->child[0]!=0)
			{
				yfoutfile<<"<child>\n";
				ScanTree(root->child[0]);
				yfoutfile<<"</child>\n";
			}
			yfoutfile<<"</tree>\n";
			if(root->sibling!=0)
				ScanTree(root->sibling);
		}
	}
}

//生成目标代码
/*void ScanTreelast(NodeList root)
{
	
		if(root)
	{
			stmtprocess(root);
			if(root->child[0]!=0)
			{
				ScanTreelast(root->child[0]);
			}
			if(root->child[1]!=0)
			{
				ScanTreelast(root->child[1]);
			}
			if(root->child[2]!=0)
			{
			
				ScanTreelast(root->child[2]);
			}
			if(root->sibling!=0)
			{
				ScanTreelast(root->sibling);
			}
		}
}*/

//检查是否含有main函数
int searchmain()
{
	for(int i=0;i<funnum;i++)
	{
		if (strcmp(funlist[i].funname,"main")==0)
		{
			return 1;
		}
	}
	cout<<"函数中缺少main函数"<<endl;
	exit(1);
}

void initcodelist()
{
	gencode[curcodenum].op="call";
	gencode[curcodenum].arg1="NEAR PTR";
	gencode[curcodenum].arg2="_MAIN";
	curcodenum++;
	gencode[curcodenum].op="HALT";
	curcodenum++;
}

//生成代码时变量处理
string varprocess(int varlocate)
{
	char temp[10];
	string arg;
	if(varlocate>=100)
	{
		varlocate-=100;
		arg+="[0+";
		itoa(varlocate,temp,10);
		arg+=temp;
		arg+="]";
	}
	else
	{
		arg+="[BP+";
		itoa(varlocate+2,temp,10);
		arg+=temp;
		arg+="]";
	}
	return arg;
}

//if 语句生成代码
void ifstmt(NodeList root)
{
	int tempcodenum;
	char temp[10];
//	gencode[curcodenum].label="if_stmt";
	expressionstmt(root->child[0]);
	tempcodenum=curcodenum;
	curcodenum++;
	stmtprocess(root->child[1]);
	itoa(curcodenum,temp,10);
	gencode[tempcodenum].arg1=temp;
}
//ifelse 语句生成代码
void ifelsestmt(NodeList root)
{
    int tempcodenum1,tempcodenum2;
	char temp[10];
	expressionstmt(root->child[0]);
	tempcodenum1=curcodenum;
	curcodenum++;
	stmtprocess(root->child[1]);
	tempcodenum2=curcodenum;
	curcodenum++;
	gencode[tempcodenum2].op="JMP";
	itoa(curcodenum,temp,10);
	gencode[tempcodenum1].arg1=temp;
	stmtprocess(root->child[2]);
	itoa(curcodenum,temp,10);
	gencode[tempcodenum2].arg1=temp;
}
//while语句生成代码
void whilestmt(NodeList root)
{
	int tempcodenum,tempcodenum1;
	char temp[10];
	tempcodenum1=curcodenum;
	expressionstmt(root->child[0]);
	curcodenum++;
	tempcodenum=curcodenum;
	stmtprocess(root->child[1]);
	gencode[curcodenum].op="JMP";
	itoa(tempcodenum1,temp,10);
	gencode[curcodenum].arg1=temp;
	curcodenum++;
	itoa(curcodenum,temp,10);
	gencode[tempcodenum-1].arg1=temp;


}
//赋值语句生成代码
void assignstmt(NodeList root)
{
	int varlocate;
	varlocate=searchvar(root->child[0],curfunnum);
	expressionstmt(root->child[1]);
	gencode[curcodenum].arg1=varprocess(varlocate);
	gencode[curcodenum].op="mov";
	gencode[curcodenum].arg2="AX";
	curcodenum++;
}


//表达式生成目标代码
void expressionstmt(NodeList root)
{
	int varlocate;
	switch (root->ntype)
	{
	case ConstID:
		gencode[curcodenum].op="mov";
		gencode[curcodenum].arg1="AX";
		gencode[curcodenum].arg2=root->nodestr;
		curcodenum++;
		break;
	case VarID:
		varlocate=searchvar(root,curfunnum);
		gencode[curcodenum].arg2+=varprocess(varlocate);
		gencode[curcodenum].op="mov";
		gencode[curcodenum].arg1="AX";
		curcodenum++;
		break;
	case ADD:
		expressionstmt(root->child[1]);
		gencode[curcodenum].op="mov";
		gencode[curcodenum].arg1="BX";
		gencode[curcodenum].arg2="AX";
		curcodenum++;
		expressionstmt(root->child[0]);
		gencode[curcodenum].op="add";
		gencode[curcodenum].arg1="AX";
		gencode[curcodenum].arg2="BX";
		curcodenum++;
		break;
	case SUB:
		expressionstmt(root->child[1]);
		gencode[curcodenum].op="mov";
		gencode[curcodenum].arg1="BX";
		gencode[curcodenum].arg2="AX";
		curcodenum++;
		expressionstmt(root->child[0]);
		gencode[curcodenum].op="sub";
		gencode[curcodenum].arg1="AX";
		gencode[curcodenum].arg2="BX";
		curcodenum++;
		break;
	case MUL:
		expressionstmt(root->child[1]);
		gencode[curcodenum].op="mov";
		gencode[curcodenum].arg1="BX";
		gencode[curcodenum].arg2="AX";
		curcodenum++;
		expressionstmt(root->child[0]);
		gencode[curcodenum].op="mul";
		gencode[curcodenum].arg1="AX";
		gencode[curcodenum].arg2="BX";
		curcodenum++;
		break;
	case DIV:
		expressionstmt(root->child[1]);
		gencode[curcodenum].op="mov";
		gencode[curcodenum].arg1="BX";
		gencode[curcodenum].arg2="AX";
		curcodenum++;
		expressionstmt(root->child[0]);
		gencode[curcodenum].op="div";
		gencode[curcodenum].arg1="AX";
		gencode[curcodenum].arg2="BX";
		curcodenum++;
		break;
	case  FunCall:
		funcallstmt(root);
		break;
	default:
		expressionstmt(root->child[1]);
		gencode[curcodenum].op="mov";
		gencode[curcodenum].arg1="BX";
		gencode[curcodenum].arg2="AX";
		curcodenum++;
		expressionstmt(root->child[0]);
		gencode[curcodenum].op="cmp";
		gencode[curcodenum].arg1="AX";
		gencode[curcodenum].arg2="BX";
		curcodenum++;
		switch(root->ntype)
		{
		case REQ:
			gencode[curcodenum].op="JNE";//!=
			break;
		case RNEQ:
			gencode[curcodenum].op="JE";//==
			break;
		case RLT:
			gencode[curcodenum].op="JNL";//>=
			break;
		case RGT:
			gencode[curcodenum].op="JNG";//<=
			break;
		case RNGT:
			gencode[curcodenum].op="JG";//>
			break;
		case RNLT:
			gencode[curcodenum].op="JL";//<
			break;
		}


	}
}
//函数调用语句生成代码
void funcallstmt(NodeList root)
{	
	int funlocate;
	funlocate=geningsearchfun(root);
	cout<<funlocate<<endl;
	gencode[curcodenum].op="call";
	gencode[curcodenum].arg1=funlist[funlocate].funname;
	curcodenum++;
}
//函数定义语句生成代码
void fundeclstmt(NodeList root)
{
	NodeList temproot;
	int funlocate=0;
	char temp[10];
	returnfinish=0;
	funlocate=geningsearchfun(root);
	gencode[curcodenum].label+=root->nodestr;
	gencode[curcodenum].op+="FUN";
	itoa(curfunnum+1,temp,10);
	gencode[curcodenum].op+=temp;
	gencode[curcodenum].arg1="proc";
	gencode[curcodenum].arg2="near";
	curcodenum++;
	gencode[curcodenum].op="push";
	gencode[curcodenum].arg1="BP";
	curcodenum++;
	gencode[curcodenum].op="mov";
	gencode[curcodenum].arg1="BP";
	gencode[curcodenum].arg2="SP";
	curcodenum++;
	gencode[curcodenum].op="add";
	gencode[curcodenum].arg1="SP";
	itoa(funlist[funlocate].size,temp,10);
	gencode[curcodenum].arg2+=temp;
	curcodenum++;
	temproot=root->child[1];
	while(temproot!=0&&temproot->ntype!=ReturnStm)
	{
		stmtprocess(temproot);
		temproot=temproot->sibling;
	}
	gencode[curcodenum].op="pop";
	gencode[curcodenum].arg1="BP";
	curcodenum++;
	gencode[curcodenum].op="mov";
	gencode[curcodenum].arg1="SP";
	gencode[curcodenum].arg2="BP";
	curcodenum++;
	gencode[curcodenum].op="sub";
	gencode[curcodenum].arg1="SP";
	itoa(funlist[funlocate].size,temp,10);
	gencode[curcodenum].arg2+=temp;
	curcodenum++;
	if(temproot==0&&returnfinish==0)
	{
		gencode[curcodenum].op="ret";
		curcodenum++;
		returnfinish=1;
	}
	else if(temproot->ntype==ReturnStm)
		returnstmt(temproot);
}
//return语句生成代码
void returnstmt(NodeList root)
{
	if(root->child[0]!=0)
	{
		expressionstmt(root->child[0]);
		gencode[curcodenum].op="ret";
		returnfinish=1;
		curcodenum++;
	}
}

void codegen(NodeList root)
{
	while(root)
	{
		if(root->ntype==VarDecl)
		{
			gencode[curcodenum].op="push";
			gencode[curcodenum].arg1="0";
			curcodenum++;
		}
		if(root->ntype==FunDecl)
		{
			if(curfunnum==0)
				initcodelist();
			fundeclstmt(root);
			curfunnum++;
		}
		root=root->sibling;
	}
}

//判断函数内部各种语句
void stmtprocess(NodeList root)
{
	switch(root->ntype)
	{
	case IfStm:
		ifstmt(root);
		break;
	case IfElseStm:
		ifelsestmt(root);
		break;
    case WhileStm:
		whilestmt(root);
		break;
	case AssignStm:
		assignstmt(root);
		break;
	case FunCall:
		funcallstmt(root);
		break;
//	case ReturnStm:
//		returnstmt(root);
//		break;
	default:
		break;
	}
}
//主函数
int main ()
{
	int cifaright=cifa();
	NodeList rootnode;
	for(int i=0;i<20;i++)
	{
		memset(gloablevarlist[i].varname,0,10);
		memset(funlist[i].funname,0,10);
		funlist[i].size=2;
		for(int j=0;j<20;j++)
			memset(funlist[i].pvartable[j].varname,0,10);
	}
	memset(curfunname,0,10);
	if(0==cifaright)
	{ 
		cout<<"词法分析错误!"<<endl;
		return 0;
	}
	else cout<<"程序词法正确"<<endl;
	rootnode=program();
	if(1==yufaright)
	cout<<"程序语法正确!"<<endl;
	yfoutfile<<"<?xml version=\"1.0\"?>\n<root>\n	";
	ScanTree(rootnode->sibling);
    yfoutfile<<"</root>";
	yfoutfile.close();
	sym_table<<"<?xml version=\"1.0\"?>\n<root>\n	";
	printsymtable();
	sym_table<<"</root>";
	for(i=0;i<funnum;i++)
		cout<<funlist[i].size;
	cout<<endl;	
	searchmain();//查找main函数,若没有,返回错误
	codegen(rootnode->sibling);
	codelist<<"<root>\n";
	for(i=0;i<curcodenum;i++)
	{
		cout<<i<<":   "<<gencode[i].label<<" "<<gencode[i].op<<" "<<gencode[i].arg1<<" "<<gencode[i].arg2<<endl;
		codelist<<"<code>\n"<<"<line>"<<i
			<<"</line>\n"<<"<label>"<<gencode[i].label
			<<"</label>\n"<<"<op>"<<gencode[i].op
			<<"</op>\n"<<"<op1>"<<gencode[i].arg1
			<<"</op1>\n"<<"<op2>"<<gencode[i].arg2
			<<"</op2>\n"<<"</code>\n";
	}
	codelist<<"</root>";
	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -