📄 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 + -