上下文免费语法解析树

时间:2014-09-27 20:17:37

标签: context-free-grammar

我有相同数字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?

这是我不理解的......

1 个答案:

答案 0 :(得分:0)

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

在该读数下,您的示例树代表xxyy。通过替换最后S的{​​{1}} - A - S - A - ...链,您可以得到任意ε链1}}。

要代表xx…yy,您需要将xy…xyA的{​​{1}}和B替换为xSyySx,即{{1}然后S → SABB → ε;在下一个图层上再次展开A → xSy,现在改为S → SABA → ε;继续根据需要。一个例子:

B -> ySx

这应与 S /|\ / | \ S A B / /|\ \ ε / | \ ε x S y /|\ / | \ S A B / / /|\ ε ε / | \ y S x | ε 匹配,并且可以再次在底部展开以获得更长的序列。

为了节省空间,我将从解析树中的根调用最长路径" spine"。 (对于这里的简单示例,所有off - " spine"路径都是方便的终端符号,因此树的这种描述是唯一的(足够)。通常,' side path'是更复杂,所以这个定义通常没用。这里,它很好用。)

对于这里绘制的树,它的"脊柱"将是xyxy(只读中间)。对于任意嵌套进行扩展,将成为SASBSε

您上面绘制的树有"脊椎" (SASB)*(SA)?,对于SASASε的任意长序列,您获得xxx…yyy

(SA)*可以用同样的方式轻松描述:" spine"是xxyxyy

一般来说(对于这个语法),对于任何反序列镜像"反镜像" (下半部分是上半部分被逆转并且交换了x / y - 即SASASBSεx|yxyx|yxy,......),你可以构建这个"脊椎"只需要上半部分并展开xxy|xyyx → SA并在您到达中间时添加y → SB。 (当然,对于像这样的更复杂的模式,这会失败。找到一种快速为这些不对称模式提出树的方法留给读者练习; - )。)