【发布时间】: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