【问题标题】:Find out the language generated, given a context-free grammar?在给定上下文无关语法的情况下找出生成的语言?
【发布时间】:2011-01-25 06:18:06
【问题描述】:

我应该手动应用产生式规则来找出这个语法生成的语言吗?这很乏味,有什么技巧/提示可以加快速度吗?

G = {{S, B}, {a, b}, P, S}
P = {S -> aSa | aBa, B -> bB | b}

编辑:我发现 Matajon 的回答很好,即考虑非终结符号生成的每种语言,然后将它们组合起来。

但是当我必须解决一些像这样的复杂示例时,我仍然陷入困境:

G = {{S, R, T}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, P, S}

P = {S -> A | AS | BR | CT,
     R -> AR | BT | C | CS,
     T -> AT | B | BS | CR,
     A -> 0 | 3 | 6 | 9,
     B -> 1 | 4 | 7,
     C -> 2 | 5 | 8}

疯了,不是吗?取自过去的考试(编程语言课程)。

【问题讨论】:

  • 逗号是该语言字母表的一部分吗?
  • @Matajon 不,这是我的错。我已经编辑了文本以修复不正确的定义。谢谢。

标签: recursion grammar context-free-grammar


【解决方案1】:

我不知道任何通用技巧,但通常考虑每个非终端生成的语言会有所帮助。

在您的示例中,从 B 生成的语言显然是 L(B) = {b}^+。然后你想想S规则,使用第一条规则,你可以生成句子形式{a^n.S.a^n | n >= 1}。如果您对这些句子形式或单独在 S 上使用第二条规则,您可以生成句子形式 {a^n.B.a^n | n >= 1}

休息很简单,你把这两件事结合起来得到L(G) = {a^n.b^+.a^n | n >= 1}

顺便说一句,语法终结符和非终结符的定义是集合,而不是元组。第三个组成部分是生产规则,而不是开始符号。所以你应该写G = {{S, B}, {a, b}, P, S}

编辑

实际上,有一种方法可以解决您的第二个示例,而无需考虑太多,只需遵循食谱之类的内容即可。因为,您的第二种上下文无关语法生成的语言实际上是有规律的。

当您将 A、B 和 C 的规则替换为前三个规则时,您会得到

P' = {S -> 0 | 3 | 6 | 9 | 0S | 3S | 6S | 9S | 1R | 4R | 7R | 2T | 5T | 8T
     R -> 0R | 3R | 6R | 9R | 1T | 4T | 7T | 2 | 5 | 8 | 2S | 5S | 8S
     T -> 0T | 3T | 6T | 9T | 1 | 4 | 7 | 1S | 4S | 7S | 2R | 5R | 8R}

P' 是常规语法。因此,您可以将其转换为非确定性有限自动机(有非常简单的方法,寻找它),然后将生成的 NFA 转换为正则表达式(这不是那么简单,但是如果您遵循算法并且不要迷路,你应该没问题)。而且从正则表达式中很容易看出它描述的是什么语言。

此外,一旦您拥有该语言的 NFA,您就可以查看它并确定它在逻辑上的作用(它与单词中的 1,4,72,5,8 的计数以及它们之间的差异 mod 3 有关。想一想,毕竟这是你的功课:-))

当然,如果你不使用上下文无关语法生成常规语言,你就不能使用这个技巧。没有通用的方法来判断语法生成的语言(CFG 的语言相等问题是不可判定的),您必须考虑每个示例并在其逻辑结构中寻找相似之处和模式。

【讨论】:

  • 好提示。有很大帮助,但是更复杂的例子呢? (见我的编辑)。谢谢。
  • 很好的解释。我刚刚找到了将语法表示为 NFA 的方法,正如您所说,这很简单。但是,我仍在寻找学习第二遍(正则表达式)的良好起点。你能为我指出正确的方向吗?顺便说一句,答案已接受!
【解决方案2】:

我认为您只需要应用生产规则即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    相关资源
    最近更新 更多