《2.LR.1..pptVIP

  • 14
  • 0
  • 约1.86万字
  • 约 41页
  • 2017-01-01 发布于北京
  • 举报
《2.LR.1.

G[S]: (0) S→S (1) S→L=R (2) S→R (3) L→ *R (4) L→id (5) R→L I0: S – ?S S – ?L = R S – ?R R – ?L L – ?id L – ?*R I1: S – S? I2: S – L? = R R – L? I3: S – R? I4: L – *?R R – ?L L – ?*R L – ?id I5: L – id? I6: S – L =?R R – ?L L – ?*R L – ?id I7: L – *R? I8: R – L? I9: S – L=R? I2: S – L? = R; R – L? 考虑分析表达式 id = id时,在工作到 I2 处已经把第一个 id 归约到 L了, 看到下一个输入 = 要作决策,第一个项目要设置 Action[2,=] 为S6, 即把赋值的其它部分找到. 但 =也是属于 Follow(R) 的. 第二个项目要用 R–L归约.出现 shift-reduce 冲突. 若将栈顶的符号序列归约到 R,会有问题!因为不可能有规范句型以 R = …开头 (有以 *R = ... 开头的规范句型). SLR(1)的局限 follow(R) 集包含了在任何句型中跟在 R 后的符号但没有严格地指出在一个特定的推导里哪些符号跟在R后.所以需要扩充状态以包含更多的信息:follow 集的哪些部分才是进到该状态最恰当的归约依据. 处在状态 2时,试图构建句子有两条路: 1.S ?L = R 或 2.S ? R ? L. 如下一符号是 =, 那就不能用第二个选择,必须用第一个,即移进. 只有下一个符号是#时才能归约. 尽管 = 属于 Follow(R) ,那是因为一个 R 可以出现在别的上下文中,在现在这个特定的情况,它不合适,因为在用S ? R ? L推导句子时, = 不能跟在R后. . 讨论上面的例子后有以下结果: 该文法不是LR(0)文法 ∵ I2 S→L.=R R→L.中存在移进/归约冲突 SLR能否解决I2中的冲突 ∴FOLLOW(R)={#,=}与{=}交不为空 不是SLR(1)文法 如早有信息告知: 若用 R→L 归约 则形成R=… 而 R=不是活前缀,则冲突可以解决 LR(1)比SLR(1)能力强 例: (0) S`→S (1)S→L=R (2)S→R (3)L→ *R (4)L→i (5)R→L 不能用SLR(1)技术解决,但能用LR(1) 7.4 LR(1)分析 I0: S→.S I1: S→S. I2: S→a.Ad S→.aAd S→a.ec S→.bAc A→.e S→.aec S→.bed I3: S→b.Ac I4: I5: S→b.ed S→aA.d S→ae.c A→.e A→e . I6: I7: I8: S→bA.c S→be.d S→aAd. A→e. I9: S→aec. I10: S→bAc. I11: S→bed. (0)S’→S (1) S→aAd (2) S→bAc (3) S→aec (4) S→bed (5) A→e 非 LR(0),非SLR(1) I5: S →ae.c I7: S →be.d A →e. A →e. S’==S==aAd==aed S’==S==bAc==bec S’

文档评论(0)

1亿VIP精品文档

相关文档