【发布时间】:2015-04-02 23:22:40
【问题描述】:
我正在开发一个简单的 LL(1) 解析器生成器,但在给定某些输入语法的情况下,我遇到了 PREDICT/PREDICT 冲突的问题。例如,给定如下输入语法:
E → E + E
| P
P → 1
我可以从E中去掉左递归,用大致等效的右递归规则替换它,从而得出语法:
E → P E'
E' → + E E'
| ε
P → 1
接下来,我可以计算语法的相关 FIRST 和 FOLLOW 集,最终得到以下结果:
FIRST(E) = { 1 }
FIRST(E') = { +, ε }
FIRST(P) = { 1 }
FOLLOW(E) = { +, EOF }
FOLLOW(E') = { +, EOF }
FOLLOW(P) = { +, EOF }
最后,使用PREDICT(A → α) = { FIRST(α) - ε } ∪ (FOLLOW(A) if ε ∈ FIRST(α) else ∅)为语法构造PREDICT集合,得到的集合如下。
PREDICT(1. E → P E') = { 1 }
PREDICT(2. E' → + E E') = { +, EOF }
PREDICT(3. E' → ε) = { +, EOF }
PREDICT(4. P → 1) = { 1 }
所以这是我遇到PREDICT(2) = PREDICT(3) 冲突的地方,因此,我无法生成解析表,因为语法不是 LL(1),因为解析器无法选择应该应用哪个规则.
我真正想知道的是,是否有可能解决冲突或考虑语法以避免冲突,并产生合法的 LL(1) 语法,而无需直接修改原始输入语法。
【问题讨论】:
标签: algorithm parsing grammar ll