为sss构建无限制语法的方法是什么?我知道为了构造ss,你需要构造ss ^ r然后重新反转第二个字符串,但是如何为sss做呢?
答案 0 :(得分:0)
这可能有一些错误,但这个想法应该让你走上正轨。
// 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是左右标记。我们的工作空间可以添加三个a
s(这些是A,W和X将在以后变为)或添加三个b
s(这些是B,Y和Z将在以后变为)或它可以通过生成特殊的非终结N来退出.N将会将我们的非终结字符串变成一串终端,我们稍后会看到。
因此xxx
中的x
需要(a+b)*
。由于我们设置制作的方式,A
和B
被添加到第一个x
的末尾。第2部分的工作是确保将W
和Y
添加到第二个x
的末尾。不幸的是,我们的作品将W
和Y
置于第二个x
的开头,因此,如果不进行更正,我们最终会得到xx^R
。第2节通过"浮动"纠正了这个问题。只要W
或Y
已经找到了正确的位置,就可以向右W
和Y
。 W
和Y
s不能相互传递,因此一旦音乐停止,这可以保证它们以正确的顺序结束。
第3节显示第二次出现x
中的符号如何找到正确的位置。基本上,他们向右移动(基于第2部分),直到找到第三个x
的符号在他们适当的位置。由于第二个x
的符号在第三个x
的符号之前有适当的位置,因此在第三个x
(X
或{的任一个符号之前的最后一个可能位置{1}})是第二个Z
的每个符号的正确位置。所以我们一直向右移动到第二个x
的末尾。
我们在第4部分重复第3个x
的过程,但我们必须让这些符号(x
和X
)浮过第二个或第三个符号Z
{1}}已经找到了合适的位置。这些符号不能通过自己,所以通过我们在第2节中看到的相同逻辑,我们将以正确的顺序得到符号。
第5节说明何时停止构成右边第三个x
的浮动符号。还记得工作空间标记x
的结束吗?第三个R
的最后一个符号一直出现在x
之前的右侧。所以,当我们知道我们找到了符号的适当位置时。
第6节开始完成推导的过程。我们有一串可爱的非终结者,我们想把它们变成终端。我们要做的第一件事就是将R
向右移过第二个和第三个N
的放置符号,一直到字符串标记x
的末尾。我们不需要R
任何内容,因此我们将R
转换为N
。正如我们将在下一节中看到的那样Q
是神奇发生的原因。
第7节概述了Q
如何在整个非终结点字符串中向左移动,这些非终结符号一直找到Q
,将非终结符号改为正确的终端。一旦找到L
,它就会消除两个非终结符号,只留下一串终结符号。推导完成。
为了说明这个过程,我们生成L
。
aabaabaab