📄 ll1-yuyi.cpp
字号:
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 + -