为什么 JFlap 无法从我的计算器语法构建可用的 LL(1) 解析器?

Why does JFlap fail to build a usable LL(1) parser from my calculator grammar?

我在JFlap中输入了如下语法:

E → TK
K → +TK
K → λ
T → FM
M → *FM
M → λ
F → i
F → (E)

并尝试解析 i * (i + i)。我确信 LL(1) 语法是正确的,输入的字符串应该被接受,但 JFlap 说该字符串被拒绝了。 (见截图)。为什么?

语法没问题。

但是,您不知何故输入错误。请注意,您的解析 table 有一个 λ 列。这意味着 JFlap 将 λ 解释为一个字符,而不是一个空的右侧,可能是因为您键入了一个真正的 λ 而不是让 JFlap 自动填充它。如果你想要一个空的右侧,你应该把右侧留空。然后 JFlap 会将其显示为 λ 但不会将其视为符号。

作为说明,这里是正确输入的语法(右侧为空)和我键入 λ 而不是将右侧留空的语法的屏幕截图。我在错误消息前一步停止了第二次解析,以便您可以看到所报告的问题:由于 M 没有空产生式,它阻止解析器识别 + 符号。

这是正确输入的语法:

这是我用与您相同的方式生成的(如果我的猜测是正确的话)。请注意,它在转换 table 中有一个 λ 列。您还会看到它在 FIRST 和 FOLLOW 集中的处理方式不同。

作为后记,JFlap 似乎可以处理令牌中的大多数 Unicode 字符,但是使用 λ 字符作为令牌会触发各种错误。因此,即使您希望 λ 成为合法字符,您也不应该这样做。