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

问题描述 投票:1回答:1

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

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

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

“我的语法截屏”

grammar ll jflap
1个回答
0
投票

语法很好。

但是,您以某种方式输入错误。请注意,您的解析表有一个λ列。这意味着JFlap会将λ解释为字符,而不是空白的右侧,这可能是因为您键入了一个真实的λ而不是让JFlap自动填充。如果您希望右侧为空,则应只保留右侧为空。然后,JFlap将其显示为λ,但不会将其视为符号。

通过说明,这是正确输入的语法(右侧为空)和我键入λ而不是将右侧保留为空的语法的屏幕截图。我比错误消息更早地停止了第二步分析,因此您可以看到所报告的问题:由于M没有空的产生,因此它阻止了解析器识别+符号。

以下是正确输入的语法:

enter image description here

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

enter image description here

作为附言,JFlap似乎可以处理令牌中的大多数Unicode字符,但是将λ字符用作令牌会触发各种错误。因此,即使您打算让λ为合法字符,而不是空白的右侧,也不应这样做。

© www.soinside.com 2019 - 2024. All rights reserved.