📄 语法分析器.cpp
字号:
#include<iostream.h>
#include<fstream>
#include<string>
#define N 100//定义全局变量
typedef struct{
char next;
int length;
}convert;
int p,error,accept;
char input[N];
convert r[7];
void main()
{
int i,j,h,g;
char a[N],b[N],states,flag,c;
char t[]="i+*()#";
char s[]="0123456789ab";
void stack(char ,char );
void initation();
void dechange(int );
void stack(char ,char );
i=-1;
error=0;
accept=0;
initation();
cout<<"LR分析表:\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->id\n";
cout<<"输入一串字符串以'#'结尾:\n";
do{
c=cin.get();
b[++i]=c;
}while(c!='#');
h=i;
j=-1;
for(i=0;i<=h;i++){//转化id
if(i!=h)
{
if(b[i]=='i'&&b[i+1]=='d')
{
a[++j]='i';
i++;
}
else
a[++j]=b[i];
}
else
a[++j]=b[i];
}
int temp=0;
for(temp=0;temp<100;temp++){
if(isalpha(a[temp])&&a[temp]!='#')
a[temp]='i';
if(a[temp]=='#')
break;
}
g=j;
p=0;
j=-1;
input[++p]='0';
flag=a[++j];
do{
states=input[p];
switch(states){
case '0':switch(flag){
case 'i': stack('i','5'); flag=a[++j];break;
case '(': stack('(','4'); flag=a[++j];break;
default: error=1;
}
break;
case '1': switch(flag){
case '+': stack('+','6'); flag=a[++j];break;
case '#': accept=1; break;
default: error=1;
}
break;
case '2': switch(flag){
case '+': dechange(2); break;
case '*': stack(t[2],s[7]); flag=a[++j];break;
case ')': dechange(2); break;
case '#': dechange(2); break;
default: error=1;
}
break;
case '3': switch(flag){
case '+':case '*':case ')':case'#': dechange(4); break;
default: error=1;
}
break;
case '4': switch(flag){
case 'i': stack(t[0],s[5]); flag=a[++j];break;
case '(': stack(t[3],s[4]); flag=a[++j];break;
default: error=1;
}
break;
case '5': switch(flag){
case '+':case'*':case ')': case '#': dechange(6); break;
default: error=1;
}
break;
case '6': switch(flag){
case 'i': stack(t[0],s[5]); flag=a[++j]; break;
case '(': stack(t[3],s[4]); flag=a[++j]; break;
default: error=1;
}
break;
case '7': switch(flag){
case 'i':stack(t[0],s[5]); flag=a[++j]; break;
case '(': stack(t[3],s[4]); flag=a[++j]; break;
default: error=1;
}
break;
case '8': switch(flag){
case '+': stack(t[1],s[5]); flag=a[++j]; break;
case ')': stack(t[4],s[11]); flag=a[++j];break;
default: error=1;
}
break;
case '9': switch(flag){
case '+':case ')':case '#': dechange(1); break;
case '*': stack(t[2],s[7]); break;
default: error=1;
}
break;
case 'a': switch(flag){
case '+':case '*':case ')':case '#': dechange(3); break;
default:error=1;
}
break;
case 'b': switch(flag){
case '+':case '*':case ')':case '#': dechange(5); break;
default:error=1;
}
break;
default:error=1;
}
}while(!error&&!accept&&j<=g);
if(error)
cout<<"字符串不能被接受!\n";
if(accept)
cout<<"字符串可以被接受!\n";
if(j>g)
cout<<"字符串没有被接受!\n";
}
void stack(char d,char e)
{
input[++p]=d;
input[++p]=e;
}
void change(char a,char b)
{
switch(a){
case '0': switch(b){
case 'E': input[++p]='1'; break;
case 'T': input[++p]='2'; break;
case 'F': input[++p]='3'; break;
default: error=1;
}
break;
case '4': switch(b){
case 'E': input[++p]='8'; break;
case 'T': input[++p]='2'; break;
case 'F': input[++p]='3'; break;
default: error=1;
}
break;
case '6': switch(b){
case 'T': input[++p]='9'; break;
case 'F': input[++p]='3'; break;
default: error=1;
}
break;
case '7': switch(b){
case 'F': input[++p]='a'; break;
default: error=1;
}
break;
default:error=1;
}
}
void dechange(int a)
{
p=p-2*r[a].length;
input[++p]=r[a].next;
change(input[p-1],input[p]);
}
void initation()
{
r[1].next='E'; r[1].length=3;
r[2].next='E'; r[2].length=1;
r[3].next='T'; r[3].length=3;
r[4].next='T'; r[4].length=1;
r[5].next='F'; r[5].length=3;
r[6].next='F'; r[6].length=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -