上下文无关文法就是说这个文法中所有的产生式左边只有一个非终结符,比如:
S
→
a
S
b
S
→
a
b
S → aSb\\ S → ab
S→aSbS→ab
这个文法有两个产生式,每个产生式左边只有一个非终结符
S
S
S,这就是上下文无关文法,因为你只要找到符合产生式右边的串,就可以把它归约为对应的非终结符。
比如:
a
S
b
→
a
a
S
b
b
S
→
a
b
aSb →aaSbb\\ S →ab
aSb→aaSbbS→ab
这就是上下文有关文法,因为它的第一个产生式左边有不止一个符号,所以你在匹配这个产生式中的
S
S
S的时候必需确保这个
S
S
S有正确的“上下文”,也就是左边的
a
a
a和右边的
b
b
b,所以叫上下文相关文法。
上下文无关文法重要的原因在于它们拥有足够强的表达力来表示大多数程序设计语言的语法;实际上,几乎所有程序设计语言都是通过上下文无关文法来定义的。另一方面,上下文无关文法又足够简单,使得我们可以构造有效的分析算法来检验一个给定字串是否是由某个上下文无关文法产生的。例子可以参见 L R LR LR 分析器和 L L LL LL分析器。
最左推导:每一步替换最左边的非终结符
最右推导:每一步替换最右边的非终结符
最右推导称为规范推导。最右推导对应于最左规约(规范规约)
文法:
S
→
A
B
A
→
a
∣
t
B
→
+
C
D
C
→
a
D
→
a
S→AB\\ A→a|t\\ B→+CD\\ C→a\\ D→a
S→ABA→a∣tB→+CDC→aD→a
最右推导:
S
→
A
B
→
A
+
C
D
→
A
+
C
a
→
A
+
a
a
→
a
+
a
a
S→AB→A+CD→A+Ca→A+aa→a+aa
S→AB→A+CD→A+Ca→A+aa→a+aa
最左推导:
S
→
A
B
→
a
B
→
a
+
C
D
→
a
+
a
D
→
a
+
a
a
S→AB→aB→a+CD→a+aD→a+aa
S→AB→aB→a+CD→a+aD→a+aa