【问题标题】:LR(0) or SLR(1) or LALR(1)LR(0) 或 SLR(1) 或 LALR(1)
【发布时间】:2012-04-13 23:17:39
【问题描述】:

我在一个编译器期末考试样本中尝试的问题上遇到了严重问题。如果有人能帮我解释一下,我将不胜感激。谢谢

考虑下面列出的语法 G

  1. S = E $
  2. E = E + T | T
  3. T = T * F |飞
  4. F = ident | ( E )

其中 + * ident ( ) 是终端符号,$ 是文件结尾。 a) 这个语法是 LR(0) 吗?证明你的答案。 b) 是语法 SLR(1) 吗?证明你的答案。 c) 这个语法是 LALR(1) 吗?证明你的答案。

【问题讨论】:

  • 您只是在寻找答案吗?还是您在询问您应该采取的方法?
  • 我也在寻找方法和答案。谢谢
  • 我刚刚发现了一些关于这些东西的不错的讲义:cs.umd.edu/class/spring2011/cmsc430/lectures/lec06.pdf。增加 lec07.pdf、lec08.pdf 等
  • @user976078 开始在CSTheory上问这样的问题

标签: parsing compiler-construction context-free-grammar


【解决方案1】:

如果你能证明语法是 LR(0),那么它当然是 SLR(1) 和 LALR(1),因为 LR(0) 的限制性更强。

很遗憾,语法不是 LR(0)。

例如假设你刚刚识别出 E:

S -> E . $

如果后面是 +* 符号,则不能将此 E 简化为 S,因为 E 后面可以跟着 +* 继续构建更大的表达式:

S -> E . $
E -> E . + T
T -> T . * F

这要求我们向前看一个令牌以知道在该状态下要做什么:转移(+*)或减少($)。

SLR(1) 添加前瞻,并利用后续集信息进行归约(总比没有好,但从语法全局获得的后续集信息不是上下文敏感的,就像特定于状态的前瞻集在 LALR(1)) 中。

在 SLR(1) 下,上述冲突消失了,因为只有当前瞻符号在 S 的后续集中,并且仅在 S 的后续集中时,才考虑 S -> E 减少是 EOF 符号$。如果输入符号不是$,如+,则不考虑归约;发生了与归约不冲突的转变。

因此,由于该冲突,语法不会失败为SLR(1)。但是,它可能还有其他一些冲突。扫了一眼,一个也看不见;但要正确“证明该答案的合理性”,您必须生成所有 LR(0) 状态项,并执行验证 SLR(1) 约束没有违反的例程。 (您对 SLR(1) 使用简单的 LR(0) 项,因为 SLR(1) 不会以任何新方式扩充这些项。请记住,它只是使用从语法中抄录而来的后续集合信息来消除冲突。)

如果是 SLR(1) 则 LALR(1) 属于子集关系。

更新

《红龙书》(编译器:原理、技术和工具,Aho,Sethi,Ullman,1988 年)在一组示例中使用完全相同的语法,展示了规范 LR( 0)项集和相关的DFA,以及填写解析表的一些步骤。这在第 4.7 节中,从示例 4.34 开始。

【讨论】:

  • 玩得很好——我这辈子都不记得这些语法东西的细节了,我想知道谁能记住。然后我查看了您的用户页面,并看到了您正在使用的语言的链接,这很有意义......
猜你喜欢
  • 1970-01-01
  • 2016-08-07
  • 2012-01-19
  • 1970-01-01
  • 2015-10-05
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
相关资源
最近更新 更多