📅  最后修改于: 2023-12-03 15:12:41.463000             🧑  作者: Mango
门 | GATE-CS-2006 |第 84 题
给定以下语法规则:
S -> aB | bA
A -> aS | bAA
B -> bS | aBB
从非终止符S开始,尝试编写一个可以生成字符串“baabba”的语法树的有效推导序列。
我们可以按照题目所给的语法规则,逆向构造"baabba"的生成过程。
假设我们想要产生"baabba",则可以先从非终止符S开始,根据规则S -> bA 生成该字符串的前缀"baa"。生成过程如下:
S
| \
| bA
| \
b AA
/ \
aS A
| \
a aS
|
bA
|
b
接下来,我们需要将"A"替换成"ba"以继续生成字符串。由于规则A -> aS,我们需要从"A"的左子树再生成一段"ba"。因此,我们需要将该子树替换成如下所示:
A
| \
| bAA
| \
a A
/ \
bS A
| \
a bAA
|
aA
|
aS
|
bA
|
b
现在,我们已经生成了字符串的前半部分"baab",剩下的"ba"可以通过替换非终止符"B"来完成。由于规则B -> bS,我们需要从"B"的左子树生成一段"ba"。因此,我们可以将该子树替换成如下所示:
B
| \
| aBB
| \
b BB
/ \
bS B
| \
a aBB
|
bA
|
b
这样,我们就成功地构造出了可以生成字符串"baabba"的语法树,推导序列为:"S -> bA -> bAA -> baS -> babA -> babaS -> babaaB -> baabS -> baabbA -> baabbaB"。
于是,这道题就被完美解决了。
S -> bA
A -> bAA | aS
B -> aBB | bS
注意,这里的代码片段是将语法规则中的每一行反过来写的,以便于按照反推的方式理解生成过程。实际使用时,请按照原来的语法规则书写代码。