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

📄 lr.cpp

📁 编译原理 中的LR分析 控制台程序设计与实现
💻 CPP
字号:
#include "LRTable.h"
#include<string>
#include<stack>
#include<iostream>

using namespace std;


int step=0;
string str_in="i*i+i+i*i#";
stack<char> Char;
stack<int>  State;

int c_in(char ch);
void Guiyue(int t);
void ShowStr(int pos);
void ShowState();
void ShowChar();
void Show(int t)
{
	cout<<++step<<"\t";
	ShowState();
	cout<<"\t\t";
	ShowChar();
	cout<<"\t\t";
	ShowStr(t);
	cout<<endl;
}

void main()
{
	cout<<"文法为:"<<"\n\tE->E+T|T\n\tT->T*F|F\n\tF->(E)|i "<<endl;
	cout<<"请输入需要 LR 分析的句子并以 # 结束!\n输入为:";
A:	cin>>str_in;
	for(int i=0;i<str_in.size();i++)
	{
		if((str_in[str_in.size()-1]!='#')||
			(str_in[i]!='i'&&str_in[i]!='('&&str_in[i]!=')'&&str_in[i]!='#'&&str_in[i]!='+'&&str_in[i]!='*'))
		{
			cout<<"输入串错误,请重新输入:";
			goto A;
		}
	}
	cout<<"**************************************************************"<<endl;
	int str_pos=0,table_pos;
	
	State.push(0);
	Char.push('#');
	cout<<"步骤\t状态栈\t\t归约串\t\t输入串\n"<<endl;
	Show(str_pos);
	while(str_pos<str_in.length())
	{
		table_pos=table[State.top()][c_in(str_in[str_pos])];
		if(table_pos<0)
		{
			Char.push(str_in[str_pos]);
			State.push(abs(table_pos));
			str_pos++;
			Show(str_pos);
			
		}
		else if(table_pos>10)
		{
			if(table_pos>20)
			{
				cout<<"**************************************************************"<<endl;
				cout<<"\n******************文法正确,分析完毕***************************"<<endl;
				exit(0);;
			}
			Guiyue(table_pos-10);
			table_pos=table[State.top()][c_in(Char.top())];
			if(table_pos>0)
				State.push(table_pos);
			Show(str_pos);
		}
		else if(table_pos==0)
		{
			cout<<"**************************************************************"<<endl;
			cout<<"\n******************文法错误,分析停止***************************"<<endl;
			exit(0);
		}
		
	}
	
}

int c_in(char ch)
{  
	int t;  
	switch(ch)  
	{  
	case 'i':t=0;break;  
	case '+':t=1;break;  
	case '*':t=2;break;  
	case '(':t=3;break;  
	case ')':t=4;break;  
	case '#':t=5;break;  
	case 'E':t=6;break;  
	case 'T':t=7;break;  
	case 'F':t=8;break;  
	}  
	return t;  
} 
void Guiyue(int t)
{
	switch(t)  
	{  
	case 1:
		Char.pop();
		State.pop();
		Char.pop();
		State.pop();
		Char.pop();
		State.pop();
		Char.push('E');
		break;  
	case 2:
		Char.pop();
		State.pop();
		Char.push('E');
		break;  
	case 3:
		Char.pop();
		State.pop();
		Char.pop();
		State.pop();
		Char.pop();
		State.pop();
		Char.push('E');
		break; 
	case 4:
		Char.pop();
		State.pop();
		Char.push('T');
		break;  
	case 5:
		Char.pop();
		State.pop();
		Char.pop();
		State.pop();
		Char.pop();
		State.pop();
		Char.push('F');break;  
	case 6:
		Char.pop();
		State.pop();
		Char.push('F');break;
	default:
		cout<<"归约错误 t="<<t<<endl;
		exit(0);
	} 
}
void ShowStr(int pos)
{
	for(int i=0;i<pos;i++)
		cout<<" ";
	for(i=pos;i<str_in.length();i++)
		cout<<str_in[i];
}
void ShowState()
{
	int i=-1,len=Char.size();
	int *buf=new int[len];
	while(!State.empty())
	{
		buf[++i]=State.top();
		State.pop();
	}
	buf[++i]='\0';
	i=len-1;
	while(i>-1)
	{
		cout<<buf[i];
		State.push(buf[i]);
		i--;
	}
	
}
void ShowChar()
{
	int i=-1,len=Char.size();
	char *buf=new char[len];
	while(!Char.empty())
	{
		buf[++i]=Char.top();
		Char.pop();
	}
	buf[++i]='\0';
	i=len-1;
	while(i>-1)
	{
		cout<<buf[i];
		Char.push(buf[i]);
		i--;
	}
}

⌨️ 快捷键说明

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