龙书第二章的问题

时间:2012-03-28 07:13:45

标签: parsing compiler-construction compiler-theory parse-tree

在第29页上,它说“从左到右读取的解析树的叶子形成树的产量,这是从解析树根部的非终结符号生成或派生的字符串。在图2.2中生成的字符串是9-5 * 2.在该图中,所有的叶子都显示在底层。从此,我们不一定以这种方式排列叶子。“为什么不呢?

它还说“任何树都会给它的叶子赋予一个自然的从左到右的顺序,基于这样的想法:如果a和b是同一个父母的两个孩子,并且a在b的左边,那么所有a的后代在b的后代的左边。“这是什么意思?

P.S这是本书的第二版

1 个答案:

答案 0 :(得分:3)

首先,对于其他想要对此发表评论的人,上面的页码是指第一版。在第二版中,页码是46,参考的图是图2.5。

编辑:当提到将树叶向下延伸到底部时,作者正在谈论将树的所有叶子彼此垂直对齐,无论它们是否在树中处于同一水平。图2.2将它们延伸到底部,这样每个叶子都在图的底部,从左到右垂直对齐。如果您在本书的后面部分查看其他一些图表,则不会这样做,并且叶子会显示为与同一级别的其他节点垂直对齐,无论这些其他节点是否为叶子。后一种方式是绘制树木的常规方式,并且是最节省空间的。

至于你的第一个问题,我相信他们不这样做的原因是为了节省空间。如果你看一下图2.4的右边,如果作者要将树叶向下延伸到底部,那么以字母为根的子树必须向右移动,占用的空间比实际的多需要。虽然这是一个极小的情况,并没有产生巨大的差异,但可以想象一个更大的树(我确信在书中,虽然我没有去看),这将需要更多的空间。

对于第二个问题,它基本上是说如果你有* b + c * d,并且你认为乘法是兄弟姐妹(因为他们将保持操作顺序有效),那么叶子a和b将在树的c和d的左边,就像它们在等式中的c和d的左边一样。基本上它只是说它在第一部分已经说过的内容,即树的叶子应该能够从左到右读取,以便完全重现原始语法,而不是切换任何部分的顺序(即如果树读取从左到右c * d + a * b,可能仍然有效,但不是我们正在考虑的树。