【问题标题】:How to Parse a given LALR(1) Grammar如何解析给定的 LALR(1) 语法
【发布时间】:2019-11-05 05:20:42
【问题描述】:

我在使用 LALR 方法解析以下语法时遇到问题。

s -> y
y -> dX | ydX
X -> e | Zd
z -> F | epsilon

一开始我没问题,这里是项目状态 0:(分隔前瞻状态的 , )

s -> .y, $
y -> .dX, $d
y -> .ydX, $d

现在这很好,但是当您从 d 终端转到状态 1 时,我会感到困惑。我的书的状态 2 如下:

y -> d.X, $d
X -> .e, $d
X -> .Zd, $d
Z -> .f, d
Z -> ., d

X 非终端中的前瞻终端“d”来自哪里?我以为 d.X 来自 .dX,它有前瞻终端“$”和 $d”。但是当做 E-closure 时,前瞻不应该是 $d 的第一个,它是“$”?为什么是“$”,还是“d”?我认为它可能来自另一个状态,因为这是 LALR,但我最终合并状态 1 的状态在前瞻中也没有 d。有人可以向我解释为什么有一个“d”配对在这个状态的前瞻中有“$”?谢谢。

【问题讨论】:

  • $d 这里不是两个符号的前瞻;它是集合{$, d} 的简写。集合的FIRST 由集合的元素FIRST 中的所有符号组成,因此FIRST({$, d}) 恰好是{$, d}

标签: compiler-construction automata lalr lr1


【解决方案1】:

S$->Y$->dX$ 在这个 d 之后的推导序列中 X 后面是 {$}

S$->Y$->ydX$->dXdX$ 在第一个 d 之后的推导中,X 之后是 {d}

在覆盖输入'd'中的第一个符号后,两个推导序列都覆盖在相同的状态

【讨论】:

  • 我还是一头雾水。我知道在检查语法时,X 后面是 {d},但我一直被教导说,在进行 E-closure 时,你取那个非终结符之后的第一个字符串。为什么在这种情况下不起作用?
  • 有两种情况: case1: A->aBβ 我们将采用 FIRST(β) 但如果 FIRST(β) 包含 null 或 A->aB 则应考虑 A 后面的任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多