自定向下预测分析法(LL(1)非递归)

本文介绍了自定向下预测分析法(LL(1)非递归)的概念,强调在推导过程中无需回溯且每步仅有一种选择。通过预测分析表来决定选用的产生式,并给出了具体的伪代码示例,详细阐述了如何根据当前栈顶非终结符和输入符号进行分析,逐步构造语法树直至验证输入串是否符合文法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定向下预测分析法(LL(1)非递归)

通过之前得学习,可以知道,使用自顶向下得预测分析法,选择产生式时没必要进行回溯,每一步推导仅有一个产生式符合要求,否则就出错。

怎么知道选哪个产生式呢?在进行推导之前,要有一个预测分析表,根据当前扫描到得终结符号和当前正在推导的非终结符,得到选用哪一条产生式。(是一个二维的表格)关于怎么生成预测分析表,前面的博客有提到过。

使用非递归的方法: - 当前正在推导的非终结符号在栈顶 - 通过查表,选择产生式 - 因为找到了产生式,所以需要用产生式的右部替换非终结符号,所以要将栈顶出栈 - 将产生式右部反着入栈(因为下一次还会从栈顶取出符号进行推导,首先推导的是产生式左端的符号,所以最左端的符号应该在栈顶,所以要反着入栈)

伪代码

版本一:

//将结束符入栈
push('#');
//将开始符号入栈
push('E');

i = 0;//指向输入缓冲区的指针,初始情况下,指向第一个字符
//获取栈顶的元素
top = getTop();
while(top != '#'){
	得到产生式M[top,s[i]]//M表示预测分析表
	if(top是非终结符){
		if(找到产生式){
			pop();//将当前分析的非终结符出栈、
			push(将产生式反着入栈);
			top = getTop();
		}
		else{
			error!!!
		}
	}
	else if(top是终结符){
		if(top与s[i]匹配){
			pop();
			i++;
			top = getTop();
		}
		else{
			error!!!!
		}
	}
}

版本二:

//将结束符入栈
push('#');
//将开始符号入栈
push('E');

i = 0;//指向输入缓冲
第三次上机—语法分析1 目的:熟练掌握自上而下的语法分析方法,并能用C++程序实现。 要求: 1. 使用的文法如下: E ® TE ¢ E ¢ ® + TE ¢ | e T ® FT ¢ T ¢ ® * FT ¢ | e F ® (E) | id 2. 对于任意给定的输入串(词法记号流)进行语法分析,递归下降方法和非递归预测分析方法可以任选其一来实现。 3. 要有一定的错误处理功能。即对错误能提示,并且能在一定程度上忽略尽量少的记号来进行接下来的分析。可以参考书上介绍的同步记号集合来处理。 可能的出错情况:idid*id, id**id, (id+id, +id*+id …… 4. 输入串以#结尾,输出推导过程中使用到的产生式。例如: 输入:id+id*id# 输出:E ® TE ¢ T ® FT ¢ F ® id E ¢ ® + TE ¢ T ® FT ¢ …… 如果输入串有错误,则在输出中要体现是跳过输入串的某些记号了,还是弹栈,弹出某个非终结符或者是终结符了,同时给出相应的出错提示信息。比如: idid*id对应的出错信息是:“输入串跳过记号id,用户多输入了一个id”; id**id对应的出错信息是:“弹栈,弹出非终结符F,用户少输入了一个id” (id+id对应的出错信息是:“弹栈,弹出终结符 ) ,用户少输入了一个右括号(或者说,括号不匹配)” 有余力的同学可进一步考虑如下扩展: 1. 将递归下降方法和非递归预测分析方法都实现 2. 在语法分析的过程中调用第二次上机的结果,即利用词法分析器来返回一个记号给语法分析器。 3. 编写First和Follow函数,实现其求解过程。 测试文法: A->BCDE B->aBA|ε C->F|ε D->b|c|ε E->e|ε F->d|ε
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值