【问题标题】:LR(1) parsing table with epsilon productionsLR(1) 使用 epsilon 产生式解析表
【发布时间】: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


【解决方案1】:
  1. FIRST(U$) 表示“可以在U$ 的派生中首先出现的符号集”。显然,如果U 可以导出空字符串,则$ 必须是该集合的一部分。输入结束标记$ 确保我们永远不必担心FIRST 集中的epsilons。 (如果我们使用 LR(k) 而不是 LR(1),我们将使用 k 结束标记,以便 FIRST<sub>k</sub> 中的所有字符串的长度为 k

  2. U → (或U → ε,如果您坚持的话)关联的项目是U → • 。换句话说,它是可归约的,并且应该在匹配前瞻时触发归约操作。

  3. ε 不是符号;我们只(有时)使用它来使空字符串可见。但是空字符串是空的。

【讨论】:

    猜你喜欢
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多