【问题标题】:Context Free Grammar Parse Tree上下文无关语法分析树
【发布时间】:2014-09-27 20:17:37
【问题描述】:

我有相等数字 x 和 y 的字符串。我的 CFG 应该以 xy、xyxy、xyxyxy、xxxyyy 和 xxyxyy 的形式接受它们。

我想出了这些生产规则:

S --> SAB |e

A --> xSy |e

B --> ySx |e

我正在创建解析树,但我并不完全理解。这就是我所做的

                                      S
                                   /  |  \
                                  S   A   B
                                 /  / | \   \
                               e   x  S  y    e
                                    / | \
                                  S   A   B
                                 /  / | \   \
                                e  x  S  y   e
                                      |
                                      e

如果我理解正确,上面的解析树代表 xyxy.... 如果我继续的话,也是这样一个

这怎么代表xxyy?

怎么能代表xxyxyy?

这是我不明白的......

【问题讨论】:

  • 欢迎来到 StackExchange!您可能想在计算机科学 StackExchange cs.stackexchange.com 中提出此类问题
  • 你是怎么想出这些规则的?你能解释一下它们是如何工作的,独立于解析树吗?

标签: context-free-grammar


【解决方案1】:

首先,我不确定树的正确阅读顺序是什么——我认为它是有序的,因为它通常与几乎所有内容(比较 the Wikipedia article on tree traversals)但我不确定那是对。 (如果这是错误的,你会想要不同的树,但想法应该翻译。)

在该读数下,您的示例树表示xxyy。通过进一步用S-A-S-A-… 链替换最底部的ε,您将获得xx…yy 的任意链。

要表示xy…xy,您可以交替扩展As 和Bs 为xSyySx,即:S → SAB,然后是B → εA → xSy;在下一层再次展开S → SAB,但现在做A → εB -> ySx;根据需要继续。一个例子:

            S
           /|\
          / | \
         S  A  B
        /  /|\  \
       ε  / | \  ε
         x  S  y
           /|\
          / | \
         S  A  B
        /  /  /|\
       ε  ε  / | \
            y  S  x
               |
               ε

这应该匹配xyxy,并且可以再次在底部展开更长的序列。

为了节省空间,我将把解析树中从根开始的最长路径称为“脊椎”。 (对于这里的简单示例,所有偏离“脊柱”的路径都是方便的终端符号,因此对树的这种描述是唯一的(足够)。一般来说,“侧路径”更复杂,所以这个定义通常是无用的。这里,效果很好。)

对于这里绘制的树,它的“脊椎”将是SASBSε(请从中间往下读)。扩展为任意嵌套,将变为(SASB)<sup>*</sup>(SA)<sup>?</sup>Sε

你在上面画的树有“脊椎”SASASε,对于任意长的xxx…yyy序列,你会得到(SA)<sup>*</sup>Sε

xxyxyy 很容易用同样的方式描述:它的“脊椎”是SASASBSε

一般来说(对于这个语法),对于任何“反向镜像”的序列(后半部分是前半部分反转并且 x/y 交换 - 即x|yxyx|yxyxxy|xyy,... ),您可以通过只取前半部分并扩展x → SAy → SB 并在到达中间时添加 来构建这个“脊椎”。 (当然,对于像xxyyyx 这样更复杂的模式,这会失败。寻找一种方法来快速为这些不对称模式生成树作为练习留给读者;-)。)

【讨论】:

  • 我明白了!谢谢解释
猜你喜欢
  • 2013-10-17
  • 2012-01-04
  • 2012-04-12
  • 2014-04-26
  • 2011-12-16
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多