版权声明:转载请声明原文链接地址,谢谢! https://blog.csdn.net/weixin_42859280/article/details/85219349
代码如下:
#include<iostream.h>
#include<string.h>
#include<stdlib.h>
int tree[50];
int j=0,k=0;
char process[50][10];
const int action[10][7]={-1,-1,2,-1,3,-1,1,
4,5,-1,-1,-1,0,-1,
-1,-1,2,-1,3,-1,6,
104,104,-1,104,-1,104,-1,
-1,-1,2,-1,3,-1,7,
-1,-1,2,-1,3,-1,8,
4,5,-1,9,-1,-1,-1,
101,5,-1,101,-1,101,-1,
102,102,-1,102,-1,102,-1,
103,103,-1,103,-1,103,-1,
};
struct table{
char x;
int state}
grammer[]={{'S',1},{'E',3},{'T',3},{'F',3},{'F',1}};
int convert(char m)
{ int id;
switch(m)
{ case'i':id=0;break;
case'+':id=1;break;
case'*':id=2;break;
case'(':id=3;break;
case')':id=4;break;
case'$':id=5;break;
case'E':id=6;break;
case'T':id=7;break;
case'F':id=8;break;
default:id=199;}
return id;
}
void main()
{char in_string[20],*now,temp,*r;
int i=0,tep=1,sta_a,ope_a,sta_b,ope_b,temp1,temp2;
bool signal=true;
int sta_stack[50]={0};
char ope_stack[50]={'$};
int top=0;
cout<<"输入待分析表达式:\n";
do{cin>>in_string[i++];
}while(in_string[i-1]!='$');
in_string[i]='\0';
for(int q=0;q<=i-2;q++)
process[k][q]=in_string[q];
k=k+1;
now=in_string;
while(signal)
{
temp=*now;
ope_a=convert(temp);
sta_a=sta_stack[top];
if(ope_a==199)
{cout<<"此文法无法识别该表达式!\n";
break;
}
int value=action[sta_a][ope_a];
if(value>0&&value!=0)
{ top=top+1;
ope_stack[top]=temp;
sta_stack[top]=value;
now++;
}
else if(value<0)
{ temp1=-value;
temp2=grammer[temp1].state;
top=top-temp2;
sta_b=sta_stack[top];
ope_b=convert(grammer[temp1].x);
if(action[sta_b][ope_b]!=0)
{
top=top+1;
sta_stack[top]=action[sta_b]ope_b];
ope_stack[top]=grammer[temp1].x;
tree[j++]=temp1;
for(i=1;i<=top;i++)
process[k][i-1]=ope_stack[i];
i=i-1;
r=now;
while(*r!='$')
{
process[k][i++]=*r;
r++;
}
k++;
}
else
{cout<<"该此文法无法识别该表达式!\n";
break;
}
}
else if(value==0)
{cout<<"该此文法无法识别该表达式!\n";
break;
}
else if(value==99)
{cout<<"此表达式可分析!"<<endl;
break;
}
for(i=0;i<=top;i++)
cout<<ope_stack[i];
cout<<'\t'<<'\t';
cout<<now<<'\t';
if(value>0&&value!=0)
cout<<'S'<<value<<endl;
else if(value<0)
cout<<'r'<<value<<endl;
}
2
#include<iostream>
#include<stdlib.h>
#include<fstream>
#include<string.h>
#include<string>
#include<algorithm>
using namespace std;
typedef struct
{int num;
char texts[25];
}aa;
string s[5]={"S->E","E->E+E","E->E*E","E->(E)","E->i"};
char c1[7]={'+','*','(',')','i','#','E'};
int e[10][7]={-1,-1,2,-1,3,-1,1,
4,5,-1,-1,-1,0,-1,
-1,-1,2,-1,3,-1,6,
104,104,-1,104,-1,104,-1,
-1,-1,2,-1,3,-1,7,
-1,-1,2,-1,3,-1,8,
4,5,-1,9,-1,-1,-1,
101,5,-1,101,-1,101,-1,
102,102,-1,102,-1,102,-1,
103,103,-1,103,-1,103,-1,
};
void pop(aa &a1)
{a1.num--;
return;
}
char top(aa &a1)
{return(a1.texts[a1.num]);}
void push(aa &a1,char c)
{a1.num++;
a1.texts[a1.num]=c;
return;
}
int search2(char ch)
{
int i;
for(i=0;i<7;i++)
{if(c1[i]==ch)
return i;
}
}
void main(void)
{
aa a1,a2,a3;
a1.num=-1;
a2.num=-1;
a3.num=-1;
int i,n,j,t,d;
push(a1,'0');
push(a2,'#');
push(a3,'#');
string s0;
cin>>s0;
n=0;
for(i=0;i<s0.length();i++)
{
if(s0[i]>='0'&&s0[i]<='9'||s0[i]>='a'&&s0[i]<='z'||s0[i]>='A'&&s0[i]<='Z')
s0[i]='i';
}
for(i=s0.length()-1;i>=0;i--)
{
if(s0[i]=='i') n++;
else n=0;
if(n<=1)
push(a3,s0[i]);
}
while(a3.num>-1)
{
j=search2(top(a3));
i=top(a1)-'0';
if(e[i][j]==0) {cout<<"accept"<<'\n';return;}
if(e[i][j]<0) {cout<<"error"<<'\n';
cout<<"e["<<i<<"]"<<"["<<j<<"]=-1"<<'\n';
return;}
else if(e[i][j]>100) {t=e[i][j]-100;d=s[t].length()-3;for(n=0;n<d;n++){pop(a1);pop(a2);}push(a3,s[t][0]);}
else {t=e[i][j];push(a1,t+'0');push(a2,top(a3));pop(a3);}
}
}