【发布时间】:2018-05-17 14:16:45
【问题描述】:
我在使用包含 epsilon 产生式的语法为 LR(1) 解析器构建项目集时遇到问题。例如,给定以下语法(其中 eps 代表 epsilon)
S -> a S U
U -> b
| eps
State0 是
S' -> .S, $
S -> .a S U, $
从 State0 用 'a' 移动会得到以下状态,我们称之为 State2
S -> a .S U, $
S -> .a S U, $/???
为了预测 State2 的第二项,我需要计算 FIRST(U$)。我知道 FIRST(U) = {'b', eps}。我的第一个问题是:State2 的第二项的前瞻是 $ 和 'b'?由于 U 可以是 eps,我的大脑告诉我,我也可以将 $ 作为前瞻,而不仅仅是“b”。如果 FIRST(U) 只是 {'b'},它就只是 'b'。对吗?
第二个问题:在某个时候,我会有如下状态
S -> a S .U, $
U -> .b, $
U -> .eps, $
我在这里做什么?我是否需要使用 eps 移动并使用项目 U -> eps., $ 进行设置?如果我有另一个终端作为前瞻,即X -> .eps, a/$,该怎么办?如果我搬家,最后得到一组X -> eps., $ 的表格,我会减少吗?
还有更多:我需要在解析表中插入 eps 作为符号吗?
谢谢
【问题讨论】:
-
你用什么做教材?令我惊讶的是,没有可以为空的非终结符的示例。
-
龙之书。我真的不知道我是否遗漏了一些部分,但我没有阅读有关如何具体处理这些情况的信息......
-
是的。我翻出了我的龙书副本,确实没有 LR 自动机具有 ε-产生式的工作示例。尽管如此,本书清楚地表明 ε 表示符号的空序列,而不是特殊符号。 (事实上,本书始终使用希腊字母表示符号序列,罗马字母表示单个符号,这已成为标准惯例。)...
-
此外,它对 FIRST(α) 的定义实际上是“如果 α 可以推导出空集,则推导 α 加 ε 中可能的第一个字符的集合,这意味着它是
Σ ∪ ε的子集。但在 FIRST(β$) 的情况下,很明显 Β$ 无法导出空序列,因此 FIRST 集必须是 Σ 的子集。
标签: parsing compiler-theory lr1