⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lr0.cpp

📁 关于四则混合运算的LR0语法分析器.一个编译的实验.大家看看吧..交流下.
💻 CPP
字号:
#include<iostream.h>
#include<string.h>
#include<stdlib.h>
#include<iomanip>
static int line=1;
bool end=1;
#define MAXLONG 20
void ACTION(char *chars);
void Print();
struct Sentence{//句型结构体
				char head;//句型开始字符
				int ch_le;//该句型右部的长度
				};
Sentence r[7]={{'S',1/*"S→E"*/},{'E',3/*"E→E+T"*/},{'E',1/*"E→T"*/},{'T',3/*"T→T*F"*/},
			   {'T',1/*"T→F"*/},{'F',3/*"F→(E)"*/},{'F',1/*"F→i"*/}};//句子变量表							
struct Table{//定义一个结构体
			int  state;//状态变量
			char V;//终结符或非终结符
			char Ne_act[4];//下一个状态
			};
Table SLR[45]= {{0,'i',"S5"},{0,'(',"S4"},{0,'E',"1"},{0,'T',"2"},{0,'F',"3"},
				{1,'+',"S6"},{1,'#',"acc"},
				{2,'+',"r2"},{2,'*',"S7"},{2,')',"r2"},{2,'#',"r2"},
				{3,'+',"r4"},{3,'*',"r4"},{3,')',"r4"},{3,'#',"r4"},
				{4,'i',"S5"},{4,'(',"S4"},{4,'E',"8"},{4,'T',"2"},{4,'F',"3"},
				{5,'+',"r6"},{5,'*',"r6"},{5,')',"r6"},{5,'#',"r6"},
				{6,'i',"S5"},{6,'(',"S4"},{6,'T',"9"},{6,'F',"3"},
				{7,'i',"S5"},{7,'(',"S4"},{7,'F',"10"},
				{8,'+',"S6"},{8,')',"S11"},
		 		{9,'+',"r1"},{9,'*',"S7"},{9,')',"r1"},{9,'#',"r1"},
				{10,'+',"r3"},{10,'*',"r3"},{10,')',"r3"},{10,'#',"r3"},
				{11,'+',"r5"},{11,'*',"r5"},{11,')',"r5"},{11,'#',"r5"}};
struct FENXI{
    char act_0[6];
    char act_1[6];
    int go[3];
}action[12];
void Init(){
    /*---------------       ACTION      -----------------------*/
    action[0].act_0[0]='s';       action[0].act_1[0]=5;
    action[0].act_0[3]='s';       action[0].act_1[3]=4;
    action[1].act_0[1]='s';       action[1].act_1[1]=6;
    action[1].act_0[5]='a';       action[1].act_1[5]=0;
    action[2].act_0[1]='r';       action[2].act_1[1]=2;
    action[2].act_0[2]='s';       action[2].act_1[2]=7;
    action[2].act_0[4]='r';       action[2].act_1[4]=2;
    action[2].act_0[5]='r';       action[2].act_1[5]=2;
    action[3].act_0[1]='r';       action[3].act_1[1]=4;
    action[3].act_0[2]='r';       action[3].act_1[2]=4;
    action[3].act_0[4]='r';       action[3].act_1[4]=4;
    action[3].act_0[5]='r';       action[3].act_1[5]=4;
    action[4].act_0[0]='s';       action[4].act_1[0]=5;
    action[4].act_0[3]='s';       action[4].act_1[3]=4;
    action[5].act_0[1]='r';       action[5].act_1[1]=6;
    action[5].act_0[2]='r';       action[5].act_1[2]=6;
    action[5].act_0[4]='r';       action[5].act_1[4]=6;
    action[5].act_0[5]='r';       action[5].act_1[5]=6;
    action[6].act_0[0]='s';       action[6].act_1[0]=5;
    action[6].act_0[3]='s';       action[6].act_1[3]=4;
    action[7].act_0[0]='s';       action[7].act_1[0]=5;
    action[7].act_0[3]='s';       action[7].act_1[3]=4;
    action[8].act_0[1]='s';       action[8].act_1[1]=6;
    action[8].act_0[4]='s';       action[8].act_1[4]=11;
    action[9].act_0[1]='r';       action[9].act_1[1]=1;
    action[9].act_0[2]='s';       action[9].act_1[2]=7;
    action[9].act_0[4]='r';       action[9].act_1[4]=1;
    action[9].act_0[5]='r';       action[9].act_1[5]=1;
    action[10].act_0[1]='r';      action[10].act_1[1]=3;
    action[10].act_0[2]='r';      action[10].act_1[2]=3;
    action[10].act_0[4]='r';      action[10].act_1[4]=3;
    action[10].act_0[5]='r';      action[10].act_1[5]=3;
    action[11].act_0[1]='r';      action[11].act_1[1]=5;
    action[11].act_0[2]='r';      action[11].act_1[2]=5;
    action[11].act_0[4]='r';      action[11].act_1[4]=5;
    action[11].act_0[5]='r';      action[11].act_1[5]=5;
    /*--------------------     GOTO      -------------------------*/
    action[0].go[0]=1;
    action[0].go[1]=2;
    action[0].go[2]=3;
    action[4].go[0]=8;
    action[4].go[1]=2;
    action[4].go[2]=3;
    action[6].go[1]=9;
    action[6].go[2]=3;
    action[7].go[2]=10;
}
void Print_LR(){
    int v,c;
	printf("                   ACTION              \t\t\t           GOTO\n");
    for(v=0;v<80;v++)
	printf("-");
	printf("   状态      i\t     +\t      *      \t(\t )\t  #\tE     T     F\n");
	for(v=0;v<80;v++)
	printf("-");
    for(v=0;v<12;v++){
	printf("%5d",v);
	for(c=0;c<6;c++)
	    printf("%7c%2d",action[v].act_0[c],action[v].act_1[c]);
	for(c=0;c<3;c++)
	    printf("%6d",action[v].go[c]);
	printf("\n");
    }
    for(v=0;v<80;v++)
	printf("-");
}
class STACK_I{//定义一个字符栈类		
			private:
				int   top;//栈顶指针
				int  bottom;//栈底指针				
				int stack[MAXLONG];//栈长
			public:
				STACK_I()//栈初始化,构造函数
				{top=0;bottom=0;}
				~STACK_I(){}//析构函数
				void PUSH_STACK(int num)//进栈操作
				{
					if((top-bottom)>=MAXLONG-1)//判断是否栈空
						cout<<"The STACK if full!"<<endl;
					else//入栈
					{
						stack[top]=num;
						top=top+1;
					}
				}
				void POP_STACK()//出栈顶元素
				{
					if((top-bottom)==0)//判断栈空
						cout<<"The STACK is empty!"<<endl;
					else
						{
						    top=top-1;
							stack[top]=0;
						}
				}
				void PRINT()//从左向右输出栈元素----用在分析栈
				{
					for(int j=0;j<top;j++)					
					{
						if(stack[j]>9)
						 cout<<'('<<stack[j]<<')';
					    else
					      cout<<stack[j];
					}
				}
				int GET_TOP(int n=1)//得到栈顶元素
				{
					if(n==1)
						return stack[top-1];
					else
						return stack[top-n];
				}			
			};
class STACK_C{//定义一个字符栈类		
			private:
				int   top;//栈顶指针
				int  bottom;//栈底指针				
				char stack[MAXLONG];//栈长
			public:
				STACK_C()//栈初始化,构造函数
				{top=0;bottom=0;}
				~STACK_C(){}//析构函数
				void PUSH_STACK(char const character)//进栈操作
				{
					if((top-bottom)>=MAXLONG-1)//判断是否栈空
						cout<<"The STACK if full!"<<endl;
					else//入栈
					{
						stack[top]=character;
						top=top+1;
					}
				}
				void PUSH_STACK(char const *chars)//进栈操作
				{
					int length;//字符串长临时变量
					length=strlen(chars);							
					for(int i=length-1;i>=0;i--)//字符串反向进栈
						{
						  char temp=chars[i];
						  PUSH_STACK(temp);
						}
				}
				void POP_STACK()//出栈顶元素
				{
					if((top-bottom)==0)//判断栈空
						cout<<"The STACK is empty!"<<endl;
					else
						{	stack[top-1]='\0';
						    top=top-1;
							
						}
				}
				void L_PUTOUT_STACK()//从左向右输出栈元素----用在分析栈
				{
					cout<<stack;
				}							
				void R_PUTOUT_STACK()//从右向左输出栈元素----用在剩余输入栈
				{
					for(int j=top-1;j>=0;j--)			
					cout<<stack[j];
				}
				char GET_TOP()//得到栈顶元素
				{
				  return stack[top-1];
				}			
			};
STACK_I State_Stack;//状态栈
STACK_C Ch_Stack;//符号栈
STACK_C In_Stack;//输入串栈
int tem_state;//存放状态变量的临时变量
char in_put;//存放输入符号的临时变量
char Across[4];//临时存放表的交叉信息
char Input[15];
int GOTO;//转向的下一个变量
void main()
{
	Init();
	Print_LR();
	//char Input[15]="(i+i)*i#";//将要验证的输入串+i
	cout<<"输入一以#结束的符号串(包括+-*/()i#):";
	cin>>Input;
	cout<<"步骤"<<'\t'<<"状态栈"<<'\t'<<'\t'<<"符号栈"<<'\t'<<'\t'
		<<"剩余输入串"<<'\t'<<"ACTION"<<'\t'<<"GOTO"<<endl;
	In_Stack.PUSH_STACK(Input);//输入符号入栈
	State_Stack.PUSH_STACK(0);//状态栈进初始状态
	Ch_Stack.PUSH_STACK('#');//符号栈进初始符号符号进栈
do{
	int i=0;//临时计数变量
	tem_state=State_Stack.GET_TOP();//临时状态变量赋值
	in_put=In_Stack.GET_TOP();//临时输入串赋值
	//cout<<tem_state<<in_put<<endl;
	for(;i<45;i++)
	  {	
		if(SLR[i].state==tem_state&&SLR[i].V==in_put)
		  {
			strcpy(Across,SLR[i].Ne_act);
			break;
		  }
	  }
	if(i>=45)
	  {//不能向下推导句子错误
		cout<<"The sentence is wrong!"<<endl;
		end=1;
		break;
	  }
	ACTION(Across);

}while(end);
}
void ACTION(char *ch_s)
{ 
  int sta;//临时存放状态
  int j=0;//临时计数变量
  int count;//归约串的个数
  if(ch_s[0]=='S')//当状态为S1或S2--
    {
	  Print();//输出信息
	  sta=atoi(ch_s+1);//状态变量赋值
	  State_Stack.PUSH_STACK(sta);//状态变量入栈
	  Ch_Stack.PUSH_STACK(in_put);//输入串中的变量入符号栈
	  In_Stack.POP_STACK();//输入串出栈
    }
  else if(ch_s[0]=='r')
	{	  
	  sta=atoi(ch_s+1);//第几个Sentence
	  count=r[sta].ch_le;//句子长度
	  tem_state=State_Stack.GET_TOP(count+1);//新的状态
	  in_put=r[sta].head;
	  for(;j<45;j++)
		{	
		  if(SLR[j].state==tem_state&&SLR[j].V==in_put)
			{
				tem_state=atoi(SLR[j].Ne_act);
				GOTO=tem_state;
				break;
			}
		}
	  if(j==45)
	  {//不能向下推导句子错误
		cout<<"The sentence is wrong!"<<endl;
		end=1;
	  }
	  Print();
	  for(int i=0;i<count;i++)//状态栈出栈次数
		State_Stack.POP_STACK();
	  State_Stack.PUSH_STACK(tem_state);//新状态入栈
	  for(int j=0;j<count;j++)//状态栈出栈次数
	  Ch_Stack.POP_STACK();
	  Ch_Stack.PUSH_STACK(in_put);//Sentence开始符号入栈
	  
	}

  else//为可以接受的串标志结束
	{
	  Print();
	  end=0;
	}

}

void Print()//输出函数
{
	cout<<line<<'\t';//步骤数
	State_Stack.PRINT();//状态栈输出	
	cout<<'\t'<<'\t';
	Ch_Stack.L_PUTOUT_STACK();//符号栈输出
	cout<<'\t'<<'\t';
	In_Stack.R_PUTOUT_STACK();//输入栈输出
	cout<<'\t'<<'\t';
	cout<<Across<<'\t';//ACTION输出'\t'<<
	if(Across[0]=='r')//GOTO输出
		cout<<GOTO<<endl;
	else 
		cout<<endl;
	line++;//行数
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -