📄 ll1.cpp
字号:
#include"iostream.h"
#include"string.h"
#include "iomanip.h"
#include "stdlib.h"
struct stack{
int top;
char s[10];
}*sign;
char *M[5][6]={{"TP","$","$","TP","$","$"},
{"$","+TP","$","$","e","e"},
{"FQ","$","$","FQ","$","$"},
{"$","e","*FQ","$","e","e"},
{"i","$","$","(E)","$","$"}};
int index(char m){
int ID;
if((m=='E')||(m=='i')) ID=0;
else if((m=='P')||(m=='+')) ID=1;
else if((m=='T')||(m=='*')) ID=2;
else if((m=='Q')||(m=='(')) ID=3;
else if((m=='F')||(m==')')) ID=4;
else if(m=='#') ID=5;
else ID=100;
return ID;
}
void main(){
char instr[15],x,a,*current,left,*right;int i=0,step=0,iA,ia,len,top;
bool flag=true;
cout<<"参照文法为:\n"<<"E→TE'\n"<<"E'→+TE'|ε\n"<<"T→FT'\n"\
<<"T'→*FT'|ε\n"<<"F→(E)|i\n";
cout<<"为编成方便作改写:E'以P、T'以Q 代替."<<endl;
cout<<"请输入待分析的字符串:(以#结束)\n";
do{
cin>>instr[i++];
}while(instr[i-1]!='#');
instr[i]='\0';
sign=new stack;
sign->s[0]='#';sign->s[1]='E';sign->s[2]='\0';sign->top=1;
current=instr;
a=*current;
cout<<"步骤"<<setw(20)<<"符号栈"<<setw(20)<<"输入串"<<setw(20)<<"所用产生式\n";
cout<<step++<<setw(20)<<sign->s<<setw(20)<<instr<<endl;
while(flag){
cout<<step++<<setw(20);
x=sign->s[sign->top];
if(x=='#'){
if(x==a) flag=false;
else {
cout<<"此句子不符合该文法!";
break;
}
}
else if((x=='i')||(x=='+')||(x=='*')||(x=='(')||(x==')')){
if(x==a){ sign->s[sign->top]='\0';
sign->top--;
a=*(++current);
cout<<sign->s<<setw(13+strlen(current))<<current<<endl;
}
else{ cout<<"此句子不符合该文法!";
break;
}
}
else if((x=='E')||(x=='P')||(x=='T')||(x=='Q')||(x=='F')){
iA=index(x);ia=index(a);
if((iA==100)||(ia==100)){
cout<<"此句子不符合该文法!"<<endl;break;
}
len=strlen(M[iA][ia]);left=x;right=M[iA][ia];
if((len==1)&&(M[iA][ia][0]=='e')){
sign->s[sign->top]='\0';
sign->top-=1;
right="ε";
}
else if((len==1)&&(M[iA][ia][0]=='$')){
cout<<"此句子不符合该文法!";
break;
}
else {top=sign->top;
for(int j=len-1;j>=0;j--)
sign->s[top++]=M[iA][ia][j];
sign->s[top]='\0';
sign->top=top-1;
}
cout.setf(ios::left);
cout<<sign->s<<setw(16)<<current<<setw(16)<<left<<"→"<<right<<endl;
}
}
if(flag==false) cout<<" "<<"分析成功结束!\n";
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -