实验四 LR语法分析器

#include<iostream>
#include<cstdio>
#include<string>
#include<map>
#include<cstring>
using namespace std;
const int MAX_N=1010;
int st1[MAX_N],tot1=0,tot2=0;
char st2[MAX_N];
string LR[15][15]={
{"s5"," "," ","s4"," "," ","1","2","3"},
{" ","s6"," "," "," ","acc"," "," "," "},
{" ","r2","s7"," ","r2","r2"," "," "," "},
{" ","r4","r4"," ","r4","r4"," "," "," "},
{"s5"," "," ","s4"," "," ","8","2","3"},
{" ","r6","r6"," ","r6","r6"," "," "," "},
{"s5"," "," ","s4"," "," "," ","9","3"},
{"s5"," "," ","s4"," "," "," "," ","10"},
{" ","s6"," "," ","s11"," "," "," "," "},
{" ","r1","s7"," ","r1","r1"," "," "," "},
{" ","r3","r3"," ","r3","r3"," "," "," "},
{" ","r5","r5"," ","r5","r5"," "," "," "}
};
string str[10]={"","E+T->E","T->E","T*F->T","F->T","(E)->F","a->F"};
int pp[10]={0,3,1,3,1,3,1};
char ps[10]={' ','E','E','T','T','F','F'};
map<char,int>ma;
int main(void){
	string s;
	cin>>s;
	st1[++tot1]=0,st2[++tot2]='#';
	int st=0;
	ma['a']=0,ma['+']=1,ma['*']=2,ma['(']=3,ma[')']=4;
	ma['#']=5,ma['E']=6,ma['T']=7,ma['F']=8;
	while(1){
		int y=ma[s[st]];
		int x=st1[tot1]; 
		string ss=LR[x][y];
		/*for(int i=1;i<=tot1;i++)
		cout<<st1[i];
		cout<<"  ";
		for(int i=1;i<=tot2;i++)
		cout<<st2[i];
		cout<<"\n";*/
		if(ss[0]=='s'){
			int t=0;
			for(int i=1;i<ss.length();i++)
			t=t*10+(ss[i]-'0');
			st1[++tot1]=t;
			st2[++tot2]=s[st];
			st++;
		}
		else if(ss[0]=='r'){
			int t=0;
			for(int i=1;i<ss.length();i++)
			t=t*10+(ss[i]-'0');
			cout<<str[t]<<"\n";
			tot2-=pp[t];
			st2[++tot2]=ps[t];
			tot1--;
			string sss=LR[st1[tot1]][ma[ps[t]]];
			if(sss[0]==' '){
				tot1--;
				continue;
			}
			t=0;
			for(int i=0;i<sss.length();i++)
			t=t*10+(sss[i]-'0');
			st1[++tot1]=t;
		}
		else if(ss=="acc"){
			printf("YES\n");
			break;
		}
		else if(ss[0]==' '){
			printf("NO\n");
			break;
		}
		else{
			int t=0;
			for(int i=0;i<ss.length();i++)
			t=t*10+(ss[i]-'0');
			st1[++tot1]=t;
		}
	}
	return 0;
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python语言的LR语法分析实验是一项通过Python编程语言实现LR语法分析器实验LR语法分析是一种自底向上的语法分析方法,用于分析和验证程序中的语法结构。在实验中,我们可以利用Python语言的灵活性和易用性,编写LR语法分析器的代码,并对其进行测试和验证。 首先,我们需要定义和实现LR分析算法的各个步骤,包括状态转移的规则、LR(0)项集的构建、DFA的生成等。通过Python编程语言的高级特性和丰富的库函数,可以方便地实现这些算法,并且可以通过可视化工具将LR分析器的状态图形象地展现出来,有助于我们更直观地理解算法的执行过程。 其次,我们需要编写语法分析器的输入语法规则和待分析的程序代码。Python语言的简洁和易读性使得编写语法规则变得比较简单,同时也可以使用Python的工具来对待分析的程序代码进行预处理和文法分析,为后续的LR语法分析做准备。 最后,我们可以利用Python语言提供的测试框架对实现的LR语法分析器进行功能和性能测试。通过编写测试用例和使用Python的单元测试框架,可以全面地验证LR语法分析器的正确性和效率,并且可以通过性能分析工具对其性能进行评估和优化。 总的来说,通过Python语言进行LR语法分析实验可以让我们更深入地理解LR语法分析算法的原理和实现,同时也可以充分利用Python语言的优势来简化和优化实验过程,是一项非常有意义的实践活动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值