设计无上下文语法(CFG)的建议

时间:2013-11-08 09:41:58

标签: grammar context-free-grammar automata formal-languages

我正在尝试为:

创建一个CFG
  

L = {az n |a∈{x,y} *和n = a中x的个数或}中的y个数

我不确定如何或从哪里开始。

我理解语言描述是x和y的字符串,后跟一串z,其中z的数量必须与x或y相同。

示例:{xxyxyyxxyzzzzz, yxyxyxyyyzzzzzz, etc...}

这是我的“最佳”解决方案:

S => xSz | ySz | ϵ

我知道这是错误的,因为z产生相同数量的x和y组合,而不是单独的x或y。

编辑:

我认为这是答案,但我不确定。它似乎有效。

S => xSz | ySz | xS | yS | ϵ

编辑:

那不行,因为它也接受无效字符串......

2 个答案:

答案 0 :(得分:1)

我认为您的问题可以分解为两种语言的联合

  

L = L 1 U L 2

L 1 是(x i ,y j )z k 其中i == k和L 2 足够j == k

换句话说,L 1 包含相等的x和z,而L 2 包含相等的y和z。

因此,对于L 1 ,我们可以将CFG组成

  

S 1 =&gt; 1 S 1 z |乙<子> 1

     

1 =&gt; 1 B 1 | B 1 A 1 | X

     

B 1 =&gt; yB 1 | ë

前两个产品确保它产生相同数量的x和z;

同样,我们可以为L 2 构建CFG:

  

S 2 =&gt; 2 S 2 z |乙<子> 2

     

2 =&gt; A 2 B 2 | B 2 A 2 | ÿ

     

B 2 =&gt; xB 2 | ë

最后,我们可以将这些作品联合起来得到答案:

  

S =&gt; S 1 |小号<子> 2

答案 1 :(得分:0)

我认为这就是答案:

S = A | B
A = C xSz | C
B = D ySz | D
C = yC | e
D = xD | e

不确定是否可以减少