看一下表达式
对于上面的表达式,我想构造一个无上下文语法,'w'的出现次数必须等于('k'的出现次数除以2,因为'k'在语言中是n * 2)+ (有m个出现的's的出现次数)
换句话说,必须有n + m次出现'w' 到目前为止我已经有了这个
S ---> XYZ
X ---> KX | K | Y
Y ---> DY | DD | Z
Z ---> (这里,我如何得到m + n次出现的“w”)?
完成此上下文免费语法的任何建议或提示?
答案 0 :(得分:0)
您的方法存在问题,因为您失去了之前添加了多少k以及稍后需要添加多少w之间的联系。因此,任何接触2n k的产品都必须触及;同样地,任何涉及m d的制作必须触及w的原因。
寻找以您的语言创建这些链接的方法,您可以确定这些所需产品的外观。这样做的一种常常有用的方法是重写输入并添加括号以显示处理事物的顺序。我们知道我们需要在2n k和w之间建立联系,我们我们知道我们需要在m和d之间建立联系。 d更接近,所以我们可以从那里开始。我们可以通过在数字和周围放置括号来将d与s连接起来,以便我们可以找到所附术语的语法。通过附上m w,我们得到一个简单的语法:中间有ak的奇数字符串,左边是d,右边有w和相同数量的d' s和w。
有了这个处理,我们现在看到k和w之间有一个简单的联系:有2n k&s和n w' s,所以我们需要一个与以前相同语言的作品,除了我们有k而不是d而不是数字是相同的,我们有两倍的k'和w' s。秒。
k^(2n) d^m k w^(m+n) d^2
= k^(2n) [d^m k w^m] w^n d^2
= [k^(2n) [d^m k w^m] w^n] d^2
我们理解内部的联系,现在我们可以在外面写出语法:
S -> Tdd // handles the d^2 part on the end
T -> kkTw // recursive part of the term in the outermost brackets
T -> R // switch to handle the term in the innermost brackets
R -> dRw // recursive part of the term in the innermost brackets
R -> k // base case of the term in the innermost brackets