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

📄 ll1-yuyi.cpp

📁 ll(1)语义分析器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	backpatch(vnext[11].tnext[vnext[11].ttop],vnext[13].tnext[vnext[13].ttop]);
	vnext[14].tnext[++vnext[14].ttop]=vnext[13].tnext[vnext[13].ttop];
	vnext[14].fnext[++vnext[14].ftop]=merge(vnext[11].fnext[vnext[11].ftop],vnext[13].fnext[vnext[13].ftop]);
}
void s25()//e->hg
{
	int t, p;
	t=hval.place[hval.top];
	p=gval.place[gval.top];
	hval.top--;
	gval.top--;
	if(p==-1)
	{
		eval.place[++eval.top]=t;
		return;
	}
	if(t/1000==0 && p/1000==0)
	{
		eval.place[++eval.top]=p+t;
		emit("+","",t,"",p,"",p+t);
	}
	else if(t/1000==0 && p/1000==1)
	{
		eval.place[++eval.top]=2000+varicount;
		emit("+","",t,symbol[p-1000].idname,-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==0 && p/1000==2)
	{
		eval.place[++eval.top]=2000+varicount;
		emit("+","",t,newvari[p-2000],-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==1 && p/1000==0)
	{
		eval.place[++eval.top]=2000+varicount;
		emit("+",symbol[t-1000].idname,-1,"",p,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==1 && p/1000==1)
	{
		eval.place[++eval.top]=2000+varicount;
		emit("+",symbol[t-1000].idname,-1,symbol[p-1000].idname,-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==1 && p/1000==2)
	{
		eval.place[++eval.top]=2000+varicount;
		emit("+",symbol[t-1000].idname,-1,newvari[p-2000],-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==2 && p/1000==0)
	{
		eval.place[++eval.top]=2000+varicount;
		emit("+",newvari[t-2000],-1,"",p,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==2 && p/1000==1)
	{
		eval.place[++eval.top]=2000+varicount;
		emit("+",newvari[t-1000],-1,symbol[p-1000].idname,-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==2 && p/1000==2)
	{
		eval.place[++eval.top]=2000+varicount;
		emit("+",newvari[t-2000],-1,newvari[p-2000],-1,newvari[varicount],0);
		varicount++;
	}
	else
		printf("error\n");
}
void s26()//g->+hg
{
	int t, p;
	t=hval.place[hval.top];
	p=gval.place[gval.top];
	hval.top--;
	if(p==-1)
	{
		gval.place[gval.top]=t;
		return;
	}
	if(t/1000==0 && p/1000==0)
	{
		gval.place[gval.top]=p+t;
		emit("+","",t,"",p,"",p+t);
	}
	else if(t/1000==0 && p/1000==1)
	{
		gval.place[gval.top]=2000+varicount;
		emit("+","",t,symbol[p-1000].idname,-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==0 && p/1000==2)
	{
		gval.place[gval.top]=2000+varicount;
		emit("+","",t,newvari[p-2000],-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==1 && p/1000==0)
	{
		gval.place[gval.top]=2000+varicount;
		emit("+",symbol[t-1000].idname,-1,"",p,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==1 && p/1000==1)
	{
		gval.place[gval.top]=2000+varicount;
		emit("+",symbol[t-1000].idname,-1,symbol[p-1000].idname,-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==1 && p/1000==2)
	{
		gval.place[gval.top]=2000+varicount;
		emit("+",symbol[t-1000].idname,-1,newvari[p-2000],-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==2 && p/1000==0)
	{
		gval.place[gval.top]=2000+varicount;
		emit("+",newvari[t-2000],-1,"",p,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==2 && p/1000==1)
	{
		gval.place[gval.top]=2000+varicount;
		emit("+",newvari[t-1000],-1,symbol[p-1000].idname,-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==2 && p/1000==2)
	{
		gval.place[gval.top]=2000+varicount;
		emit("+",newvari[t-2000],-1,newvari[p-2000],-1,newvari[varicount],0);
		varicount++;
	}
	else
		printf("error\n");
}
void s27()
{
	gval.place[++gval.top]=-1;
}
void s28()
{
	int t, p;
	t=pval.place[pval.top];
	p=rval.place[rval.top];
	pval.top--;
	rval.top--;
	if(p==-1)
	{
		hval.place[++hval.top]=t;
		return;
	}
	if(t/1000==0 && p/1000==0)
	{
		hval.place[++hval.top]=p+t;
		emit("*","",t,"",p,"",p+t);
	}
	else if(t/1000==0 && p/1000==1)
	{
		hval.place[++hval.top]=2000+varicount;
		emit("*","",t,symbol[p-1000].idname,-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==0 && p/1000==2)
	{
		hval.place[++hval.top]=2000+varicount;
		emit("*","",t,newvari[p-2000],-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==1 && p/1000==0)
	{
		hval.place[++hval.top]=2000+varicount;
		emit("*",symbol[t-1000].idname,-1,"",p,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==1 && p/1000==1)
	{
		hval.place[++hval.top]=2000+varicount;
		emit("*",symbol[t-1000].idname,-1,symbol[p-1000].idname,-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==1 && p/1000==2)
	{
		hval.place[++hval.top]=2000+varicount;
		emit("*",symbol[t-1000].idname,-1,newvari[p-2000],-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==2 && p/1000==0)
	{
		hval.place[++hval.top]=2000+varicount;
		emit("*",newvari[t-2000],-1,"",p,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==2 && p/1000==1)
	{
		hval.place[++hval.top]=2000+varicount;
		emit("*",newvari[t-1000],-1,symbol[p-1000].idname,-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==2 && p/1000==2)
	{
		hval.place[++hval.top]=2000+varicount;
		emit("*",newvari[t-2000],-1,newvari[p-2000],-1,newvari[varicount],0);
		varicount++;
	}
	else
		printf("error\n");
}
void s29()
{
	int t, p;
	t=pval.place[pval.top];
	p=rval.place[rval.top];
	pval.top--;
	if(p==-1)
	{
		rval.place[rval.top]=t;
		return;
	}
	if(t/1000==0 && p/1000==0)
	{
		rval.place[rval.top]=p+t;
		emit("*","",t,"",p,"",p+t);
	}
	else if(t/1000==0 && p/1000==1)
	{
		rval.place[rval.top]=2000+varicount;
		emit("*","",t,symbol[p-1000].idname,-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==0 && p/1000==2)
	{
		rval.place[rval.top]=2000+varicount;
		emit("*","",t,newvari[p-2000],-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==1 && p/1000==0)
	{
		rval.place[rval.top]=2000+varicount;
		emit("*",symbol[t-1000].idname,-1,"",p,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==1 && p/1000==1)
	{
		rval.place[rval.top]=2000+varicount;
		emit("*",symbol[t-1000].idname,-1,symbol[p-1000].idname,-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==1 && p/1000==2)
	{
		rval.place[rval.top]=2000+varicount;
		emit("*",symbol[t-1000].idname,-1,newvari[p-2000],-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==2 && p/1000==0)
	{
		rval.place[rval.top]=2000+varicount;
		emit("*",newvari[t-2000],-1,"",p,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==2 && p/1000==1)
	{
		rval.place[rval.top]=2000+varicount;
		emit("*",newvari[t-1000],-1,symbol[p-1000].idname,-1,newvari[varicount],0);
		varicount++;
	}
	else if(t/1000==2 && p/1000==2)
	{
		rval.place[rval.top]=2000+varicount;
		emit("*",newvari[t-2000],-1,newvari[p-2000],-1,newvari[varicount],0);
		varicount++;
	}
	else
		printf("error\n");
}
void s30()
{
	rval.place[++rval.top]=-1;
}
void s31()
{
	pval.place[++pval.top]=eval.place[eval.top-1];
	eval.top--;
}
void s32()
{
	pval.place[++pval.top]=idstack.entry[idstack.top-1]+1000;
	idstack.top--;
}
void s33()
{
	pval.place[++pval.top]=digit[tok[top-1].entry].value;
}

//语义函数
void run(int num)
{
	switch(num)
	{
	case 0: s0();
			break;
	case 1: s1();
			break;
	case 2: s2();
			break;
	case 3: s3();
			break;
	case 4: s4();
			break;
	case 5: s5();
			break;
	case 6: s6();
			break;
	case 7: s7();
			break;
	case 8: s8();
			break;
	case 9: s9();
			break;
	case 10: s10();
			break;
	case 11: s11();
			break;
	case 12: s12();
			break;
	case 13: s13();
			break;
	case 14: s14();
			break;
	case 15: s15();
			break;
	case 16: s16();
			break;
	case 17: s17();
			break;
	case 18: s18();
			break;
	case 19: s19();
			break;
	case 20: s20();
			break;
	case 21: s21();
			break;
	case 22: s22();
			break;
	case 23: s23();
			break;
	case 24: s24();
			break;
	case 25: s25();
			break;
	case 26: s26();
			break;
	case 27: s27();
			break;
	case 28: s28();
			break;
	case 29: s29();
			break;
	case 30: s30();
			break;
	case 31: s31();
			break;
	case 32: s32();
			break;
	case 33: s33();
			break;

	default: break;
	}
	return;
}

void work()//预测分析器的工作
{
	int i=0;
	int x;
	int rulegene;//产生式的编号
	stack.top=0;
	stack.set[stack.top]=23;
	stack.top++;
	stack.set[stack.top]=31;

	do 
	{
			x=stack.set[stack.top];//
			if(tok[top].id==10)
				idstack.entry[++idstack.top]=tok[top].entry;
			if(x>=1000)
			{
				run(x-1000);
				stack.top--;
			}
			else if(tok[top].id== x && x<24)//栈顶为终节符,且与当前输入相同
			{
				stack.top--;
				top++;//指向下一个符号
			}
			else if(x>30)
			{
				rulegene=LL1table[x-31][tok[top].id-1];//查表得到产生式编号		
				if((rulegene==3)||(rulegene==16)||(rulegene==23)||(rulegene==27)||(rulegene==30))//若是空产生式,则弹栈
				{
					stack.top--;
					stack.set[++stack.top]=rulegene+1000;
					cout<<rulegene+1<<"\t";//输出产生式编号及产生式
					cout<<VNname[x-31]<<"->";
					cout<<VTname[23];
				}
				else
				{
					stack.top--;
					stack.set[++stack.top]=rulegene+1000;
					int length=rulegram[rulegene].length-1;
					for (int j=length;j>=0;j--)//倒着入栈
					{
						stack.top++;
						stack.set[stack.top]=rulegram[rulegene].right[j];				
					}	
					cout<<rulegene+1<<"\t";//输出产生式编号及产生式
					cout<<VNname[x-31]<<"->";
					for (j=0;j<=length;j++)
					{
						if (rulegram[rulegene].right[j]<=24)
						{
							cout<<VTname[rulegram[rulegene].right[j]-1]<<" ";//输出终节符
						}
						else
							cout<<VNname[rulegram[rulegene].right[j]-31]<<" ";//输出非终节符	
					}
				}
				cout<<endl;
			}
			else
			{
				cout<<"error!"<<endl;//文法不被接收
				return;
			}
		} while(stack.set[stack.top]!=23);
	if (stack.set[stack.top]==23 && tok[top].id==23)//判断是否分析成功
	{
		cout<<"accept!"<<endl;
	}
	else
		cout<<"error!"<<endl;
	
}
//主函数
void main()
{
	initiate();	//初始化产生式
	createtype();//构造分析表
	read(); //读token,digit,fuhao文件
	work();//匹配并调用语义程序
	outcode();//输出四元组
}

⌨️ 快捷键说明

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