#include<iostream>
#include<cstdio>
#include<string>
#include<map>
#include<cstring>
using namespace std;
const int MAX_N=1010;
int st1[MAX_N],tot1=0,tot2=0;
char st2[MAX_N];
string LR[15][15]={
{"s5"," "," ","s4"," "," ","1","2","3"},
{" ","s6"," "," "," ","acc"," "," "," "},
{" ","r2","s7"," ","r2","r2"," "," "," "},
{" ","r4","r4"," ","r4","r4"," "," "," "},
{"s5"," "," ","s4"," "," ","8","2","3"},
{" ","r6","r6"," ","r6","r6"," "," "," "},
{"s5"," "," ","s4"," "," "," ","9","3"},
{"s5"," "," ","s4"," "," "," "," ","10"},
{" ","s6"," "," ","s11"," "," "," "," "},
{" ","r1","s7"," ","r1","r1"," "," "," "},
{" ","r3","r3"," ","r3","r3"," "," "," "},
{" ","r5","r5"," ","r5","r5"," "," "," "}
};
string str[10]={"","E+T->E","T->E","T*F->T","F->T","(E)->F","a->F"};
int pp[10]={0,3,1,3,1,3,1};
char ps[10]={' ','E','E','T','T','F','F'};
map<char,int>ma;
int main(void){
string s;
cin>>s;
st1[++tot1]=0,st2[++tot2]='#';
int st=0;
ma['a']=0,ma['+']=1,ma['*']=2,ma['(']=3,ma[')']=4;
ma['#']=5,ma['E']=6,ma['T']=7,ma['F']=8;
while(1){
int y=ma[s[st]];
int x=st1[tot1];
string ss=LR[x][y];
/*for(int i=1;i<=tot1;i++)
cout<<st1[i];
cout<<" ";
for(int i=1;i<=tot2;i++)
cout<<st2[i];
cout<<"\n";*/
if(ss[0]=='s'){
int t=0;
for(int i=1;i<ss.length();i++)
t=t*10+(ss[i]-'0');
st1[++tot1]=t;
st2[++tot2]=s[st];
st++;
}
else if(ss[0]=='r'){
int t=0;
for(int i=1;i<ss.length();i++)
t=t*10+(ss[i]-'0');
cout<<str[t]<<"\n";
tot2-=pp[t];
st2[++tot2]=ps[t];
tot1--;
string sss=LR[st1[tot1]][ma[ps[t]]];
if(sss[0]==' '){
tot1--;
continue;
}
t=0;
for(int i=0;i<sss.length();i++)
t=t*10+(sss[i]-'0');
st1[++tot1]=t;
}
else if(ss=="acc"){
printf("YES\n");
break;
}
else if(ss[0]==' '){
printf("NO\n");
break;
}
else{
int t=0;
for(int i=0;i<ss.length();i++)
t=t*10+(ss[i]-'0');
st1[++tot1]=t;
}
}
return 0;
}
实验四 LR语法分析器
最新推荐文章于 2024-03-19 13:56:14 发布