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

📄 yufa.cpp

📁 编译原理
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			addop=sym;//............................
			sym=getsym(fin);
			term(fin);
			if(addop=minus)//................................
				gen(opr,0,1);//..............................
		}
		else 
		{
			term(fin);
		}
        while(sym==plus||sym==minus)
		{
			addop=sym;
			//读下个单词
			sym=getsym(fin);
			term(fin);
			if(addop==plus)
				gen(opr,0,2);
			else
				gen(opr,0,3);
		}
	}


void term(FILE *fin)//项的实现
	{
		symbol mulop;
		factor(fin);
		while(sym==times||sym==slash)
		{
			mulop=sym;//.......................................
			//读下个单词
			sym=getsym(fin);
			factor(fin);
			if(mulop==times)
				gen(opr,0,4);
			else
				gen(opr,0,5);
		}
	}

void factor(FILE *fin)//因子的实现
	{
		int p;
		if(sym!=ident)
		{
			if(sym!=number)
			{
				if(sym==lparen)
				{   				
					
					i++;
					//读下个单词
					sym=getsym(fin);
					expression(fin);
					if(sym==rparen)
					{
						j++;
						sym=getsym(fin);
					}
					else errorby(21,fin,lineno);
				}
				else errorby(21,fin,lineno);
			}
			else 
			{
				gen(lit,0,num);
				sym=getsym(fin);
			}
		}
		else 
		{
			////////////////////////////////////////
			p=position(id);
			if(p==-1)
				errorby(10,fin,lineno);
			else
			{
				switch (table[p].kind)
				{
				case constant:{gen(lit,0,table[p].val);break;}
				case variable:{gen(lod,Lev-table[p].level,table[p].adr);break;}
				case procedur:errorby(20,fin,lineno);
				}
			}
			///////////////////////////////////////
			sym=getsym(fin);
		}
	}

void condition(FILE *fin)//条件语句的实现
	{
		int cx1;//................................
		beginfunc("条件语句开始");
		if(sym==ifsym)
		{
			sym=getsym(fin);
			tiaojian(fin);
			if(sym!=thensym) 
			{
				errorby(15,fin,lineno);
			}//出错处理
			else 
			{
				sym=getsym(fin);
				cx1=cx;//..............................
				gen(jpc,0,0);//.............................
				k=k+m;
				sentence(fin);
				code[cx1].a=cx;//.....................................
			}
		}
		else 
		{
			errorby(6,fin,lineno);
		}
		endfunc("条件语句结束");
	}
void callsymh(FILE *fin)//<写语句>的实现
	{
	int p;	
		beginfunc("过程调用语句");
		if(sym!=callsym) 
		{
			errorby(6,fin,lineno);
		}
		else
			{
				sym=getsym(fin);
				if(sym!=ident)					
				{
					errorby(7,fin,lineno);
				}
				else
				{
					//////////////////////////////////////
					p=position(id);
					if(p==-1)
						errorby(10,fin,lineno);
					else
					{
						if(table[p].kind==procedur)
							gen(cal,Lev-table[p].level,code[table[p].adr].a);
						else
							errorby(14,fin,lineno);
					}
					/////////////////////////////////////////
					sym=getsym(fin);
				}
			}
		endfunc("过程调用结束");
	}
void whilesymh(FILE *fin)//<当型循环语句>的实现
	{
		int cx1,cx2;
		beginfunc("当循环语句");
		if(sym==whilesym)
			{
				cx1=cx;
				sym=getsym(fin);
				tiaojian(fin);
				cx2=cx;
				gen(jpc,0,0);
				if(sym!=dosym) 
				{
					errorby(17,fin,lineno);
				}
				else 
				{
					sym=getsym(fin);
					k=k+m;
					sentence(fin);
					gen(jmp,0,cx1);
					code[cx2].a=cx;
				}
			}
	endfunc("当循环语句结束");
	}
void beginsymh(FILE *fin)//<复合语句>的实现
	{	
		beginfunc("复合语句");
		if(sym==beginsym)
			{
				sym=getsym(fin);
				sentence(fin);
				while(sym==semicolon)
				{
					sym=getsym(fin);
					sentence(fin);
				}
				if(sym!=endsym)
				{
					errorby(16,fin,lineno);
				}
				else 
				{
					sym=getsym(fin);
				}
			}
		endfunc("复合语句结束");
	}
void readsymh(FILE *fin)//<读语句>的实现
	{
		int p;
		beginfunc("读语句");
		if(sym==readsym)
		{
			sym=getsym(fin);
			if(sym!=lparen)
			{
				errorby(7,fin,lineno);
			}
			else
			{
				sym=getsym(fin);
				if(sym==ident)
				{
					//...........................
					p=position(id);
					if(p==-1)
						errorby(10,fin,lineno);
					else
					{
						gen(opr,0,16);
						gen(sto,Lev-table[p].level,table[p].adr);
					}
					//........................
					sym=getsym(fin);
					while(sym==comma)
					{
						sym=getsym(fin);
						if(sym!=ident)
						{
							errorby(7,fin,lineno);
						}
						else 
						{//...........................................
							p=position(id);
							if(p==-1)
							errorby(10,fin,lineno);
							else
							{
								gen(opr,0,16);
								gen(sto,Lev-table[p].level,table[p].adr);
							}//.........................................
							sym=getsym(fin);
						}
					}
					if(sym!=rparen)
					{
						errorby(21,fin,lineno);
					}
					else
					{
						sym=getsym(fin);	
					}
				}
			}
		}
	endfunc("读语句结束");
	}

void writesymh(FILE *fin)//<写语句>的实现
	{
		beginfunc("写语句");
		if(sym==writesym)
			{
				sym=getsym(fin);
				if(sym!=lparen)
				{
					errorby(7,fin,lineno);
				}
				else 
				{
					sym=getsym(fin);
					expression(fin);
					gen(opr,0,14);//....................................
					while(sym==comma)
					{
						sym=getsym(fin);
						expression(fin);
						gen(opr,0,14);//.....................................
					}
					if(sym!=rparen)
					{
						errorby(21,fin,lineno);
					}
					else 
					{
						sym=getsym(fin);
					}
				}
				gen(opr,0,15);//......................................
			}
		endfunc("写语句结束");
	}
int base(int l)
{
	int b1;
	b1=b;
	while (l>0)
	{
		b1=s[b1];
		l=l-1;
	}
	return b1;
}
void interpret()
{
	printf("pl0程序开始:\n");
	t=0;b=1;p=0;
	s[1]=0;s[2]=0;s[3]=0;
	do
	{
		i1=code[p];
		p=p+1;
		switch(i1.f)
		{
		case lit:{t=t+1;s[t]=i1.a;break;}
		case opr:{
					switch(i1.a)
						{
					case 0:	{t=b-1;p=s[t+3];b=s[t+2];break;}
					case 1:{s[t]=-s[t];break;}
					case 2:{t=t-1;s[t]=s[t]+s[t+1];break;}
					case 3:{t=t-1;s[t]=s[t]-s[t+1];break;}
					case 4:{t=t-1;s[t]=s[t]*s[t+1];break;}
					case 5:{t=t-1;s[t]=s[t]/s[t+1];break;}
					case 6:{s[t]=s[t]%2;break;}
					case 8:{t=t-1;s[t]=(s[t]==s[t+1]);break;}
					case 9:{t=t-1;s[t]=(s[t]!=s[t+1]);break;}
					case 10:{t=t-1;s[t]=(s[t]<s[t+1]);break;}
					case 11:{t=t-1;s[t]=(s[t]>=s[t+1]);break;}
					case 12:{t=t-1;s[t]=(s[t]>s[t+1]);break;}
					case 13:{t=t-1;s[t]=(s[t]<=s[t+1]);break;}
					case 14:{printf("%d",s[t]);break;}
					case 15:{printf("\n");break;}
					case 16:{printf(" ? ");t=t+1;scanf("%d",(&s[t]));break;}
						}
					break;
				 }
		case lod:{
					t=t+1;
					s[t]=s[base(i1.l)+i1.a];
					break;
				 }
		case sto:{
					s[base(i1.l)+i1.a]=s[t];
					t=t-1;
					break;
				 }
		case cal:{
					s[t+1]=base(i1.l);
					s[t+2]=b;
					s[t+3]=p;
					b=t+1;
					p=i1.a;
					break;
				 }
		case inte:{t=t+i1.a;break;}
		case jmp:{p=i1.a;break;}
		case jpc:{
					if(s[t]==0)
						p=i1.a;
					t=t-1;
					break;
				 }
		}
	}while(p!=0);
}
void printfct(fct fct1)
{
	switch(fct1)
	{
	case lit:{printf("%10s","lit");break;}
	case opr:{printf("%10s","opr");break;}
	case lod:{printf("%10s","lod");break;}
	case sto:{printf("%10s","sto");break;}
	case cal:{printf("%10s","cal");break;}
	case inte:{printf("%10s","inte");break;}
	case jmp:{printf("%10s","jmp");break;}
	case jpc:{printf("%10s","jpc");break;}
	}
}
void main()
	{
			int p=system( "lexyy.exe" );
			FILE *fin=fopen("outputfile.txt","r");
			sym=getsym(fin);
			strcpy(table[ptx].name,"main");
			enter(procedur,&ptx,0,&pdx);
			program(fin);
			if(i!=j)errorby(21,fin,lineno);
			if(flag==1)printf("this is right\n");
			else printf("this is wrong\n");
			printf("总共有错误%5d个\n",errortotal);
			for(int i=0;i<errortotal;i++)
			printf("%s\n",error[i]);
			for(i=0;i<ptx;i++)
			{
				if(table[i].kind==constant)
				printf("%10s%5s%5d%5d\n","constant",table[i].name,table[i].level,table[i].val);
				if(table[i].kind==variable)
				printf("%10s%5s%5d%5d\n","variable",table[i].name,table[i].level,table[i].adr);
				if(table[i].kind==procedur)
				printf("%10s%5s%5d%5d\n","procedur",table[i].name,table[i].level,table[i].size);
			}
			for(i=0;i<cx;i++)
			{
				printfct(code[i].f);
				printf("%5d%5d\n",code[i].l,code[i].a);
			}
			if(errortotal==0)
				interpret();
	}

⌨️ 快捷键说明

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