1. 构造 LL(1) 分析表时 FIRST 集与 FOLLOW 集如何计算?两者交集非空意味着什么冲突?
请说明构造 LL(1) 分析表时 FIRST 集与 FOLLOW 集如何计算,以及两者交集非空意味着什么冲突?
- FIRST 集与 FOLLOW 集的计算
- LL(1) 冲突的判断
- FIRST 与 FOLLOW 交集非空导致分析表项出现多重入口
FIRST 集是某个文法符号能推导出的所有终结符集合;FOLLOW 集是某个非终结符在推导中可能紧跟的终结符集合。计算 FIRST:对终结符、非终结符按产生式递归求首终结符;计算 FOLLOW:把 $ 加入开始符号的 FOLLOW,对形如 A→αB 加 β 的 FIRST(除 ε),对 A→αB 或 A→αBβ(β 可空)加 FOLLOW(A)。构造 LL(1) 分析表时,对每个产生式 A→α,若 α 可推导出 a,则在表[A][a] 填入该产生式;若 α 可推出 ε,则在表[A][b](b∈FOLLOW(A))填入。若 FIRST 集与 FOLLOW 集交集非空(即某产生式能推导出 a 且该产生式可推出 ε 且 a∈FOLLOW(A)),则表项出现多重入口,是 LL(1) 冲突(first/follow 冲突),说明文法不是 LL(1)。工程价值:FIRST/FOLLOW 是预测分析表构造的基石,冲突意味着文法需改写。
冲突本质是"表项多重入口"。当某非终结符的 FIRST 与 FOLLOW 交叠,同一表项可能填入多个产生式,无法唯一预测,需改写文法消除。