【发布时间】:2016-05-03 23:04:33
【问题描述】:
有什么方法可以为 sss 构建不受限制的语法?我知道为了构造ss,你需要构造ss^r,然后重新反转第二个字符串,但是sss怎么做呢?
【问题讨论】:
有什么方法可以为 sss 构建不受限制的语法?我知道为了构造ss,你需要构造ss^r,然后重新反转第二个字符串,但是sss怎么做呢?
【问题讨论】:
这可能存在一些错误,但这个想法应该能让你走上正轨。
// section 1
S := LTR
T := ATWX | BTYZ | N
// section 2
WW' := W'W
WY' := Y'W
YW' := W'Y
YY' := Y'Y
// section 3
WX' := W'X'
WZ' := W'Z'
YX' := Y'X'
YZ' := Y'Z'
// section 4
XW' := W'X
XX' := X'X
XY' := Y'X
XZ' := Z'X
ZW' := W'Z
ZX' := X'Z
ZY' := Y'Z
ZZ' := Z'Z
// section 5
XR := X'R
ZR := Z'R
// section 6
NW' := W'N
NX' := X'N
NY' := Y'N
NZ' := Z'N
NR := Q
// section 7
AQ := Qa
W'Q := Qa
X'Q := Qa
BQ := Qb
Y'Q := Qb
Z'Q := Qb
LQ := e
第 1 节列出了基本方案。我们将用 L 和 R 标记我们工作空间的开始和结束,使其非常明确。 T 是我们的工作空间,L 和 R 是左右标记。我们的工作空间可以添加三个as(这些是 A、W 和 X 稍后将成为的)或添加三个 bs(这些是 B、Y 和 Z 将成为稍后)或者它可以退出生成特殊的非终结符 N。N 将把我们的非终结符字符串变成一串终结符,我们稍后会看到。
所以我们需要在(a+b)* 中为x 提供xxx。由于我们设置制作的方式,A 和 B 被添加到第一个 x 的末尾。第 2 部分的工作是确保将 W 和 Y 添加到第二个 x 的末尾。不幸的是,我们的作品将W 和Y 放在第二个x 的开头,因此,如果不进行更正,我们最终会得到xx^R。第 2 节通过将W 和Y“浮动”到右侧来纠正这个问题,只要它们位于已经找到合适位置的W 或Y 的左侧。 Ws 和 Ys 不能相互通过,因此这保证了一旦音乐停止,它们将以正确的顺序结束。
第 3 节展示了第二次出现 x 中的符号如何找到它们的正确位置。基本上,它们会向右移动(基于第 2 节),直到它们在适当的位置找到第三个 x 的符号。由于第二个x 的符号在第三个x 的符号之前有其适当的位置,因此第三个x (X 或Z)的符号之前的最后一个可能的正确位置是第二个x 的每个符号。所以我们一直浮动到第二个x的末尾。
我们在第 4 节中对第三个 x 重复该过程,尽管我们必须让这些符号(X 和 Z)浮过第二个或第三个 x 中已经找到的所有符号他们应有的地方。这些符号不能自行传递,因此按照我们在第 2 节中看到的相同逻辑,我们将以正确的顺序获取符号。
第 5 节说明何时停止构成右侧第三个 x 的浮动符号。还记得工作空间标记R 的结尾吗?第三个x 的最后一个符号一直出现在右侧,就在R 之前。这就是我们知道我们找到了符号的正确位置的时候。
第 6 节开始完成我们的推导过程。我们有一串可爱的非终结符,我们想把它们变成终结符。我们要做的第一件事就是将N 向右浮动,越过第二个和第三个xs 的正确放置的符号,一直到字符串标记R 的末尾。我们不需要任何R,所以我们将N 转换为Q。正如我们将在下一节中看到的,Q 是让魔法发生的原因。
第 7 节概述了Q 如何在整个非终结符字符串中向左浮动,这些非终结符一直到L,一直到L,将非终结符更改为正确的终结符。一旦找到L,它就会消除两个非终结符,只留下一串终结符。推导完成。
为了说明这个过程,让我们生成aabaabaab。
S
-> LTR
-> LATWXR
-> LAATWXWXR
-> LAABTYZWXWXR
-> LAABNYZWXWXR
-> LAABNYZWXWX'R
-> LAABNYZWXW'X'R
-> LAABNYZWW'XX'R
-> LAABNYZWW'X'XR
-> LAABNYZWW'X'X'R
-> LAABNYZW'WX'X'R
-> LAABNYZW'W'X'X'R
-> LAABNYW'ZW'X'X'R
-> LAABNYW'W'ZX'X'R
-> LAABNYW'W'X'ZX'R
-> LAABNYW'W'X'X'ZR
-> LAABNYW'W'X'X'Z'R
-> LAABNW'YW'X'X'Z'R
-> LAABNW'W'YX'X'Z'R
-> LAABNW'W'Y'X'X'Z'R
-> LAABW'NW'Y'X'X'Z'R
-> LAABW'W'NY'X'X'Z'R
-> LAABW'W'Y'NX'X'Z'R
-> LAABW'W'Y'X'NX'Z'R
-> LAABW'W'Y'X'X'NZ'R
-> LAABW'W'Y'X'X'Z'NR
-> LAABW'W'Y'X'X'Z'Q
-> LAABW'W'Y'X'X'Qb
-> LAABW'W'Y'X'Qab
-> LAABW'W'Y'Qaab
-> LAABW'W'Qbaab
-> LAABW'Qabaab
-> LAABQaabaab
-> LAAQbaabaab
-> LAQabaabaab
-> LQaabaabaab
-> aabaabaab
【讨论】: