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

📄 pl0.cpp

📁 编译方法课程设计PL0词法分析
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			gen(sto,lev-table[i].cvp.vp.level,table[i].cvp.vp.adr);
	}
	else
	{
		if(sym==readsym)
		{
			getsym();
			if(sym!=lparen)
				error(34);
			else
			{
				do
				{
					getsym();
					if(sym==ident)
						i=position(id,tx);
					else 
						i=0;
					if(i==0)
						error(35);
					else
					{
						gen(opr,0,16);
						gen(sto,lev-table[i].cvp.vp.level,table[i].cvp.vp.adr);
					}
					getsym();
				}while(sym==comma);
				if(sym!=rparen)
				{
					error(33);
					while(!insymbol(fsys))
						getsym();
				}
				else 
					getsym();
			}
		}
		else
		{
			if(sym==writesym)
			{
				getsym();
				if(sym==lparen)
				{
					reset(ss);
					additem(ss,rparen);
					additem(ss,comma);
					mergeset(ss,fsys);
					do
					{
						getsym();
						expression(ss,tx,lev);
						gen(opr,0,14);
					}while(sym==comma);
					if(sym!=rparen)
						error(33);
					else
						getsym();
				}
				gen(opr,0,15);
			}
			else
			{
				if(sym==callsym)
				{
					getsym();
					if(sym!=ident)
						error(14);
					else
					{
						i=position(id,tx);
						if(i==0)
							error(11);
						else
							if(table[i].kind=procedur)
								gen(cal,lev-table[i].cvp.vp.level,table[i].cvp.vp.adr);
							else
								error(15);
						getsym();
					}
				}
				else
				{
					if(sym==ifsym)
					{
						getsym();
						reset(ss);
						additem(ss,thensym);
						additem(ss,dosym);
						mergeset(ss,fsys);
						condition(ss,tx,lev);
						if(sym==thensym)
							getsym();
						else
							error(16);
						cx1=cx;
						gen(jpc,0,0);
						statement(fsys,tx,lev);
						code[cx].a=cx;
					}
					else
					{
						if(sym==beginsym)
						{
							getsym();
							reset(ss);
							additem(ss,semicolon);
							additem(ss,endsym);
							mergeset(ss,fsys);
							statement(ss,tx,lev);
							reset(ss);
							additem(ss,semicolon);
							mergeset(ss,statbegsys);
							while(insymbol(ss))
							{
								if(sym==semicolon)
									getsym();
								else
									error(10);
								reset(ss);
								additem(ss,semicolon);
								additem(ss,endsym);
								mergeset(ss,fsys);
								statement(ss,tx,lev);
								reset(ss);
								additem(ss,semicolon);
								mergeset(ss,statbegsys);
							}
							if(sym==endsym)
								getsym();
							else
								error(17);
						}
						else
						{
							if(sym==whilesym)
							{
								cx1=cx;
								getsym();
								reset(ss);
								additem(ss,dosym);
								mergeset(ss,fsys);
								condition(ss,tx,lev);
								cx2=cx;
								gen(jpc,0,0);
								if(sym==dosym)
									getsym();
								else
									error(18);
								statement(fsys,tx,lev);
								gen(jmp,0,cx1);
								code[cx2].a=cx;
							}
						}
					}
				}
			}
		}
	}
	reset(ss);
	test(fsys,ss,19);
}

void expression (symset fsys,int tx,int lev)
{
	symbol addop;
	symset ss;
	reset(ss);
	additem(ss,plus);
	additem(ss,minus);
	if(insymbol(ss))
	{
		addop=sym;
		getsym();
		mergeset(ss,fsys);
		term(ss,tx,lev);
		if(addop==minus)
			gen(opr,0,1);
	}
	else
	{
		mergeset(ss,fsys);
		term(ss,tx,lev);
	}
	reset(ss);
	additem(ss,plus);
	additem(ss,minus);
	while(insymbol(ss))
	{
		addop=sym;
		getsym();
		mergeset(ss,fsys);
		term(ss,tx,lev);
		if(addop==plus)
			gen(opr,0,2);
		else
			gen(opr,0,3);
		reset(ss);
		additem(ss,plus);
		additem(ss,minus);
	}
}


void term (symset fsys,int tx,int lev)
{
	symbol mulop;
	symset ss;
	reset(ss);
	additem(ss,times);
	additem(ss,slash);
	mergeset(ss,fsys);
	factor(ss,tx,lev);
	reset(ss);
	additem(ss,times);
	additem(ss,slash);
	while(insymbol(ss))
	{
		mulop=sym;
		getsym();
		reset(ss);
		additem(ss,times);
		additem(ss,slash);
		mergeset(ss,fsys);
		factor(ss,tx,lev);
		if(mulop==times)
			gen(opr,0,4);
		else
			gen(opr,0,5);
		reset(ss);
		additem(ss,times);
		additem(ss,slash);
	}
}

void factor(symset fsys,int tx,int lev)
{
	int i;
	symset ss;
	test(facbegsys,fsys,24);
	while(insymbol(facbegsys))
	{
		if(sym==ident)
		{
			i=position(id,tx);
			if(i==0)
				error(11);
			else
				switch(table[i].kind)
				{
					case constant:
						 gen(lit,0,table[i].cvp.val);
						 break;
					case variable:
						 gen(lod,lev-table[i].cvp.vp.level,table[i].cvp.vp.adr);
						 break;
					case procedur:
						 error(21);
				}
			getsym();
		}
		else
		{
			if(sym==number)
			{
				if(num>amax)
				{
					error(31);
					num=0;
				}
				gen(lit,0,num);
				getsym();
			}
			else
			{
				if(sym==lparen)
				{
					getsym();
					reset(ss);
					additem(ss,rparen);
					mergeset(ss,fsys);
					expression(ss,tx,lev);
					if(sym==rparen)
						getsym();
					else
						error(22);
				}
			}
		}
		test(fsys,facbegsys,23);
	}
}

void condition (symset fsys,int tx,int lev)
{
	symbol relop;
	symset ss;
	if(sym==oddsym)
	{
		getsym();
		expression(fsys,tx,lev);
		gen(opr,0,6);
	}
	else
	{
		reset(ss);
		additem(ss,eql);
		additem(ss,neq);
		additem(ss,lss);
		additem(ss,leq);
		additem(ss,gtr);
		additem(ss,geq);
		mergeset(ss,fsys);
		expression(ss,tx,lev);
		reset(ss);
		additem(ss,eql);
		additem(ss,neq);
		additem(ss,lss);
		additem(ss,leq);
		additem(ss,gtr);
		additem(ss,geq);
		if(!insymbol(ss))
			error(20);
		else
		{
			relop=sym;
			getsym();
			expression(fsys,tx,lev);
			switch(relop)
			{
				case eql:
					 gen(opr,0,8);
					 break;
				case neq:
					 gen(opr,0,9);
					 break;
				case lss:
					 gen(opr,0,10);
					 break;
				case geq:
					 gen(opr,0,11);
					 break;
				case gtr:
					 gen(opr,0,12);
					 break;
				case leq:
					 gen(opr,0,13);
			}
		}
	}
}

void interpret ()
{
	int p,b,t;
	instruction i;
	int s[stacksize+1];
	printf("start pl0\n");
	t=0;
	b=1;
	p=0;
	s[1]=0;
	s[2]=0;
	s[3]=0;
	do
	{
		i=code[p];
		p++;
		switch(i.f)
		{
			case lit:
				 t++;
				 s[t]=i.a;
				 break;
			case opr:
				 switch(i.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--;
						  s[t]+=s[t+1];
						  break;
					 case 3:
						  t--;
						  s[t]-=s[t+1];
						  break;	
					 case 4:
						  t--;
						  s[t]*=s[t+1];
						  break;	
					 case 5:
						  t--;
						  s[t]/=s[t+1];
						  break;
					 case 6:
						  if(s[t]%2)
							  s[t]=1;
						  else
							  s[t]=0;
						  break;	
					 case 8:
						  t--;
						  if(s[t]==s[t+1])
							  s[t]=1;
						  else
							  s[t]=0;
						  break;
					 case 9:
						  t--;
						  if(s[t]!=s[t+1])
							  s[t]=1;
						  else
							  s[t]=0;
						  break;	
					 case 10:
						  t--;
						  if(s[t]<s[t+1])
							  s[t]=1;
						  else
							  s[t]=0;
						  break;	
					 case 11:
						  t--;
						  if(s[t]>=s[t+1])
							  s[t]=1;
						  else
							  s[t]=0;
						  break;
					 case 12:
						  t--;
						  if(s[t]>s[t+1])
							  s[t]=1;
						  else
							  s[t]=0;
						  break;	
					 case 13:
						  t--;
						  if(s[t]<=s[t+1])
							  s[t]=1;
						  else
							  s[t]=0;
						  break;	
					 case 14:
						  printf(" %d",s[t]);
						  fprintf(fa2," %d",s[t]);
						  t--;
						  break;
					 case 15:
						  printf("\n");
						  fprintf(fa2,"\n");
						  break;	
					 case 16:
						  t++;
						  printf("?");
						  fprintf(fa2,"?");
						  scanf("%d",&s[t]);
						  fprintf(fa2,"%d",s[t]);
				 }
				 break;
			case lod:
				 t++;
				 s[t]=s[base(i.l,b,s)+i.a];
				 break;
			case sto:
				 s[base(i.l,b,s)+i.a]=s[t];
				 t--;
				 break;
			case cal:
				 s[t+1]=base(i.l,b,s);
				 s[t+2]=b;
				 s[t+3]=p;
				 b=t+1;
				 p=i.a;
				 break;
			case int0:
				 t+=i.a;
				 break;
			case jmp:
				 p=i.a;
				 break;
			case jpc:
				 if(!s[t])
					 p=i.a;
				 t--;
				 break;
		}
	}while(p!=0);
	fclose(fa2);
}

int base (int l,int b,int s[])
{
	int b1;
	b1=b;
	while(l>0)
	{
		b1=s[b1];
		l--;
	}
	return b1;
}

int main ()
{
	symset ss;
	for(ch=0;ch<62;ch++)
		ssym[ch]=nul;
	strcpy(word[1],"begin    ");
	word[1][9]=' ';
	strcpy(word[2],"call     ");
	word[2][9]=' ';
	strcpy(word[3],"const    ");
	word[3][9]=' ';
	strcpy(word[4],"do       ");
	word[4][9]=' ';
	strcpy(word[5],"end      ");
	word[5][9]=' ';
	strcpy(word[6],"if       ");
	word[6][9]=' ';
	strcpy(word[7],"odd      ");
	word[7][9]=' ';
	strcpy(word[8],"procedure");
	word[8][9]=' ';
	strcpy(word[9],"read     ");
	word[9][9]=' ';
	strcpy(word[10],"then     ");
	word[10][9]=' ';
	strcpy(word[11],"var      ");
	word[11][9]=' ';
	strcpy(word[12],"while    ");
	word[12][9]=' ';
	strcpy(word[13],"write    ");
	word[13][9]=' ';

	wsym[1]=beginsym;
	wsym[2]=callsym;
	wsym[3]=constsym;
	wsym[4]=dosym;
	wsym[5]=endsym;
	wsym[6]=ifsym;
	wsym[7]=oddsym;
	wsym[8]=procsym;
	wsym[9]=readsym;
	wsym[10]=thensym;
	wsym[11]=varsym;
	wsym[12]=whilesym;
	wsym[13]=writesym;

	ssym['+']=plus;
	ssym['-']=minus;
	ssym['*']=times;
	ssym['/']=slash;
	ssym['(']=lparen;
	ssym[')']=rparen;
	ssym['=']=eql;
	ssym[',']=comma;
	ssym['.']=period;
	ssym['#']=neq;
	ssym[';']=semicolon;

	strcpy(mnemonic[lit],"lit ");
//	mnemonic[lit][4]=' ';
	strcpy(mnemonic[opr],"opr ");
//	mnemonic[opr][4]=' ';
	strcpy(mnemonic[lod],"lod ");
//	mnemonic[lod][4]=' ';
	strcpy(mnemonic[sto],"sto ");
//	mnemonic[sto][4]=' ';
	strcpy(mnemonic[cal],"cal ");
//	mnemonic[cal][4]=' ';
	strcpy(mnemonic[int0],"int0");
//	mnemonic[int0][4]=' ';
	strcpy(mnemonic[jmp],"jmp ");
//	mnemonic[jmp][4]=' ';
	strcpy(mnemonic[jpc],"jpc ");
//	mnemonic[jpc][4]=' ';
	
	reset(declbegsys);
	additem(declbegsys,constsym);
	additem(declbegsys,varsym);
	additem(declbegsys,procsym);

	reset(statbegsys);
	additem(statbegsys,beginsym);
	additem(statbegsys,callsym);
	additem(statbegsys,ifsym);
	additem(statbegsys,whilesym);

	reset(facbegsys);
	additem(facbegsys,ident);
	additem(facbegsys,number);
	additem(facbegsys,lparen);

//	printf("input file: ");
//	fprintf(fa1,"input file: ");
//	scanf("%s",fname);
//	fprintf(fa1,"%s\n",fname);

	if((fin=fopen("fin.txt","r"))==NULL)
	{
		printf("Can't open fin.txt");
		return 0;
	}
	if((fa=fopen("fa.txt","w"))==NULL)
	{
		printf("Can't open fa.txt");
		return 0;
	}
	if((fa1=fopen("fa1.txt","w"))==NULL)
	{
		printf("Can't open fa1.txt");
		return 0;
	}
	if((fa2=fopen("fa2.txt","w"))==NULL)
	{
		printf("Can't open fa2.txt");
		return 0;
	}

//	printf("list object code? ");
//	scanf("%s",fname);
//	fprintf(fa1,"list object code? %c",fname[0]);
//	listswitch=(fname[0]=='y');
	listswitch=1;
	err=0;
	cc=0;
	cx=0;
	ll=0;
	ch=' ';
	kk=al;
	getsym();

	reset(ss);
	additem(ss,period);
	mergeset(ss,declbegsys);
	mergeset(ss,statbegsys);
	block(0,0,ss);
	fclose(fa);
	fclose(fa1);
	if(sym!=period)
		error(9);
	if(err==0)
		interpret();
	else 
		printf("errors in pl0 program");
	printf("end pl0\n");
	return 0;
}

⌨️ 快捷键说明

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