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

📄 lr0.cpp

📁 这是我们学校平时实习的四个内容:词法分析、递归下降子程序、ll1语法分析、lr0语法分析 是我用c++编写的。
💻 CPP
字号:

//朱贺 民航学院
#include<iostream.h>
#include<string.h>
#include<iomanip.h>
#include<stdlib.h>


struct stack{         
	int  top;
	int  st[15];     //状态栈
	char sn[15];     //符号栈
}*sign;

struct analysis{   //动作表结构
	char act;
	int  status;
}action[][6]={
	{'s',5,'$',0,'$',0, 's',4,'$',0, '$',0},
	{'$',0,'s',6,'$',0, '$',0,'$',0, 'A',0},
	{'$',0,'r',2,'s',7, '$',0,'r',2, 'r',2},
	{'$',0,'r',4,'r',4, '$',0,'r',4, 'r',4},
	{'s',5,'$',0,'$',0, 's',4,'$',0, '$',0},
	{'$',0,'r',6,'r',6, '$',0,'r',6, 'r',6},
	{'s',5,'$',0,'$',0, 's',4,'$',0, '$',0},
	{'s',5,'$',0,'$',0, 's',4,'$',0, '$',0},
	{'$',0,'s',6,'$',0, '$',0,'s',11,'$',0},
	{'$',0,'r',1,'s',7, '$',0,'r',1, 'r',1},
	{'$',0,'r',3,'r',3, '$',0,'r',3, 'r',3},
	{'$',0,'r',5,'r',5, '$',0,'r',5, 'r',5}};
analysis G[]={{'E',3},{'E',1},{'T',3},{'T',1},{'F',3},{'F',1}};   //此文法信息
int go[][3]={1,2,3,99,99,99,99,99,99,99,99,99,8,2,3,99,99,99,99,9,3,99,99,10,99,99,99,99,99,99,99,99,99,99,99,99};

int index(char m){
	int id;
	if((m=='i')||(m=='E'))       id=0;
	else if((m=='+')||(m=='T'))  id=1;
	else if((m=='*')||(m=='F'))  id=2;
	else if(m=='(')              id=3;
	else if(m==')')              id=4;
	else if(m=='#')              id=5;
	else                         id=99;
	return id;
}
void main(){
    cout<<"参照文法为:\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→i\n";
	char instr[20],*current,a;
	int i=0,step=0,ix1,ia,ix2,ig,iG,back;
	bool flag=true;
	sign=new stack;
	cout<<"请输入待分析的字符串(以#结束):\n";
    do{
	cin>>instr[i++];
	}while(instr[i-1]!='#');
    instr[i]='\0';
	current=instr;
	sign->st[0]=0;sign->sn[0]='#';sign->sn[1]='\0';sign->top=0;
	cout<<"步骤"<<setw(20)<<"状  态"<<setw(20)<<"符  号"<<setw(20)<<"输 入 串\n";
	cout<<"===="<<setw(20)<<"======"<<setw(20)<<"======"<<setw(20)<<"========\n";
    cout<<step++<<setw(20)<<sign->st[0]<<setw(21)<<sign->sn<<setw(21)<<instr<<endl;
	while(flag){
		cout<<step++<<setw(20); 
		a=*current;ia=index(a);
		ix1=sign->st[sign->top]; //cout<<a<<" "<<ia<<" "<<ix1<<" "<<action[ix1][ia].act;  //hhjhj
        if(ia==99) {
			cout<<"此文法无法识别该输入串!";
			break;
		}

		if(action[ix1][ia].act=='s'){
			sign->top+=1;
			sign->sn[sign->top]=a;
			sign->sn[(sign->top)+1]='\0';
            sign->st[sign->top]=action[ix1][ia].status ;
			current++;
		}
		else if(action[ix1][ia].act=='r'){
            iG=action[ix1][ia].status-1;  //零下表开始
			back=G[iG].status;
			sign->top-=back;
			ix2=sign->st[sign->top];
			ig=index(G[iG].act);
			if(go[ix2][ig]!=99){
				sign->top+=1;
				sign->st[sign->top]=go[ix2][ig];
				sign->sn[sign->top]=G[iG].act;
                sign->sn[(sign->top)+1]='\0';
			}
			else{
				cout<<"此文法无法识别该输入串!";
			    break;
			}                   
		}
		else if(action[ix1][ia].act=='$'){
        	cout<<"此文法无法识别该输入串!";
			break;
		}
		else if(action[ix1][ia].act=='A'){
						flag=false;
		}
		for(i=0;i<=sign->top ;i++)
			cout<<sign->st[i]<<" ";
		cout<<setw(20-(sign->top))<<sign->sn<<setw(20-strlen(sign->sn))<<current<<endl;
		if(flag==false) cout<<"文法分析成功!"<<endl;
   
	}
	
}





⌨️ 快捷键说明

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