问题描述
我们还被问到以下哪些给定的字符串会产生语法。
我能够生成 abcd
但在问题 2 中,它说要从问题 1 中重新生成字符串,但使用最右边的推导。 但只有 2 个扩展,据我所知,最右/最左推导是解析树的哪一侧扩展更多。
所以我试图延长我的解析树,但现在的问题是我无法生成任何给定的字符串来生成。
解决方法
派生以开始符号(在本例中为 <S>
)开始,以派生句(abcd
)结束。推导中的每一步都包括用其可能的产生式之一替换某些非终结符。如果推导的结果仍然包含至少一个非终结符,则称为“句子形式”;否则,就是派生句,派生结束。
在你的推导的第一步之后(如你的解析树所示),你有句子形式
a <S> c <B>
下一个派生步骤需要使用其产生式之一替换 <S>
或使用其产生式之一替换 <B>
。 (两种可能性都会导致相同的解析树,因为这是一种上下文无关文法,因此推导的顺序无关紧要。)如果我们选择使用产生式 <S>
扩展 <S>→b
,则推导步骤的结果将是句子形式
a b c <B>
在最右边的推导中,为每个推导步骤选择的非终结符是句子形式中最右边的非终结符。在最左边的推导中,它是最左边的非终结符。如果句子形式中只有一个非终结符,则不管它是最左边还是最右边都会被选中。
这与解析树的倾斜方式无关。无论如何都会生成相同的解析树。 (或者相同的解析树,如果语法有歧义。)
除非您的试卷需要,否则您不必按最左或最右的顺序进行推导。如果您总是使用中间的非终端,您仍然会得到相同的解析,对于“中间”的一些明确定义。或者,如果您只是选择了一个随机的非终端并扩展了它。但据我所知,没有人发现有必要讨论最中间的推导。