【发布时间】:2020-05-28 21:54:35
【问题描述】:
我在JFlap中输入了如下语法:
E → TK
K → +TK
K → λ
T → FM
M → *FM
M → λ
F → i
F → (E)
并尝试解析i * (i + i)。我确信 LL(1) 语法是正确的,输入字符串应该被接受,但 JFlap 说该字符串被拒绝。 (见截图)。为什么?
【问题讨论】:
我在JFlap中输入了如下语法:
E → TK
K → +TK
K → λ
T → FM
M → *FM
M → λ
F → i
F → (E)
并尝试解析i * (i + i)。我确信 LL(1) 语法是正确的,输入字符串应该被接受,但 JFlap 说该字符串被拒绝。 (见截图)。为什么?
【问题讨论】:
语法没问题。
但是,您不知何故输入错误。请注意,您的解析表有一个 λ 列。这意味着 JFlap 将 λ 解释为一个字符,而不是一个空白的右侧,这可能是因为您键入了一个真正的 λ 而不是让 JFlap 自动填充它。如果你想要一个空的右手边,你应该把右手边留空。 JFlap 然后会将其显示为 λ,但不会将其视为符号。
作为说明,这里是正确输入的语法(右侧为空)和我键入 λ 而不是将右侧留空的语法的屏幕截图。我在错误消息前一步停止了第二个解析,以便您可以看到报告的问题:由于M 没有空产生式,它会阻止解析器识别+ 符号。
这是正确输入的语法:
这是我以与您相同的方式生成的一个(如果我的猜测是正确的)。请注意,它在转换表中有一个 λ 列。您还会看到它在 FIRST 和 FOLLOW 集中的处理方式不同。
作为后记,JFlap 似乎可以处理令牌中的大多数 Unicode 字符,但是使用 λ 字符作为令牌会触发各种错误。因此,即使您打算将 λ 用作合法字符,也不应该这样做。
【讨论】: