Compiler construction 如何使这个语法成为LL(1)?

Compiler construction 如何使这个语法成为LL(1)?,compiler-construction,Compiler Construction,我一开始有这种语法 S -> A | B A -> Aa | epsilon B -> Bb | epsilon 我消除了左递归以获得以下结果: S -> A | B A -> A' A' -> aA' | epsilon B -> B' B' -> bB' | epsilon 此语法不是LL1,因为FirstA和FirstB有相同的ε。我知道常见的第一个符号通常是通过因子分解来解决的。我不知道如何解析A和B第一集合中的公共ε。语法是不明确的,

我一开始有这种语法

S -> A | B
A -> Aa | epsilon
B -> Bb | epsilon
我消除了左递归以获得以下结果:

S -> A | B
A -> A'
A' -> aA' | epsilon
B -> B'
B' -> bB' | epsilon

此语法不是LL1,因为FirstA和FirstB有相同的ε。我知道常见的第一个符号通常是通过因子分解来解决的。我不知道如何解析A和B第一集合中的公共ε。

语法是不明确的,因为空字符串可能由S或S生成→A.→ε或S→B→ε. 为了使语法完全可解析,您需要解决歧义


可能最简单的方法是添加规则S→ε,然后将其从A和B中移除,使其基本乘积分别为A和B

ε不是一个正常值symbol@CapelliC这正是我问我问题的原因!