查找以下内容的上下文无关语法

时间:2019-10-14 12:15:12

标签: context-free-grammar

L = {a ^ n b ^ m c ^ k | n = m + 2k}

L = {wE(a,b)* | Na(w)+ 2Nb(w)!= Nc(w)}

查找以下内容(生成规则)的上下文无关语法

1 个答案:

答案 0 :(得分:1)

对于第一个,将其重写为L = {a ^ 2k a ^ m b ^ m c ^ k}。请注意,我们可以从外部开始构建字符串,方法是首先要求为每个c添加两个a,然后再要求为每个b添加另一个a。

S -> aaSc | T    // add two a to the front and one c to the back
T -> aTb | e     // add one a and one b to the middle

对于第二个,将其重写为不同情况的并集:

  1. Na(w)+ 2Nb(w)
  2. Na(w)+ 2Nb(w)> Nc(w)

我们可以从Na(w)+ 2Nb(w)= Nc(w)的语法开始:

S -> Sac | Sca | aSc | acS | caS | cSa | SS | T
T -> Tbcc | Tcbc | Tccb | TScc | bcTc | bccT | cTbc 
          | cTcb | cbTc | cbcT | ccTb | ccbT | TT | e

对于情况1,我们需要更多c。我们可以如下更改上述语法:

S -> Sac | Sca | aSc | acS | caS | cSa | SS | T
T -> Tbcc | Tcbc | Tccb | bTcc | bcTc | bccT | cTbc 
          | cTcb | cbTc | cbcT | ccTb | ccbT | TT | C
C -> cC | c

这确保至少有一个c被添加到某处,并允许任意数量的额外c被添加到任何地方。对于情况2,我们需要更多a或b。我们可以如下更改上述语法:

S -> Sac | Sca | aSc | acS | caS | cSa | SS | T
T -> Tbcc | Tcbc | Tccb | bTcc | bcTc | bccT | cTbc 
          | cTcb | cbTc | cbcT | ccTb | ccbT | TT | C
C -> aC | bC | a | b

这可以确保在某个位置添加至少一个a或b,并允许在任意位置添加任意数量的额外a或b。