0
4

1 回答 1

1

(在更仔细地阅读了那个维基百科页面之后。)

维基百科引用是(强调添加):

如果一个项目集 i 包含一个形式为 A → w • 的项目,并且 A → w 是m > 0 的规则 m,则动作表中状态 i 的行完全被归约动作 r m填充。

规则 0 是增强的开始规则,在您的情况下应该是:

start : mexp '$'

(就个人而言,我更喜欢显式添加 EOF 令牌;这样的例外情况较少。)

但是,我认为您所拥有的是:

start : exp '$'
exp   : mexp

这实际上不是 LR(0),因为单位缩减规则 (exp → mexp) 会导致您发现的移位缩减冲突。

m = 0如果规则是用明确的结束标记编写的,那么维基百科文章的例外是不必要的;在这种情况下,动作acc是根据修改后的动作3生成的:

  1. '$'(输入结束)的额外列被添加到包含每个包含 S → E • '$' 的项目集的 acc 的操作表中。

(实际上,您不需要“额外的列”部分;使用明确的结束标记,您应该已经有一个列。关键是用 acc 操作覆盖 shift 操作。)

于 2012-10-17T23:18:51.913 回答