为语言创建无上下文语法

时间:2010-11-08 23:32:10

标签: context-free-grammar finite-automata

我正在参加有限自动机课程。我正在为期中考试做准备而且在为特定语言创建语法时遇到了麻烦。虽然我发现简单的非常直观,但当它们变得更加复杂时,我似乎不知道从哪里开始。例如:

L = {w E {a,b,c} *:nb(w)!= na(w)+ nc(w)}

答案是:

S→S1 | S2
S1→bS3 | S3b | S3bS3
S3→S0 | S1
S2→XS4 | S4X | S4XS4
S4→S | S2
S0→bS0XS0 | XS0bS0 | Ë
X→a | ç

如果有人能就我所涉及的思维过程给我一点指导,我们将不胜感激。

1 个答案:

答案 0 :(得分:2)

您列出的语言不清楚。我假设w E {a,b,c}*表示w ε {a,b,c}*nb(w) != na(w) + nc(w)表示该语言中的所有字符串都有一个b不等于a的数量和c的数量之和。 / p>

如果是这种情况,您必须考虑语言中所有字符串的特征,以及将字符串排除在此语言之外的所有特征。

这种语言接受字符串,其中b的数量= / = a的数量+ c的数量。我们可以将这种语言重新表述为接受字符串的语言:

号码a的+号码c> b的数量 要么 号码a的号码c< b的号码

这解释了第一个S - > S1 | S2

S1确保至少有1 b(S3),然后强制b与[{1}}和a相同的c s(S0)或更多bac更高(S1)。 S1规则的最终结果是一个字符串,bac更多a

S2确保c和/或ba更多。{}}它通过强制ca(X),然后允许等量c个/ a(S0)或更多{{1}来实现此目的}} / cb更快(再次是S2)。

这是针对您的示例的,但您可以看到创建此语法的思维过程如何:

  1. 将语言表述为具体案例(a's / c>或< b s)
  2. 对于每种情况,首先要确保案件持有(强制#b的>而不是a的/ c强制至少一个b)然后展开字符串以包含所有可能的a个/ cb'或更少a个/ { cb更长。
  3. 对称处理另一种情况。
  4. 问题是您需要确保生成语言中的每个字符串,并且不生成语言中没有的所有字符串。 (重读这个,直到它的含义陷入其中)