用c++实现LR语法分析器 通过LR分析表及三个栈形成对输入表达式的判断!

版权声明:转载请声明原文链接地址,谢谢! 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);}
	
}

        }

 

猜你喜欢

转载自blog.csdn.net/weixin_42859280/article/details/85219349
今日推荐