什么是上下文无关文法最左推导和最右推导—编译原理
Posted 之墨_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是上下文无关文法最左推导和最右推导—编译原理相关的知识,希望对你有一定的参考价值。
系列文章戳这里👇
- 什么是上下文无关文法、最左推导和最右推导
- 如何判断二义文法及消除文法二义性
- 何时需要消除左递归
- 什么是句柄、什么是自上而下、自下而上分析
- 什么是LL(1)、LR(0)、LR(1)文法、LR分析表
- LR(0)、SLR(1)、LR(1)、LALR(1)文法之间的关系
- 编译原理第三章习题
- 词法分析、构建DFA、上下文无关文法、LL(1)分析、提取正规式
- 证明LL(1)、SLR(1)、LALR(1)文法
编译原理-上下文无关文法、最左推导和最右推导
什么是上下文有关文法?
一、上下文无关文法
上下文无关文法就是说这个文法中所有的产生式左边只有一个非终结符,比如:
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
以上是关于什么是上下文无关文法最左推导和最右推导—编译原理的主要内容,如果未能解决你的问题,请参考以下文章