什么是LL(1)文法
- 第一个L表示从左到右扫描输入串
- 第二个L表示分析使用最左推导
- 1表示分析时每一步只需向前看一个符号即可决定所选用的规则,而且这种选择是准确无误的。
LL(1)文法中SELECT集的定义:
判定条件:
文法左递归的消除
- 当一个文法是左递归文法时,采用自上而下分析法会使分析过程进入无穷循环之中。
- 文法左递归是指文法中的某个非终结符A存在推导
方法一:引进一个新的非终结符,把含左递归的规则改写成右递归。
-
设关于非终结符 A A A 的直接左递归的规则为
其中 α 、 β α、β α、β 是任意的符号串, α α α 不等于 ε ε ε, β β β 不以 A A A 开头 -
对A的规则可改写成如下右递归形式:
改写以后的形式和原来形式是等价的。也就是说,从A推出的符号串的集合是相同的。
示例:
方法二:采用扩充BNF表示法改写含直接左递归的规则
- 使用 { β }表示 β*;
- 使用 [ β ] 表示 β 的出现可有可无;
- 使用()在规则中提取因子。
示例:
回溯的消除
当某个非终结符A有多个候选式时,无法确定选用唯一的一个候选式,而只能逐一进行试探,从而引起回溯。具体表现在下面两种情况。
- 第一种情况:文法中相同左部的规则,其右部左端第一个符号相同而引起回溯。
- 第二种情况:文法中相同左部的规则,其中某一右部能推出 ε 串
方法:反复提取公共左因子
示例: