编译原理课件 第5章 语法分析自下而上分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
可采用修剪语法树方法实现归约,即寻找当 前语法树的句柄,将句柄中的树叶剪去(归约), 不断修剪直到只剩根结点,完成整个规范归 约过程.
19
例5.6
① S→aABe ③ A→Abc 句子abbcde的规范归约。
文法G[S],
② A→b ④ B→d 求对
规范归约为: abbcde,aAbcde,aAde,aABe,S
5.4 语法分析器的自动产生工具 YACC---了解
2
5.1 自下而上分析的基本问题
自下而上分析法的基本思想:
从输入串出发,反复利用产生式逐步进行 ‚归约‛,如果最后能归约到文法的开始符 号,则输入串是句子,否则输入串有语法错 误。
各种不同自下而上分析法一个共同特点是:
边输入单词符号(移进栈),边归约;
L , S
S ( a L )
S a
21
5.1.3 符号栈的使用与语法树的表示
符号栈的使用
自下而上分析法要使用一个符号栈(语法分析的一 种基本数据结构),分析中根据符号栈顶是否形成句 柄决定是移进还是归约。 符号栈 输入串 分析开始: # ω# 分析中: #α β# 分析结束时: # S # 分析中任何时候:
4
5.1 自下而上分析的基本问题
定义:栈顶形成的某产生式的候选称为归约串。 自底向上分析方法,也称移进-归约分析法,粗 略地说它的实现思想是对输入符号串自左向右进 行扫描,并将输入符逐个移入一个后进先出栈中, 边移入边分析,一旦栈顶符号串形成某个归约串 时,(某产生式的右部),就用该产生式的左部 非终结符代替相应右部的文法符号串,这称为归 约。重复这一过程直到归约到栈顶中只剩文法的 开始符号时则为分析成功,也就确认输入串是文 法的句子。
• 自上而下 从文法的开始符号出发,反复使用文法的产生式, 寻找与输入符号串匹配的推导(最左推导),若能 推导出与输入字串相同的句子,则表示输入字符串是 合法的; • 特点 从文法开始符开始; 推导中始终使用产生式的右部替换左边的非终结符; • 自下而上 根据文法,对输入符号串进行归约,若能正确地归约 为文法的初始符号,则表示输入字串是合法的。 • 归约:在输入串中,寻找一条产生式的右部,如果 找到用产生式的左边的非终结符替换右部。 • 特点 从输入串开始; 归约中始终使用产生式的左部替换右边的候选式;
16
练习 • 文法G(S): S (L)|aS|a
L L , S |S
(1)
(
• (1) 画出句型 (S,(a)) 的语法树。 • (2) 写出上述句型的所有短语、直 接短语和句柄。 (2) 短语: S、a、(a)、S,(a)、(S,(a)) 直接短语: a、S 句柄:S
S
L S L ) )
LL,S|S
解:(1)规范归约: (a,(a)) ,(S,(a)),(L,(a)),(L,(S)),(L,(L)),(L,S),(L),S
S (2)每次归约用的句柄: , (a,(a)), , , , , , ( (L,(S)) (L,(L)) (L,S) (L) S (S,(a)) (L,(a)) L )
则称是句型 相对于非终结符A的短语。 直接短语 如果有 S*A 且 A 则称是
句型 相对于规则 A 的直接短语。
句柄:一个句型的最左直接短语。 注意:短语的两个条件缺一不可, αAδ是句 型,β符号串可由A出发推导出来。
13
• 例5.4 求P85.(5.2)文法的另一个句型 E+T*F+i 的短 语。 • 解:EE+TE+T+TE+T*F+TE+T*F+FE+T*F+i
则成功,达不到这种格局则输入串有错误。
栈中符号串+剩余输入串 = 规范句型。
24
规范归约分析算法
1. 在栈底放入# ,在输入串尾附上#; 2. 逐个移入输入符号,当栈顶形成句柄时,进行 归约; 3. 重复(2) 直到输入串已全部进栈,仅剩#, 4. 若栈中归约为#S, 表示分析成功,输入串为 合法的句子,否则为非法句子.
15
• 例5.4 求P85.(5.2)文法的另一个句型 E+T*F+i 的短 语。 • 解:EE+TE+T+TE+T*F+TE+T*F+F E+T*F+i –短语有4个:E+T*F+i (相对于E); E E+T*F(相对于E); E + T T*F(相对于T); E + T i (相对于T、F) 。 F –T*F 和 i 为直接短语 T * F i –(相对于规则 T T*F 和 F i ) 。 –T*F为句柄。
动作
预备 读入 i1 , i1进栈 归约,Fi 归约,T F 读入* , *进栈 读入 i2 , i2进栈 归约,F i 归约,T T*F 归约,E T 读入+ , +进栈 读入 i3 , i3进栈 归约, F i 归约, T F 归约,E E+T 接受
句型和句柄
i1 * i2 + i3 F * i2 + i3 T * i2 + i3
L , S (
S
a
17
5.1.2
规范归约简述
规范归约是一种较常用的自下而上分析方法。 规范归约:是关于句子α的一个最右推导的逆 过程。 ■也称最左归约。 ������ 规范归约采用句柄来刻画可归约串。������ 每次归约总是句型的句柄归约。
18
5.1.2
规范归约简述
为加深对句柄和归约等概念的理解,用修剪 语法树方法进一步阐明规范归约这一自下而 上分析过程。 一个句型的句柄是该句型对应的语法树中最 左直接短语 。
30
5.2 算符优先分析
算符优先分析的基本思路:
(1) 解决谁先归约: 规定算符(终结符)的优先关 系和结合性质
表示 算符优先文法及优先表的构造 (5.2.1) 便于计算机实现 优先函数及构造 (5.2.3)
(2) 确定可归约串: 采用比较相邻运算符(终结符) 的优先顺序来确定可归约串 --- 最左素短语 (3) 进行归约 如何确定
cde
归约
6
经分析,判定该句子是G合法的句子.
5.1.1
归约
归约串分为:可归约串、非可归约串
在上例中,当栈中为aAb时,存在两个归约串:b及Ab,都可 以归约为A;
若使用b进行归约,栈中得到aAA,导致最终不能归 约为S,因此,判定输入字符串非法; 这是一种错误归约, 原因在于栈中同时存在多个归 约串,而只有一个归约串的选择是正确的,如Ab; 把Ab称为可归约串,而b为非可归约串
如何归约 算符优先分析算法设计 (5.2.2)
31
例5.8
表达式文法G[E] : E→E+E|E-E|E*E|E/E|EE|(E)|i
– 对这个二义文法可能会有好几个规范推导和归 约,真正运算时也有几种不同结果。 –如果规定算符(终结符)的优先级从高到低为: 乘幂运算符,乘、除运算符,加、减运算符;同 级运算符服从左结合原则;有括号时,先括号内 后括号外,那么,句子的归约过程就是唯一的。
或者说从文法的开始符号产生句子。
自下而上分析采用的方法是归约,从叶子到根构造分析树。
或者说从句子开始归约出文法的开始符号。
语法树的一个子树:由该树的某个结连同它的所有子孙组成。 在自下而上分析过程中,每一步归约都可画出一棵子树。
例如,上例中的归约过程可描述为如下分析树:
9
例5.2:文法G[S], 其4条产生式如下: ① S→aABe ② A→b ③ A→Abc ④ B→d 对句子abbcde的分析 最右推导 SaABeaAdeaAbcdeabbcde 最左归约 abbcde,aAbcde ,aAde,aABe ,S S S aABe aAde aAbcde abbcde
归约--剪子树
S A
句型abbcde的句柄是b ,把句 柄剪去(归约)就形成了句型 S aAbcde的语法树。
A
a b b c
B
d e
α0 aABe α1 aAde α2 aAbcdeα3 abbcde α4
20
• 练习:文法G(S): S (L) | aS | a (1)指出句子 (a,(a)) 的规范归约; (2)指出每次归约用的句柄。
– E+E+T*F+i – E+E+T*F – TT*F + – T i – Fi
–短语有4个:E+T*F+i (相对于E); E+T*FБайду номын сангаас相对 于E); T*F(相对于T);i (相对于T、F) 。 –T*F 和 i 为直接短语 –T*F为句柄。
14
5.1.2
规范归约简述
语法树的一个子树的所有叶结点的自左至右 排列形成一个相对于子树根的短语。P86 有多少棵子树就有多少个相对于子树根结 (非终结符)的短语, 短语由某子树的全部叶 结点组成。 若短语是由某子树根经过1步推导得到的, 则称之为该子树根的直接短语。
3
5.1 自下而上分析的基本问题
自下而上分析的基本技术是采用归约栈,如下图所示: #
a1a2......an
归约栈 字符串 把输入符号依次移入栈内,当栈顶符号串形成某产生式 的右部时,就归约为产生式左部非终结符; 继续移入输入字串,直到栈中归约为文法初始符号S. 这种方法也称为‚移进-归约法‛.
5
例5.1 G[S]: S→aAcBe A→b|Ab B→d 分析句子 abbcde 是否为合法的句子
分析栈
#a ab aA aAb aA
动作
移入
移入
源串 分析栈 bbcde aAc bcde bcde
aAcd aAcB aAcBe #S
动作
移入
移入
源串 de e e
归约 移入 归约
归约 移入
cde
1
自下而上语法分析:教学内容
5.1 自下而上分析的基本问题--- 重点
自下而上分析的基本思想、归约、规范归约、短语、 直接短语、句柄等概念,
规范归约———自下而上分析法
5.2 算符优先分析--- 重点难点
算符优先文法、算符优先分析算法、优先表的构造、 最左素短语、优先函数
* 5.3 LR分析法
T * F + i3 T + i3 E + i3
E+F E+T E 开始符号
回顾:
自下而上语法分析方法 --- ‚移进-归约‛法
符号栈顶 没有形成 可归约串, 决定是 形成 移进 归约
定义可归约串要解决:
1. 定义什么样的符号串是可归约串; 2. 在分析时怎样判定符号栈顶出现了可归约串; 3. 如何归约。
步骤
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
符号栈
# #i1 #F #T #T* #T* i2 #T*F #T #E # E+ #E+ i3 #E+F #E+T #E #E
输入串
i1 * i2 + i3# * i2 + i3 # * i2 + i3 # * i2 + i3 # i2 + i3 # + i3 # + i3# + i3 # + i3 # i3 # # # # # #
#S
#
26
5.1.3 符号栈的使用与语法树的表示
语法分析对符号栈的使用有四类操作:P88 1) 移进:将当前输入符号移入栈。
2)归约:用产生式左侧的非终结符替换栈顶的可归 约串。 3) 接受:分析成功,分析结束,接受输入串。
4) 出错:出错处理。
注意: 可归约的串在栈顶,不会在内部
27
例5.7 i1*i2+i3 的规范归约步骤(P88.)
注:对所有的终结符定义某种优先关系,借助 这种关系找出可归约的串,进行归约,达到自下 而上分析的目的。
32
如: i+i-i*(i+i)归约过程如下: 1) i+i-i*(i+i) 设算数级别最高,最先归约; 2) E+i-i*(i+i) 3) E+E-i*(i+i) +,-同级,先归约左边“+” 4) E-i*(i+i) 5) E-E*(i+i) -,×不同级,先归约右边“×” 6) E-E*(i+i) ×,(不同级,先归约右边“(” 7) E-E*(i+i) 8) E-E*(E+E) 先算括号内,再算括号外 9) E-E*(E) 10)E-E*E 先归约“×”,再归约“-” 11)E-E 上述归约过程是唯一的 。 上述归约过程中起决定作用的是相邻 12)E
7
5.1.1
归约
自下而上分析的核心问题:就是寻找句型中的“可 归约串”进行归约。
对“可归约串”概念的不同定义,就形成了 不同的自下而上的分析方法。 在“规范归约”中,则用“句柄”来刻 画“可归约串” 在“算符优先分析法”用“最左素短语” 来刻画”可归约串”
8
5.1.1
归约
语法分析树: 一棵倒立的树,可用于描述语法分析的过程; 自上而下分析采用的方法是推导,从根到叶子构造分析树。
A
A a b b c B d e
5.1.1
归约
归约与推导关系:
推导与归约互逆关系 最右推导称为 规范推导
最右推导得到的句型称为规范句型
最左归约称为 规范归约
12
5.1.2
规范归约简述
令G是一个文法,S是文法的开始符号 短语 假定是文法G的一个句型,如果有:
S*A 且 A +