消除左递归
什么是左递归?
如果一个文法中有一个非终结符号A使得对某个串α存在一个推导A=》Aα,那么这个文法就是左递归的。递归分为立即左递归和非立即左递归。立即左递归单步即可看出来,非立即左递归
举个例子:
1 | 立即左递归: |
消除立即左递归只需要遵循以下规律进行转换就ok。
立即左递归
1 | 将A ——> Aα | β 转换为 |
非立即左递归
1 | 先将其变为立即左递归 |
通用算法
1 | 以某种顺序排列非终结符A1,A2,……,An; |
提取左公因子
什么是左公因子?
和数学中的公因子含义相同,就是公共的因子,而左公因子就是最左边的公因子。
例如:
1 | S → aB1|aB2|aB3|aB4|...|aBn|y |
可以看出前n项拥有一个共同的左公因子:a,所以可以把他提取出来。
提取规则
1 | S → aS'|y |
S → aB1|aB2|aB3|aB4|…|aBn|y
可以看出前n项拥有一个共同的左公因子:a,所以可以把他提取出来。
S → aS’|y
S’→ B1|B2|B3|…|Bn