我有相同数字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?
这是我不理解的......
答案 0 :(得分:0)
首先,我不确定树的正确阅读顺序是什么 - 我认为它是有序的,因为它通常与几乎所有内容相比(比较the Wikipedia article on tree traversals )但我并不完全确定是对的。 (如果这是错误的,你会想要不同的树,但想法应该翻译。)
在该读数下,您的示例树代表xxyy
。通过替换最后S
的{{1}} - A
- S
- A
- ...链,您可以得到任意ε
链1}}。
要代表xx…yy
,您需要将xy…xy
和A
的{{1}}和B
替换为xSy
或ySx
,即{{1}然后S → SAB
和B → ε
;在下一个图层上再次展开A → xSy
,现在改为S → SAB
和A → ε
;继续根据需要。一个例子:
B -> ySx
这应与 S
/|\
/ | \
S A B
/ /|\ \
ε / | \ ε
x S y
/|\
/ | \
S A B
/ / /|\
ε ε / | \
y S x
|
ε
匹配,并且可以再次在底部展开以获得更长的序列。
为了节省空间,我将从解析树中的根调用最长路径" spine"。 (对于这里的简单示例,所有off - " spine"路径都是方便的终端符号,因此树的这种描述是唯一的(足够)。通常,' side path'是更复杂,所以这个定义通常没用。这里,它很好用。)
对于这里绘制的树,它的"脊柱"将是xyxy
(只读中间)。对于任意嵌套进行扩展,将成为SASBSε
。
您上面绘制的树有"脊椎" (SASB)*(SA)?Sε
,对于SASASε
的任意长序列,您获得xxx…yyy
。
(SA)*Sε
可以用同样的方式轻松描述:" spine"是xxyxyy
。
一般来说(对于这个语法),对于任何反序列镜像"反镜像" (下半部分是上半部分被逆转并且交换了x / y - 即SASASBSε
,x|y
,xyx|yxy
,......),你可以构建这个"脊椎"只需要上半部分并展开xxy|xyy
,x → SA
并在您到达中间时添加y → SB
。 (当然,对于像Sε
这样的更复杂的模式,这会失败。找到一种快速为这些不对称模式提出树的方法留给读者练习; - )。)