📜  门| GATE-CS-2006 |第 84 题(1)

📅  最后修改于: 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

注意,这里的代码片段是将语法规则中的每一行反过来写的,以便于按照反推的方式理解生成过程。实际使用时,请按照原来的语法规则书写代码。