【问题标题】:Why s--> ^ and A --> a ? in Context Free Grammars为什么 s--> ^ 和 A --> a ?在上下文无关语法中
【发布时间】:2013-04-05 16:42:21
【问题描述】:

我一直在阅读:"Tips for creating Context free grammar" 用于学习目的的帖子,我几乎理解了这个概念,但我不太明白以下内容。

如果我们有:

L = {am bn | m >= n}。

我明白了:

S --> B
B --> aBb
A  --> aA

但我不明白的是添加到这些特定值末尾的概念,例如:

S --> B | ^
B --> aBb | A
A  --> aA | a

为什么要在这些行的末尾添加 ^ (null)、Aa?他们做什么,我们为什么需要他们?

非常感谢所有帮助。

【问题讨论】:

  • 感谢您的反馈,我的回答中也添加了一个小解释..

标签: grammar context-free-grammar


【解决方案1】:

您需要它们能够构造语言为L 的字符串。

B --> aBb | A 表示如果你有一个非终结符B,它可以被aBb 替换 A。 (大写字母代表非终结符,小写字母代表终结符)。

我们来看看语法:

S --> B | ^
B --> aBb | A
A  --> aA | a

为什么我们有| ^您需要它才能生成空字符串。空字符串显然是语言L 的一部分,因为它包含相等数量的as 和bs。

为什么我们有| A为了能够使用A 的规则。现在您可以将B 替换为A,这样您就可以插入aAa。您需要此规则才能生成as 多于bs 的字符串。

为什么我们有| a为了能够用a 替换A 而不添加需要替换的新非终端。

当我查看此语法时,我会说您需要将A --> aA | a 更改为A --> aA | a | ^ 才能生成具有相等数量的as 和bs 的字符串。 (因此您可以将A 替换为空字符串(或null),而不必添加额外的a

假设您要生成字符串aaabb

S       //You start with S
B       //Rule: S --> B
aBb     //Rule: B --> aBb
aaBbb   //Rule: B --> aBb
aaAbb   //Rule: B --> A
aaabb   //Rule: A --> a

【讨论】:

  • 太棒了,谢谢!你能解释一下这个符号的含义吗:d.pr/i/3YG1 - 再次感谢。
  • @Xiy 该符号是“不等于”符号。见this
  • @MAV 还阅读了this 我试图掩饰你的解释。你也可能喜欢你提出一些建议:)
【解决方案2】:

需要额外的^,A和a是为了完成语法集。

因此 A --> aA 负责 [aa, aaa, aaaa, ...]

A --> aA | a 负责 [a, aa, aaa, aaaa, ...]

B --> aBb 照顾 [ab, aabb, aaabbb, ...]

所以,B --> aBb | A 应该照顾 [a, ab, aa, aab, aaa, aaab, aabb, ...]

唯一缺少的是^

所以现在用 S --> B | 完成语法。 ^ [^, a, aa, ab, aaa, aab, aaaa, aaab, aabb, ...]

如您所见,不可能从前半部分生成后半部分,但它也是语法的一个子集。所以,为了完成语法,第二部分也是至关重要的。查看维基百科文章以获得更清晰的示例。

http://en.wikipedia.org/wiki/Context-free_grammar

【讨论】:

    猜你喜欢
    • 2013-10-18
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多