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

📄 yy.cpp

📁 简单易用 易看的编译器 带词法分析和语法分析 输出是二元式和四元式 使用读取文件的方式进行编译 功能基本完整
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	default:
		yy_nErrorNum=23;
		yy_nErrorAddress=yy_pCurSym;
		return FALSE;
	}
	NextSym();
	if (!s_YuJu()) return FALSE;
//yy
	int link=quanjuvalue.nxq;//then 跳转
	
//yy end
	switch (GetCurSym().type)
	{
	case 10://else
		gen("j",0,0,0,0,0,0);
		NextSym();
		backpatch(FCexit,4,2,quanjuvalue.nxq);//yy
		if (!s_YuJu()) return FALSE;
			backpatch(link,4,2,quanjuvalue.nxq);//yy
		break;
	default:
		backpatch(FCexit,4,2,quanjuvalue.nxq);//yy

	}
	
	return TRUE;
}

int  s_XunHuanYuJu()
{
	switch (GetCurSym().type)
	{
	case 11://while
		break;
	default:
		yy_nErrorNum=24;
		yy_nErrorAddress=yy_pCurSym;
		return FALSE;
	}
	NextSym();
	int p=quanjuvalue.nxq;//yy//[while后面的表达是所跟的步尔表达是
	if (!s_BuErBiaoDaShi()) return FALSE;
//yy
	int TCexit=yujuvalue.TC;
	int FCexit=yujuvalue.FC;
	backpatch(TCexit,4,2,quanjuvalue.nxq);
//yy end
	switch (GetCurSym().type)
	{
	case 12://do
		break;
	default:
		yy_nErrorNum=25;
		yy_nErrorAddress=yy_pCurSym;
		return FALSE;
	}
	NextSym();
	if (!s_YuJu()) return FALSE;
//yy
	gen("j",0,0,0,0,2,p);
	backpatch(FCexit,4,2,quanjuvalue.nxq);
//yy end
	return TRUE;
}


int  s_BiaoDaShi()
{
	int i1,i2,j1,j2,t1,t2,k1,k2,tempi,tempj,tempt,tempk;
	if (!s_Xiang()) return FALSE;
//yy
	tempi=yujuvalue.Etyp;
	tempj=yujuvalue.Evalue;
	i1=tempi;j1=tempj;
	switch (i1)
	{
	case 1:
		t1=1;k1=j1;break;
	case 2:
		t1=temptab[j1].typ;
		k1=temptab[j1].taddr;
		break;
	default :
		t1=idtab[j1].typ;
		k1=idtab[j1].addr;
	}
//yy end
	while (GetCurSym().type==16)//+
	{
		NextSym();
		if (!s_Xiang()) return FALSE;
//yy
		i2=yujuvalue.Etyp;
		j2=yujuvalue.Evalue;
		switch (i2)
		{
		case 1:
			t2=1;k2=j2;break;
		case 2:
			t2=temptab[j2].typ;
			k2=temptab[j2].taddr;
			break;
		default :
			t2=idtab[j2].typ;
			k2=idtab[j2].addr;
		}
		tempt=(t1>t2)?t1:t2;
		tempj=newtemp(tempt);
		tempk=temptab[tempj].taddr;
		if (i1==1)
			if (i2==1)
				gen("+I",1,k1,1,k2,3,tempk);
			else
				if (t2==1)
					gen("+I",1,1,i2+1,k2,3,tempk);
				else
					gen("+R",1,k1,i2+1,k2,3,tempk);
		else
			if (i2==1)
				if (t1==1)
					gen("+I",i1+1,k1,1,k2,3,tempk);
				else
					gen("+R",i1+1,k1,1,k2,3,tempk);
			else
				if ((t1==1) && (t2==1))
					gen("+I",i1+1,k1,i2+1,k2,3,tempk);
				else
					gen("+R",i1+1,k1,i2+1,k2,3,tempk);
		if (i1==2) temptab[j1].used=FALSE;
		if (i2==2) temptab[j2].used=FALSE;
		tempi=2;
		i1=tempi;j1=tempj;t1=tempt;k1=tempk;
//yy end
	}
//yy
	yujuvalue.Etyp=tempi;
	yujuvalue.Evalue=tempj;
//yy end
	return TRUE;
}

int  s_Xiang()
{
	int i1,i2,j1,j2,t1,t2,k1,k2,tempi,tempj,tempt,tempk;
	if (!s_YingZi()) return FALSE;
//yy
	tempi=yujuvalue.Etyp;
	tempj=yujuvalue.Evalue;
	i1=tempi;j1=tempj;
	switch (i1)
	{
	case 1:
		t1=1;k1=j1;break;
	case 2:
		t1=temptab[j1].typ;
		k1=temptab[j1].taddr;
		break;
	default :
		t1=idtab[j1].typ;
		k1=idtab[j1].addr;
	}
//yy end
	while (GetCurSym().type==18)//*
	{
		NextSym();
		if (!s_YingZi()) return FALSE;
//yy
		i2=yujuvalue.Etyp;
		j2=yujuvalue.Evalue;
		switch (i2)
		{
		case 1:
			t2=1;k2=j2;break;
		case 2:
			t2=temptab[j2].typ;
			k2=temptab[j2].taddr;
			break;
		default :
			t2=idtab[j2].typ;
			k2=idtab[j2].addr;
		}
		tempt=(t1>t2)?t1:t2;
		tempj=newtemp(tempt);
		tempk=temptab[tempj].taddr;
		if (i1==1)
		{
			if (i2==1)
				gen("*I",1,k1,1,k2,3,tempk);
			else
			{
				if (t2==1)
					gen("*I",1,k1,i2+1,k2,3,tempk);
				else
					gen("*R",1,k1,i2+1,k2,3,tempk);
			}
		}
		else
		{
			if (i2==1)
				if (t1==1)
					gen("*I",i1+1,k1,1,k2,3,tempk);
				else
					gen("*R",i1+1,k1,1,k2,3,tempk);
				else
					if ((t1==1) && (t2==1))
						gen("*I",i1+1,k1,i2+1,k2,3,tempk);
					else
						gen("*R",i1+1,k1,i2+1,k2,3,tempk);
		}
		if (i1==2) temptab[j1].used=FALSE;
		if (i2==2) temptab[j2].used=FALSE;
		tempi=2;
		i1=tempi;j1=tempj;t1=tempt;k1=tempk;//如果再还有乘号连乘
//yy end
	}
//yy
	yujuvalue.Etyp=tempi;
	yujuvalue.Evalue=tempj;
//yy end
	return TRUE;
}

int  s_YingZi()
{
	int idlevel=quanjuvalue.currbl;//yy
	int idpoint;//yy
	switch (GetCurSym().type)
	{
	case 1://id
//yy
		idpoint=lookupv_alllevel(GetCurSym().text,idlevel);
		switch (idpoint)
		{
		case -1:
			yy_nErrorNum=34;
			yy_nErrorAddress=yy_pCurSym;
			return FALSE;
		case 0:
			yy_nErrorNum=33;
			yy_nErrorAddress=yy_pCurSym;
			return FALSE;
		default:
			if (idlevel==quanjuvalue.currbl)
				if (idtab[idpoint].kind==4) yujuvalue.Etyp=4;
				else yujuvalue.Etyp=3;
			else yujuvalue.Etyp=idlevel+4;//第i层的变量
			yujuvalue.Evalue=idpoint;
		}
//yy end
		NextSym();
		break;
	case 2://num
//yy
		yujuvalue.Etyp=1;
		yujuvalue.Evalue=GetCurSym().value;
//yy end
		NextSym();
		break;
	case 33://(
		NextSym();
		if (!s_BiaoDaShi()) return FALSE;
		switch (GetCurSym().type)
		{
		case 34://)
			break;
		default:
			yy_nErrorNum=17;
			yy_nErrorAddress=yy_pCurSym;
			return FALSE;
		}
		NextSym();
		break;
	default:
		yy_nErrorNum=28;
		yy_nErrorAddress=yy_pCurSym;
		return FALSE;
	}
	return TRUE;
}

int  s_BuErBiaoDaShi()
{
	int temp;
	int tc,fc;
	switch (GetCurSym().type)
	{
	case 20://~
		NextSym();
		if (!s_BuErBiaoDaShi()) return FALSE;
//yy
		temp=yujuvalue.TC;
		yujuvalue.TC=yujuvalue.FC;
		yujuvalue.FC=temp;
//yy end
		break;
	case 33://(
	case 1://id
	case 2://num
		if (!s_GuanXiBiaoDaShi()) return FALSE;
//yy
		tc=yujuvalue.TC;
		fc=yujuvalue.FC;
//yy end
		while (GetCurSym().type==21 || GetCurSym().type==22)
		{
			if (GetCurSym().type==21)//^
			{
				NextSym();
				backpatch(tc,4,2,quanjuvalue.nxq);//yy
				if (!s_BuErBiaoDaShi()) return FALSE;
				tc=yujuvalue.TC;//yy
				fc=merge(yujuvalue.FC,fc,4);//yy
			}
			else //|
			{
				NextSym();
				backpatch(fc,4,2,quanjuvalue.nxq);//yy
				if (!s_BuErBiaoDaShi()) return FALSE;
				fc=yujuvalue.FC;//yy
				tc=merge(yujuvalue.TC,tc,4);//yy
			}
		}
//yy
		yujuvalue.TC=tc;
		yujuvalue.FC=fc;
//yy end
		break;
	default:
		yy_nErrorNum=29;
		yy_nErrorAddress=yy_pCurSym;
		return FALSE;
	}
	return TRUE;
}

int  s_GuanXiBiaoDaShi()
{
	int i1,i2,j1,j2,t1,t2,k1,k2,rop;
	if (!s_BiaoDaShi()) return FALSE;
//yy
	i1=yujuvalue.Etyp;
	j1=yujuvalue.Evalue;
	switch (i1)
	{
	case 1:
		t1=1,k1=j1;break;
	case 2:
		t1=temptab[j1].typ;
		k1=temptab[j1].taddr;
		break;
	default:
		t1=idtab[j1].typ;
		k1=idtab[j1].addr;
	}
//yy end
	if (!s_GuanXi()) return FALSE;
	rop=yujuvalue.Code;//yy
	if (!s_BiaoDaShi()) return FALSE;
//yy
	i2=yujuvalue.Etyp;
	j2=yujuvalue.Evalue;
	switch (i2)
	{
	case 1:
		t2=1,k2=j2;break;
	case 2:
		t2=temptab[j2].typ;
		k2=temptab[j2].taddr;
		break;
	default:
		t2=idtab[j2].typ;
		k2=idtab[j2].addr;
	}
	if ((t1!=1) || (t2!=1))//非整数无法比较
	{
		yy_nErrorNum=39;
		yy_nErrorAddress=yy_pCurSym;
		return FALSE;
	}
	yujuvalue.TC=quanjuvalue.nxq;
	if (i1!=1) i1++;
	if (i2!=1) i2++;
	gen(yy_QuadOpCodeTable[rop],i1,k1,i2,k2,0,0);
	yujuvalue.FC=quanjuvalue.nxq;
	gen("j",0,0,0,0,0,0);
	if (i1==3) temptab[j1].used=FALSE;
	if (i2==3) temptab[j2].used=FALSE;
//yy end
	return TRUE;
}

int  s_GuanXi()
{
	switch (GetCurSym().type)
	{
	case 23://<
	case 24://<=
	case 25://>
	case 26://>=
	case 27://=
	case 28://<>
		break;
	default:
		yy_nErrorNum=30;
		yy_nErrorAddress=yy_pCurSym;
		return FALSE;
	}
//yy
	yujuvalue.Code=GetCurSym().type-11;
//yy end
	NextSym();
	return TRUE;
}

void coutgen1()
{
for(int i=1;i<quanjuvalue.nxq;i++)
printf("%d,(%d,%d),(%d,%d),(%d,%d)\n",quad[i].op,
	   quad[i].arg1.fl,quad[i].arg1.flvalue,
	   quad[i].arg2.fl ,quad[i].arg2.flvalue,
	   quad[i].result.fl,quad[i].result.flvalue);

};

void coutgen2()
{
for(int i=1;i<quanjuvalue.nxq;i++)
printf("%s,(%d,%d),(%d,%d),(%d,%d)\n",yy_QuadOpCodeTable[quad[i].op],
	   quad[i].arg1.fl,quad[i].arg1.flvalue,
	   quad[i].arg2.fl ,quad[i].arg2.flvalue,
	   quad[i].result.fl,quad[i].result.flvalue);

};
void coutgen()
{
cout<<endl;
for(int i=1;i<quanjuvalue.nxq;i++)
{
	cout<<"行号"<<i<<"  ";
	cout<<"("<<yy_QuadOpCodeTable[quad[i].op]<<", "<<quad[i].arg1.flvalue<<", " <<
	   quad[i].arg2.flvalue<<", "<<
	   quad[i].result.flvalue<<")"<<endl;
}
};




void initial()
{   
	
	for(int i=0;i<c1.cur_ty;i++)
{   
		yy_tCifa[i].type=c1.cifaresult[i].type;
        strcpy(yy_tCifa[i].text,c1.cifaresult[i].text);
		yy_tCifa[i].value=c1.cifaresult[i].value;
        yy_tCifa[i].address=c1.cifaresult[i].address;
	}
    cout<<endl;
	cout<<"长度"<<c1.cur_ty<<endl;



	//错误和就4员式子操作
	strcpy(yy_QuadOpCodeTable[0], "_End_");
	strcpy(yy_QuadOpCodeTable[1], "in");
	strcpy(yy_QuadOpCodeTable[2], "call");
	strcpy(yy_QuadOpCodeTable[3], "out");
	strcpy(yy_QuadOpCodeTable[4], "ret");
	strcpy(yy_QuadOpCodeTable[5], ":=I");
	strcpy(yy_QuadOpCodeTable[6], ":=R");
	strcpy(yy_QuadOpCodeTable[7], "par");
	strcpy(yy_QuadOpCodeTable[8], "valueI");
	strcpy(yy_QuadOpCodeTable[9], "valueR");
	strcpy(yy_QuadOpCodeTable[10],"addr");
	strcpy(yy_QuadOpCodeTable[11],"j");
	strcpy(yy_QuadOpCodeTable[12],"j<");
	strcpy(yy_QuadOpCodeTable[13],"j<=");
	strcpy(yy_QuadOpCodeTable[14],"j>");
	strcpy(yy_QuadOpCodeTable[15],"j>=");
	strcpy(yy_QuadOpCodeTable[16],"j=");
	strcpy(yy_QuadOpCodeTable[17],"j<>");
	strcpy(yy_QuadOpCodeTable[18],"`");
	strcpy(yy_QuadOpCodeTable[19],"+I");
	strcpy(yy_QuadOpCodeTable[20],"+R");
	strcpy(yy_QuadOpCodeTable[21],"*I");
	strcpy(yy_QuadOpCodeTable[22],"*R");
	strcpy(yy_QuadOpCodeTable[23],"`");
	strcpy(yy_QuadOpCodeTable[24],"`");
	strcpy(yy_QuadOpCodeTable[25],"`");
	strcpy(yy_QuadOpCodeTable[26],"`");
	strcpy(yy_QuadOpCodeTable[27],"`");
	strcpy(yy_QuadOpCodeTable[28],"`");
	strcpy(yy_QuadOpCodeTable[29],"_Erros_");

	strcpy(yy_tErrorMessage[0],"正确!");
	strcpy(yy_tErrorMessage[2],"非法字符!");
	strcpy(yy_tErrorMessage[3],"缺少保留字“ program ”!");
	strcpy(yy_tErrorMessage[4],"program 后缺少标识符!");
	strcpy(yy_tErrorMessage[5],"缺少“ ; ”符号!");
	strcpy(yy_tErrorMessage[6],"缺少程序结束符“ . ”符号!");
	strcpy(yy_tErrorMessage[7],"缺少《程序体》,应为 begin,integer,real,procedure");
	strcpy(yy_tErrorMessage[8],"缺少保留字“ begin ”!");
	strcpy(yy_tErrorMessage[9],"缺少《语句》,应为 begin,ID,if,while,call");
	strcpy(yy_tErrorMessage[10],"缺少保留字“ end ”!");
	strcpy(yy_tErrorMessage[11],"缺少《说明》,应为 integer,real,procedure");
	strcpy(yy_tErrorMessage[12],"缺少保留字 integer 或 real!");
	strcpy(yy_tErrorMessage[13],"procedure 后缺少标识符!");
	strcpy(yy_tErrorMessage[14],"简单变量说明后缺少标识符!");
	strcpy(yy_tErrorMessage[15],"缺少保留字“ procedure ”!");
	strcpy(yy_tErrorMessage[16],"缺少 “ ( ”符号!");
	strcpy(yy_tErrorMessage[17],"缺少 “ ) ”符号!");
	strcpy(yy_tErrorMessage[18],"缺少形参标识符 !");
	strcpy(yy_tErrorMessage[19],"缺少 “ : ”符号!");
	strcpy(yy_tErrorMessage[20],"缺少标识符!");
	strcpy(yy_tErrorMessage[21],"缺少赋值符号“ := ”!");
	strcpy(yy_tErrorMessage[22],"缺少保留字“ if ”!");
	strcpy(yy_tErrorMessage[23],"缺少保留字“ then ”!");
	strcpy(yy_tErrorMessage[24],"缺少保留字“ while ”!");
	strcpy(yy_tErrorMessage[25],"缺少保留字“ do ”!");
	strcpy(yy_tErrorMessage[27],"缺少被调过程名标识符!");
	strcpy(yy_tErrorMessage[28],"缺少《因子》,应为 (,ID,NUMBER");
	strcpy(yy_tErrorMessage[29],"缺少《布尔表达式》,应为 ~,(,ID,NUMBER");
	strcpy(yy_tErrorMessage[30],"缺少《关系》!");
	strcpy(yy_tErrorMessage[31],"变量名不能和过程名相同!");
	strcpy(yy_tErrorMessage[32],"标识符重复定义!");
	strcpy(yy_tErrorMessage[33],"未定义标识符!");
	strcpy(yy_tErrorMessage[34],"不能直接引用过程名!");
	strcpy(yy_tErrorMessage[35],"不能从real转换为integer类型!");
	strcpy(yy_tErrorMessage[39],"只有integer和integer才能比较!");
	strcpy(yy_tErrorMessage[40],"不能这样调用过程!");
	strcpy(yy_tErrorMessage[41],"");
	strcpy(yy_tErrorMessage[42],"");
	strcpy(yy_tErrorMessage[43],"");
};

void reportyuyierror()
{
	cout<<endl;
	errorvalue.ErrorAddress=yy_nErrorAddress;
	errorvalue.ErrorNumber=yy_nErrorNum;
	cout<<yy_tErrorMessage[errorvalue.ErrorNumber]<<endl;
	cout<<"错误的号为"<<errorvalue.ErrorAddress<<endl;
}
int main()
{ 

    c1.scanner();
	initial();
	coutty();
	if(YuYiFengXi()) coutgen();

	else reportyuyierror();
   return 0;
}


int merge(int link1, int link2, int p)
{
	if (link1==0) return link2;
	int a=link1;
	int b;
	while (1)
	{
		switch (p)
		{
		case 2:
			b=quad[a].arg1.fl;
			break;
		case 3:
			b=quad[a].arg2.fl;
			break;
		case 4:
			b=quad[a].result.fl;
			break;
		default:
			b=0;
		}
		if (b==0)
		{
			switch (p)
			{
			case 2:
				quad[a].arg1.fl=link2;
				break;
			case 3:
				quad[a].arg2.fl=link2;
				break;
			case 4:
				quad[a].result.fl=link2;
				break;
			default :
				;
			}
			return link1;
		}
		else
		{
			a=b;
		}
	}
}
int newtemp(int t)
{
	for (int i=leveltab[quanjuvalue.currbl].temp;i<quanjuvalue.tempp;i++)
		if ((temptab[i].used==0) && (temptab[i].typ==t))
		{
			temptab[i].used=1;
			return i;
		}
	temptab[quanjuvalue.tempp].used=1;
	temptab[quanjuvalue.tempp].typ=t;
	temptab[quanjuvalue.tempp].taddr=leveltab[quanjuvalue.currbl].recl;
	leveltab[quanjuvalue.currbl].recl+=t;
	return quanjuvalue.tempp++;
}

void coutty()
{  
	printf("二元式如下---------------》\n");
	int i=0;char b[20];char a[20];
	cout.setf(ios::left,ios::adjustfield);
	cout.width(15);
	cout<<"二元式";
	cout.width(15);
	cout<<"对应的单词";
	cout.width(15);
	cout<<"二元式";
	cout.width(15);
	cout<<"对应的单词";
	cout<<endl;


	
	
	while(i<c1.cur_ty)
	{
	 
	    
		itoa(yy_tCifa[i].value,b,10);
		itoa(yy_tCifa[i].type,a,10);
		int blen=strlen(b);
		b[blen]=')';
		b[blen+1]='\0';
		cout<<"("<<a<<",";
		cout.width(12);
		cout<<b;
		cout.width(15);
		cout<<yy_tCifa[i].text;
		i++;
		if(i>=c1.cur_ty) break;

		itoa(yy_tCifa[i].value,b,10);
		itoa(yy_tCifa[i].type,a,10);
		blen=strlen(b);
		b[blen]=')';
		b[blen+1]='\0';
		cout<<"("<<a<<",";
		cout.width(12);
		cout<<b;
		cout.width(15);
		cout<<yy_tCifa[i].text;
		i++;
	    cout<<endl;
	}
}

⌨️ 快捷键说明

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