消除左递归及提取左公因子

本文详细解析了文法中左递归的概念,包括立即左递归与非立即左递归,并提供了消除左递归的具体方法。同时,介绍了左公因子的概念及其提取规则,帮助读者理解并掌握文法优化技巧。

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

消除左递归

什么是左递归?

如果一个文法中有一个非终结符号A使得对某个串α存在一个推导A=》Aα,那么这个文法就是左递归的。递归分为立即左递归和非立即左递归。立即左递归单步即可看出来,非立即左递归
举个例子:

立即左递归:
A ——> Aα | β


非立即左递归:
 1)A→aB
 2)A→Bb
 3)B→Ac
 4)B→d

消除左递归

消除立即左递归只需要遵循以下规律进行转换就ok。

立即左递归:

将A ——> Aα | β 转换为

A ——> β A' 
A' ——> α A'

非立即左递归:

先将其变为立即左递归
 1)B→aBc
 2)B→Bbc 
 3)B→d
可化简为:B→aBc | Bbc | d

然后按照上面的规则进行转换即可
 1)B→aBcB' |dB'
 2)B'→bcB' |ε

最后进行整合
 1)A→aB
 2)A→Bb
 3)B→(aBc|d)B'
 4)B'→bcB'|ε

通用算法

以某种顺序排列非终结符A1,A2,……,An;

for(int i = 1; i<=n; i++) {
	for(int j = 1; j<=i-1; j++) {
		将每个形如 Ai → Ajγ 的产生式替换为产生式组 Ai → ξ1γ|ξ2γ|……|ξkγ ,
		其中,Aj→a1|a2|……|ak是所有的当前Aj产生式
	}
	消除关于Ai产生式中的直接左递归性
}

提取左公因子

什么是左公因子?

和数学中的公因子含义相同,就是公共的因子,而左公因子就是最左边的公因子。

例如:

S → aB1|aB2|aB3|aB4|...|aBn|y

可以看出前n项拥有一个共同的左公因子:a,所以可以把他提取出来。

提取规则

so easy啦

S → aS'|y
S'→ B1|B2|B3|...|Bn
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值