2. 上下文无关文法(二)¶
2.1. 二义性¶
2.1.1. 有歧义文法(1)¶
2.1.2. 有歧义文法(2)¶
这道题同样是判断给定的串的解析是否有歧义。
2.1.3. 有歧义文法(3)¶
这道题还是关于判断给定的串的解析是否有二义性。
2.1.4. 有歧义文法(4)¶
这道题将帮助你发现文法中的二义性, 也帮助你确信一个文法在什么时候是不存在二义性的。
2.2. 优先级练习¶
2.3. 无歧义文法的分析树示例¶
2.3.1. 结合性¶
2.3.2. 优先级与结合性¶
这道题说明了文法结构如何影响结合性以及算术运算符的优先级顺序。
2.4. 为什么是上下文无关?¶
我们一直在反复使用“上下文无关”这个术语来描述某些语言及其相关的文法。 我们有一个定义:上下文无关语言是拥有上下文无关文法的语言, 而上下文无关文法是指所有产生式规则的左侧都只有一个变元的文法。 最后,我们知道上下文无关语言类是正则语言类的超集。
但为什么叫“上下文无关”这个名字呢? 它源于这样一个想法:在一个串的部分推导的句式中, 我们可以自由地把任何一个变元替换为它的某条产生式规则的右部, 而无需担心该句式中还出现了什么别的内容。 例如,考虑一个包含以下规则(rules)的文法:
S \(\rightarrow\) ABC \(|\) GBHB \(\rightarrow\) E \(+\) E
要点在于,无论我们先对 S 使用哪条产生式规则, 下一步我们都可以自由地展开 B,无论它周围是变元 A 和 C, 还是变元 G 和 H。
相比之下,还存在上下文相关文法。 这类文法的产生式左侧可以有多个变元。 例如,考虑这个部分文法:
S \(\rightarrow\) ABC \(|\) GBH | AB \(\rightarrow\) AE \(+\) E | GB \(\rightarrow\) AE \(-\) E
在这种情况下,我们必须看到 A 和 B 一起出现在句式中, 才能触发产生 E \(+\) E 的产生式规则; 或者 G 和 B 一起出现,才能触发产生 E \(-\) E 的产生式规则。
我们稍后会看到,上下文相关文法比 CFG 更强大。 这当然意味着存在一些语言不是上下文无关的,但却是上下文相关的。

