【发布时间】:2013-05-01 18:41:08
【问题描述】:
鉴于此语法:
S → S1 S2
S1 → a | ε
S2 → ab | ε
因此,我们有
FIRST(S1) = { a, ε }
FOLLOW(S1) = { a }
这是否意味着在解析表中我将在 S1 的行和 a 的列中有多个定义?
【问题讨论】:
标签: parsing compiler-construction context-free-grammar ll
鉴于此语法:
S → S1 S2
S1 → a | ε
S2 → ab | ε
因此,我们有
FIRST(S1) = { a, ε }
FOLLOW(S1) = { a }
这是否意味着在解析表中我将在 S1 的行和 a 的列中有多个定义?
【问题讨论】:
标签: parsing compiler-construction context-free-grammar ll
是的,没错。 (但是,请注意您的 FOLLOW 集是错误的;它还包含输入结束标记 $)。这里的问题是,如果解析器看到a,它无法判断那是否是因为它想要使用派生
S → S1S2 → 一个 S2
或者推导
S → S1S2 → S2 → ab
要解决此问题,您可以注意您的语法仅生成字符串 { a, ab, aab }。因此,您可以为直接产生这三个字符串的语言语法构建一个 LL(1):
S→aY
Y → ε |一个Z
Z → ε | b
希望这会有所帮助!
【讨论】: