问问题
227 次
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生成的:
- '$'(输入结束)的额外列被添加到包含每个包含 S → E • '$' 的项目集的 acc 的操作表中。
(实际上,您不需要“额外的列”部分;使用明确的结束标记,您应该已经有一个列。关键是用 acc 操作覆盖 shift 操作。)
于 2012-10-17T23:18:51.913 回答