【问题标题】:Why do we put 'A' as the look ahead symbol when all have `$`?为什么我们把 'A' 作为前瞻符号,当所有都有 `$` 时?
【发布时间】:2013-04-19 14:28:15
【问题描述】:

我正在使用 canonical LR Method 来构造 Parsing 表。

考虑语法:

s -> D C A
s -> D a B
a -> C
s -> a A

我正在阅读的书提到第一个关闭状态为:

I(0) = [s -> .D C A , $]
       [s -> .D a B , $]
       [a -> .C , A]
       [s -> .a A , $]

在状态

[a -> .C , A]

item 中的A 来自哪里?所有项目都有 $ 作为 前瞻符号,第三个项目有 A

请解释一下。

【问题讨论】:

  • 你有没有在书中搜索过是否是已知错误?你能给出书名(和版本)吗?
  • 请注意,对于第三项,符号 preceding -> 也不同:它是 a 而不是 s。看起来像是替换了第一条中的第四条规则。
  • @MSalters 编辑了问题。这是一个错字
  • @Damien_The_Unbeliever books.google.co.in/… 编译器设计原理

标签: parsing syntax compiler-construction lr


【解决方案1】:

物品:

[ a -> · C, A ]

项目扩展的结果:

[ s -> · a A ]

其中非终结符a 后跟终结符A。这意味着C 减少到a 可以发生在上下文为s -> a · A 的后继状态中;或者,换句话说,当前瞻是A

您提到的状态中的所有其他项目都来自初始(隐式)项目

[ s' -> · s $ ]

其中非终结符s 后跟伪终结符$(即输入结束标记),因此它们的前瞻都是$

【讨论】:

  • "..这意味着 C 还原为 a 可以发生在上下文为 s -> a · A 的后续状态;或者换句话说,当前瞻为 A 。” 请您详细说明一下。我不明白
  • @saplingPro:LR 解析背后的想法是,当您处于一个项目末尾带有点的状态时(例如a -> C ·),您将得到左侧( C) 位于解析堆栈的顶部,因此您可以将其减少到右侧 (a)。那是减少。前瞻用于决定减少是否合法。所以[ a -> C ·, A ] 项意味着如果前瞻为A,您可以将C 减少为a[ a -> · C, A ] 将在 C 移动后转换为 [ a-> C ·, A ]。前瞻被保留,所以当我们进入缩减状态时它将应用。
  • ".. 左侧 (C) 位于解析堆栈的顶部,因此您可以将其减少到右侧 (a)。" i> 在生产中,a->C.C 在右侧,a 在左侧。为什么说反了?
  • @saplingPro:因为我的左右手总是有问题 :) 我的意思正好相反。
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 2020-05-31
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 2015-11-21
  • 2023-03-14
  • 2013-02-05
相关资源
最近更新 更多