我正在使用 Kenneth Louden 的 Compiler Construction 书,但它缺少示例,而且说明如何进行的规则真的很难遵循。我不确定如何进入 LR(1) 状态。此外,不知道如何从 LR(1) 状态转到 LALR(1) 状态。
例如,这些 LR(1) 状态:
我了解“S -> .XX, $”是如何到达那里的,但接下来看看“X -> .aX, a/b”。为什么 $ 不是其中的一部分?它不是从一个有 $ 的规则生成的,所以它不是必须有一个 $ 吗?a/b是怎么出现的?根据这本书,如果 A -> alpha.Bgama,a 和 B 是非终结符,则 B -> .beta, b 为每个 B -> beta 添加 b 在第一个(gamaalpha)中。所以,据我了解:
S -> .XX, $ and X -> aX and X -> b => X -> aX, $ and X -> b, $
X -> .aX, $ and X -> b, $ => 没有任何反应
A -> .a, $ => 没有任何反应
但鉴于上面的例子,这似乎完全错误。