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

📄 compiler1.cpp

📁 实现了简单的Simple语言的编辑器,包括词法分析,语法分析,生成四元式,以及生成符号表功能,在符号表中还可以进行查询与删除.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		break;
	default:
		m_nErrorNum=5;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
	if (!r_ChengXuTi()) return FALSE;
//yy
	backpatch(link,2,2,leveltab[yuyivar.currbl].recl);
	gen("out",0,0,0,0,0,0);
	gen("ret",0,0,0,0,0,0);
	yuyivar.currbl=leveltab[yuyivar.currbl].outern;
	yuyivar.tempp=leveltab[yuyivar.currbl].temp;
//yy end
	switch (GetCurSym()->type)
	{
	case 31://.
		break;
	default:
		m_nErrorNum=6;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
	switch (GetCurSym()->type)
	{
	case -1://end of cifa
		break;
	default:
		m_nErrorNum=96;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	m_nErrorNum=0;
	m_nErrorAddress=m_pCurSym;
	return TRUE;
}

int CCompiler::r_ChengXuTi()
{
	switch (GetCurSym()->type)
	{
	case 14://integer
	case 15://real
	case 5://procedure
		if (!r_ShuoMingChuan()) return FALSE;
		switch (GetCurSym()->type)
		{
		case 30://;
			break;
		default:
			m_nErrorNum=5;
			m_nErrorAddress=m_pCurSym;
			return FALSE;
		}
		NextSym();
		break;
	case 6://begin
		break;
	default:
		m_nErrorNum=7;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	switch (GetCurSym()->type)
	{
	case 6://begin
		break;
	default:
		m_nErrorNum=8;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
	if (!r_YuJuChuan()) return FALSE;
	switch (GetCurSym()->type)
	{
	case 7://end
		break;
	default:
		m_nErrorNum=10;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
	return TRUE;
}

int CCompiler::r_ShuoMingChuan()
{
	if (!r_ShuoMing()) return FALSE;
	while (GetCurSym()->type==30 
		&& GetNextSym()->type!=6)//; begin
	{
		NextSym();
		if (!r_ShuoMing()) return FALSE;
	}
	return TRUE;
}

int CCompiler::r_ShuoMing()
{
	switch (GetCurSym()->type)
	{
	case 14://integer
	case 15://real
		if (!r_JianBianShuoMing()) return FALSE;
		break;
	case 5://procedure
		if (!r_GuoChengShuoMing()) return FALSE;
		break;
	default:
		m_nErrorNum=11;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	return TRUE;
}

int CCompiler::r_JianBianShuoMing()
{
	int typ;//yy
	switch (GetCurSym()->type)
	{
	case 14://integer
		typ=1;//yy
		break;
	case 15://real
		typ=2;//yy
		break;
	default:
		m_nErrorNum=12;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
	switch (GetCurSym()->type)
	{
	case 1://id
		break;
	default:
		m_nErrorNum=14;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
//yy
	switch (lookupv(GetCurSym()->text,yuyivar.currbl))
	{
	case -1:
		m_nErrorNum=31;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	case 0:
		addid(GetCurSym()->text,typ,1,leveltab[yuyivar.currbl].recl);
		leveltab[yuyivar.currbl].varnum++;
		leveltab[yuyivar.currbl].recl+=typ;
		break;
	default:
		m_nErrorNum=32;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
//yy end
	NextSym();
	while (GetCurSym()->type==32) //,
	{
		NextSym();
		switch (GetCurSym()->type)
		{
		case 1://id
			break;
		default:
			m_nErrorNum=14;
			m_nErrorAddress=m_pCurSym;
			return FALSE;
		}
//yy
		switch (lookupv(GetCurSym()->text,yuyivar.currbl))
		{
		case -1:
			m_nErrorNum=31;
			m_nErrorAddress=m_pCurSym;
			return FALSE;
		case 0:
			addid(GetCurSym()->text,typ,1,leveltab[yuyivar.currbl].recl);
			leveltab[yuyivar.currbl].varnum++;
			leveltab[yuyivar.currbl].recl+=typ;
			break;
		default:
			m_nErrorNum=32;
			m_nErrorAddress=m_pCurSym;
			return FALSE;
		}
//yy end
		NextSym();
	}
	return TRUE;
}

int CCompiler::r_GuoChengShuoMing()
{
	switch (GetCurSym()->type)
	{
	case 5://procedure
		break;
	default:
		m_nErrorNum=15;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
	switch (GetCurSym()->type)
	{
	case 1://id
		break;
	default:
		m_nErrorNum=13;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
//yy
	int link1=yuyivar.nxq;
	gen("j",0,0,0,0,0,0);
	leveltab[yuyivar.lastbl].lnp=yuyivar.nxq;
	leveltab[yuyivar.lastbl].lnum=yuyivar.lastbl;
	::strcpy(leveltab[yuyivar.lastbl].name,GetCurSym()->text);
	leveltab[yuyivar.lastbl].outern=yuyivar.currbl;
	leveltab[yuyivar.lastbl].parnum=0;
	leveltab[yuyivar.lastbl].pointer=yuyivar.lasent;
	leveltab[yuyivar.lastbl].recl=4;
	leveltab[yuyivar.lastbl].temp=yuyivar.tempp;
	leveltab[yuyivar.lastbl].varnum=0;
	yuyivar.currbl=yuyivar.lastbl;
	int v=lookupp(GetCurSym()->text);
	yuyivar.lastbl++;
	if (v!=-1)
	{
		m_nErrorNum=32;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	int link2=yuyivar.nxq;
	gen("in",0,0,0,0,0,0);
//yy end
	NextSym();
	switch (GetCurSym()->type)
	{
	case 33://(
		if (!r_XingChanBuFeng()) return FALSE;
		break;
	default:
		;
	}
	switch (GetCurSym()->type)
	{
	case 30://;
		break;
	default:
		m_nErrorNum=5;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
	if (!r_ChengXuTi()) return FALSE;
//yy
	backpatch(link2,2,2,leveltab[yuyivar.currbl].recl);
	gen("out",0,0,0,0,0,0);
	gen("ret",0,0,0,0,0,0);
	backpatch(link1,4,2,yuyivar.nxq);
	yuyivar.currbl=leveltab[yuyivar.currbl].outern;
	yuyivar.tempp=leveltab[yuyivar.currbl].temp;
//yy end
	return TRUE;
}

int CCompiler::r_XingChanBuFeng()
{
	switch (GetCurSym()->type)
	{
	case 33://(
		break;
	default:
		m_nErrorNum=16;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
	if (!r_XingChan()) return FALSE;
	while (GetCurSym()->type==30)
	{
		NextSym();
		if (!r_XingChan()) return FALSE;
	}
	switch (GetCurSym()->type)
	{
	case 34://)
		break;
	default:
		m_nErrorNum=17;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
	return TRUE;
}

int CCompiler::r_XingChan()
{
	int parn;//yy
	if (GetCurSym()->type==4)//var
	{
		NextSym();parn=1;//yy
	}
	else parn=0;//yy
	switch (GetCurSym()->type)
	{
	case 1://id
		break;
	default:
		m_nErrorNum=18;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
//yy
	if (lookupv(GetCurSym()->text,yuyivar.currbl)!=0)
	{
		m_nErrorNum=32;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	int link=yuyivar.lasent;
	addid(GetCurSym()->text,0,3+parn,0);
	leveltab[yuyivar.currbl].parnum++;
//yy end
	NextSym();
	while (GetCurSym()->type==32)//,
	{
		NextSym();
		switch (GetCurSym()->type)
		{
		case 1://id
			break;
		default:
			m_nErrorNum=18;
			m_nErrorAddress=m_pCurSym;
			return FALSE;
		}
//yy
		if (lookupv(GetCurSym()->text,yuyivar.currbl)!=0)
		{
			m_nErrorNum=32;
			m_nErrorAddress=m_pCurSym;
			return FALSE;
		}
		addid(GetCurSym()->text,0,3+parn,0);
		leveltab[yuyivar.currbl].parnum++;
//yy end
		NextSym();
	}
	switch (GetCurSym()->type)
	{
	case 35://:
		break;
	default:
		m_nErrorNum=19;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
	int typ;//yy
	switch (GetCurSym()->type)
	{
	case 14://integer
		typ=1;//yy
		break;
	case 15://real
		typ=2;//yy
		break;
	default:
		m_nErrorNum=12;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
//yy
	for (int i=link;i<yuyivar.lasent;i++)
	{
		idtab[i].typ=typ;
		idtab[i].addr=leveltab[yuyivar.currbl].recl;
		leveltab[yuyivar.currbl].recl+=typ;
		if (parn) gen("addr",1,i-link+1,0,0,0,0);
		else if (typ==1) gen("valueI",1,i-link+1,0,0,0,0);
		else gen("valueR",1,i-link+1,0,0,0,0);
	}
	leveltab[yuyivar.currbl].recl+=leveltab[yuyivar.currbl].lnum;
//yy end
	return TRUE;
}

int CCompiler::r_YuJuChuan()
{
	if (!r_YuJu()) return FALSE;
	while (GetCurSym()->type==30)//;
	{
		NextSym();
		if (!r_YuJu()) return FALSE;
	}
	return TRUE;
}

int CCompiler::r_YuJu()
{
	switch (GetCurSym()->type)
	{
	case 6://begin
		if (!r_FuHeYuJu()) return FALSE;
		break;
	case 1://id
		if (!r_FuZhiYuJu()) return FALSE;
		break;
	case 8://if
		if (!r_TiaoJianYuJu()) return FALSE;
		break;
	case 11://while
		if (!r_XunHuanYuJu()) return FALSE;
		break;
	case 13://call
		if (!r_GuoChengYuJu()) return FALSE;
		break;
	default:
		m_nErrorNum=9;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	return TRUE;
}

int CCompiler::r_FuHeYuJu()
{
	switch (GetCurSym()->type)
	{
	case 6://begin
		break;
	default:
		m_nErrorNum=8;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
	if (!r_YuJuChuan()) return FALSE;
	switch (GetCurSym()->type)
	{
	case 7://end
		break;
	default:
		m_nErrorNum=10;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
	return TRUE;
}

int CCompiler::r_FuZhiYuJu()
{
	switch (GetCurSym()->type)
	{
	case 1://id
		break;
	default:
		m_nErrorNum=20;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
//yy
	int idlevel=yuyivar.currbl;
	int idpoint=lookupv2(GetCurSym()->text,idlevel);
	if (idpoint==0)
	{
		m_nErrorNum=33;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	if (idpoint==-1)
	{
		m_nErrorNum=34;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	int t1=idtab[idpoint].typ;
	int k1=idtab[idpoint].addr;
	int i1;
	if (idlevel==yuyivar.currbl)
	{
		if (idtab[idpoint].kind==4) i1=5;
		else i1=4;
	}
	else
	{
		i1=idlevel+6;
	}
//yy end
	NextSym();
	switch (GetCurSym()->type)
	{
	case 29://:=
		break;
	default:
		m_nErrorNum=21;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
	if (!r_BiaoDaShi()) return FALSE;
//yy
	int t2;
	int k2;
	int i2=yuyivalue.Etyp;
	int j2=yuyivalue.Evalue;
	if (i2==1)
	{
		k2=j2;
		t2=1;
	}
	else if (i2==2)
	{
		k2=temptab[j2].taddr;
		t2=temptab[j2].typ;
		i2=3;
	}
	else
	{
		k2=idtab[j2].addr;
		t2=idtab[j2].typ;
		i2+=1;
	}
	if (t1<t2)
	{
		m_nErrorNum=35;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	if (t1==1) gen(":=I",i1,k1,i2,k2,0,0);
	else gen(":=R",i1,k1,i2,k2,0,0);
	if (i2==3) temptab[j2].used=FALSE;
//yy end
	return TRUE;
}

int CCompiler::r_TiaoJianYuJu()
{
	switch (GetCurSym()->type)
	{
	case 8://if
		break;
	default:
		m_nErrorNum=22;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
	if (!r_BuErBiaoDaShi()) return FALSE;
//yy
	int TCexit=yuyivalue.TC;
	int FCexit=yuyivalue.FC;
	backpatch(TCexit,4,2,yuyivar.nxq);
//yy end
	switch (GetCurSym()->type)
	{
	case 9://then
		break;
	default:
		m_nErrorNum=23;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
	if (!r_YuJu()) return FALSE;
//yy
	int link=yuyivar.nxq;
	gen("j",0,0,0,0,0,0);
//yy end
	switch (GetCurSym()->type)
	{
	case 10://else
		NextSym();
		backpatch(FCexit,4,2,yuyivar.nxq);//yy
		if (!r_YuJu()) return FALSE;
		break;
	default:
		backpatch(FCexit,4,2,yuyivar.nxq);//yy
	}
	backpatch(link,4,2,yuyivar.nxq);//yy
	return TRUE;
}

int CCompiler::r_XunHuanYuJu()
{
	switch (GetCurSym()->type)
	{
	case 11://while
		break;
	default:
		m_nErrorNum=24;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
	int p=yuyivar.nxq;//yy
	if (!r_BuErBiaoDaShi()) return FALSE;
//yy
	int TCexit=yuyivalue.TC;
	int FCexit=yuyivalue.FC;
	backpatch(TCexit,4,2,yuyivar.nxq);
//yy end
	switch (GetCurSym()->type)
	{
	case 12://do
		break;
	default:
		m_nErrorNum=25;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
	if (!r_YuJu()) return FALSE;
//yy
	gen("j",0,0,0,0,2,p);
	backpatch(FCexit,4,2,yuyivar.nxq);
//yy end
	return TRUE;
}

int CCompiler::r_GuoChengYuJu()
{
	switch (GetCurSym()->type)
	{
	case 13://call
		break;
	default:
		m_nErrorNum=26;
		m_nErrorAddress=m_pCurSym;
		return FALSE;
	}
	NextSym();
	switch (GetCurSym()->type)
	{
	case 1://id
		break;
	default:
		m_nErrorNum=27;
		m_nErrorAddress=m_pCurSym;

⌨️ 快捷键说明

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