CFG 解析树 - 最右边的推导

问题描述

所以我们有一个活动,我们必须从给定的语法生成解析。

enter image description here

我们还被问到以下哪些给定的字符串会产生语法。

我能够生成 abcd

enter image description here

但在问题 2 中,它说要从问题 1 中重新生成字符串,但使用最右边的推导。 但只有 2 个扩展,据我所知,最右/最左推导是解析树的哪一侧扩展更多。

所以我试图延长我的解析树,但现在的问题是我无法生成任何给定的字符串来生成

enter image description here

我是不是遗漏了什么,还是我有什么错误

解决方法

派生以开始符号(在本例中为 <S>)开始,以派生句(abcd)结束。推导中的每一步都包括用其可能的产生式之一替换某些非终结符。如果推导的结果仍然包含至少一个非终结符,则称为“句子形式”;否则,就是派生句,派生结束。

在你的推导的第一步之后(如你的解析树所示),你有句子形式

a <S> c <B>

下一个派生步骤需要使用其产生式之一替换 <S> 或使用其产生式之一替换 <B>。 (两种可能性都会导致相同的解析树,因为这是一种上下文无关文法,因此推导的顺序无关紧要。)如果我们选择使用产生式 <S> 扩展 <S>→b,则推导步骤的结果将是句子形式

a b c <B>

在最右边的推导中,为每个推导步骤选择的非终结符是句子形式中最右边的非终结符。在最左边的推导中,它是最左边的非终结符。如果句子形式中只有一个非终结符,则不管它是最左边还是最右边都会被选中。

这与解析树的倾斜方式无关。无论如何都会生成相同的解析树。 (或者相同的解析树,如果语法有歧义。)

除非您的试卷需要,否则您不必按最左或最右的顺序进行推导。如果您总是使用中间的非终端,您仍然会得到相同的解析,对于“中间”的一些明确定义。或者,如果您只是选择了一个随机的非终端并扩展了它。但据我所知,没有人发现有必要讨论最中间的推导。