📄 lr0.cpp
字号:
//朱贺 民航学院
#include<iostream.h>
#include<string.h>
#include<iomanip.h>
#include<stdlib.h>
struct stack{
int top;
int st[15]; //状态栈
char sn[15]; //符号栈
}*sign;
struct analysis{ //动作表结构
char act;
int status;
}action[][6]={
{'s',5,'$',0,'$',0, 's',4,'$',0, '$',0},
{'$',0,'s',6,'$',0, '$',0,'$',0, 'A',0},
{'$',0,'r',2,'s',7, '$',0,'r',2, 'r',2},
{'$',0,'r',4,'r',4, '$',0,'r',4, 'r',4},
{'s',5,'$',0,'$',0, 's',4,'$',0, '$',0},
{'$',0,'r',6,'r',6, '$',0,'r',6, 'r',6},
{'s',5,'$',0,'$',0, 's',4,'$',0, '$',0},
{'s',5,'$',0,'$',0, 's',4,'$',0, '$',0},
{'$',0,'s',6,'$',0, '$',0,'s',11,'$',0},
{'$',0,'r',1,'s',7, '$',0,'r',1, 'r',1},
{'$',0,'r',3,'r',3, '$',0,'r',3, 'r',3},
{'$',0,'r',5,'r',5, '$',0,'r',5, 'r',5}};
analysis G[]={{'E',3},{'E',1},{'T',3},{'T',1},{'F',3},{'F',1}}; //此文法信息
int go[][3]={1,2,3,99,99,99,99,99,99,99,99,99,8,2,3,99,99,99,99,9,3,99,99,10,99,99,99,99,99,99,99,99,99,99,99,99};
int index(char m){
int id;
if((m=='i')||(m=='E')) id=0;
else if((m=='+')||(m=='T')) id=1;
else if((m=='*')||(m=='F')) id=2;
else if(m=='(') id=3;
else if(m==')') id=4;
else if(m=='#') id=5;
else id=99;
return id;
}
void main(){
cout<<"参照文法为:\n"<<"(1)E→E+T\n"<<"(2)E→T\n"<<"(3)T→T*F'\n"\
<<"(4)T→F\n"<<"(5)F→(E)\n"<<"(6)F→i\n";
char instr[20],*current,a;
int i=0,step=0,ix1,ia,ix2,ig,iG,back;
bool flag=true;
sign=new stack;
cout<<"请输入待分析的字符串(以#结束):\n";
do{
cin>>instr[i++];
}while(instr[i-1]!='#');
instr[i]='\0';
current=instr;
sign->st[0]=0;sign->sn[0]='#';sign->sn[1]='\0';sign->top=0;
cout<<"步骤"<<setw(20)<<"状 态"<<setw(20)<<"符 号"<<setw(20)<<"输 入 串\n";
cout<<"===="<<setw(20)<<"======"<<setw(20)<<"======"<<setw(20)<<"========\n";
cout<<step++<<setw(20)<<sign->st[0]<<setw(21)<<sign->sn<<setw(21)<<instr<<endl;
while(flag){
cout<<step++<<setw(20);
a=*current;ia=index(a);
ix1=sign->st[sign->top]; //cout<<a<<" "<<ia<<" "<<ix1<<" "<<action[ix1][ia].act; //hhjhj
if(ia==99) {
cout<<"此文法无法识别该输入串!";
break;
}
if(action[ix1][ia].act=='s'){
sign->top+=1;
sign->sn[sign->top]=a;
sign->sn[(sign->top)+1]='\0';
sign->st[sign->top]=action[ix1][ia].status ;
current++;
}
else if(action[ix1][ia].act=='r'){
iG=action[ix1][ia].status-1; //零下表开始
back=G[iG].status;
sign->top-=back;
ix2=sign->st[sign->top];
ig=index(G[iG].act);
if(go[ix2][ig]!=99){
sign->top+=1;
sign->st[sign->top]=go[ix2][ig];
sign->sn[sign->top]=G[iG].act;
sign->sn[(sign->top)+1]='\0';
}
else{
cout<<"此文法无法识别该输入串!";
break;
}
}
else if(action[ix1][ia].act=='$'){
cout<<"此文法无法识别该输入串!";
break;
}
else if(action[ix1][ia].act=='A'){
flag=false;
}
for(i=0;i<=sign->top ;i++)
cout<<sign->st[i]<<" ";
cout<<setw(20-(sign->top))<<sign->sn<<setw(20-strlen(sign->sn))<<current<<endl;
if(flag==false) cout<<"文法分析成功!"<<endl;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -