形式语言:语法,构造一种产生特定模式的语法

时间:2017-12-05 13:53:41

标签: computer-science grammar formal-languages

我必须构建一个L(G),它创建以下模式:

“单词始终带有'b',如果单词中有a,则后面紧跟'b'”

所以我们不能有两个'a'因此

For ex the pattern can be:  'b', 'bb', 'bab', 'bbbbbbab', 'bababab'

我构建了有限状态机,但我无法找到产生这种语法的一般L(G),这是我到目前为止所得到的:

L(G) = { b^n  a^m b^k | n>1, a => 0, b > 1 }

有没有人知道如何处理这个问题,如果有,请告诉我该怎么办?

2 个答案:

答案 0 :(得分:0)

语言是这样的:

  

a和b的所有字符串,以至少一个b开头,并且在任何a之后至少有一个b。

每当您尝试理解某种语言时,我建议您考虑语言中最短的字符串以及构建字符串的时间。上述语言中最短的字符串是b。如果我们在语言中有一个字符串,我们怎样才能获得更长的字符串?好吧,我们总是可以添加更多的b来获取语言中的字符串。如果我们添加a,我们必须添加至少一个b。这表明形式的正则表达式:

  bb* means one b, then any number of additional b's
  ^       this Kleene star lets us add any number of a's, or none at all
  |       ^
  |       |
bb* (abb*)*
|-| |-----|
 |     |
 |     V
 V     after any a, we must have at least one b
 the string must start with at least one b

要获得语法,我们可以使用我们对最短字符串的观察和导出较长字符串的步骤来编写递归定义:

  • b在L(最短的字符串是基本情况
  • 如果x在L中,xb在L中(我们总是可以添加b
  • 如果x在L中,则xab在L中(如果我们使用b ,我们可以添加a)
  • L(用于递归定义的样板
  • 中没有其他内容

要从递归定义转换为语法,请添加生产以从起始符号派生基本案例:

S -> b
根据定义,

S使用我们的语言派生一个字符串。特别是,根据上面的其他两个生产规则,我们知道我们可以在任何S派生的末尾添加一个b或两个a和b两个,所以我们添加了产品

S -> Sb
S -> Sab

总而言之,我们得到:

S -> b
S -> Sb
S -> Sab

获得语法的另一种可能更好的方法是找到一个能为您提供语言的自动机,然后使用构造来获得语法。我们可能会认识到这种语言是正常的,并为其写下DFA:

      _               _
     / \             / \
  b |  |        a,b |  |
     \ V             \ V
----->q0----->q1----->q2
       ^  a   |   a
       |      |
       \______/
          b

此处,q0是初始且唯一接受的状态,q1是您看到a但未看到所需b和{{1}的状态在连续看到两个q2之后达到死亡状态。要记下语法,请按如下方式记下过渡:

a

最后,为表示接受状态的每个非终结符添加空/ epsilon / lambda产生:

(q0) -> b(q0)
(q0) -> a(q1)
(q1) -> b(q0)
(q1) -> a(q2)
(q2) -> b(q2)
(q2) -> a(q2)

把它放在一起你有一个语法:

(q0) -> e

您可以从此状态和空状态中删除空/ epsilon / lambda转换以将其置于Chomsky普通形式(或者其他任何接近它,我忘记了订单终端和非终端需要进入):

(q0) -> b(q0)
(q0) -> a(q1)
(q1) -> b(q0)
(q1) -> a(q2)
(q2) -> b(q2)
(q2) -> a(q2)
(q0) -> e

这与我们之前的语法相同,除了它增加了一个额外的非终结符,其唯一的责任是在a之后放置所需的b,而另一个语法在一次生成中进行。

答案 1 :(得分:0)

我认为你可以写下这样的定义:

L = {b n (a x b y m | n> 0,m> = 0,{0,1}中的x,y> = x}