第五章 语法分析 —— 自下而上分析

47
1 第第第 第第第第——第第第第第第 第第第第第第第第第第第第第第第第第 第第第第“第第” 第第 第第第第第第第第第第第第第第第第第 第第第第“第第” 第第 第第第第第第第第第第第第第 第第第第 第第第第第第第第第第 第 。,, 第第第第第第第第第第第第第 第第第第 第第第第第第第第第第 第 。,, 第第第“第第” 第第第第第 ,。 第第第“第第” 第第第第第 ,。

Upload: laith-dunn

Post on 03-Jan-2016

112 views

Category:

Documents


0 download

DESCRIPTION

第五章 语法分析 —— 自下而上分析. 所谓自下而上分析法就是从输入串开始,逐步进行 “ 归约 ” ,直到归约到该文法的开始符号为止。或者说,从语法树的末端开始,步步向上 “ 归约 ” ,直到根结。. 5.1 自下而上分析基本问题. 5.1.1 规约 自下而上分析法实质上是一种 “ 移进 / 归约 ” 法。即用一个寄存符号的先进后出栈,把输入符号一个一个地移进栈里;当栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第五章 语法分析 —— 自下而上分析

1

第五章 语法分析——自下而上分析

所谓自下而上分析法就是从输入串开始,所谓自下而上分析法就是从输入串开始,逐步进行“归约”,直到归约到该文法的逐步进行“归约”,直到归约到该文法的开始符号为止。或者说,从语法树的末端开始符号为止。或者说,从语法树的末端开始,步步向上“归约”,直到根结。开始,步步向上“归约”,直到根结。

Page 2: 第五章 语法分析 —— 自下而上分析

2

5.1 自下而上分析基本问题 5.1.15.1.1 规约规约 自下而上分析法实质上是一种“移进自下而上分析法实质上是一种“移进 //

归约”法。即用一个寄存符号的先进后归约”法。即用一个寄存符号的先进后出栈,把输入符号一个一个地移进栈里出栈,把输入符号一个一个地移进栈里;当栈顶形成某个产生式的一个候选式;当栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分替换成(归约时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。为)该产生式的左部符号。

Page 3: 第五章 语法分析 —— 自下而上分析

3

例例 : G[S],: G[S], 其产生式如下:其产生式如下: ① ① S→aAcBeS→aAcBe ②A→b ②A→b ③A→Ab ③A→Ab ④B→d ④B→d 对输入串对输入串 abbcde#abbcde# 进行分析。进行分析。解:利用最右推导得: 解:利用最右推导得: S => aAcS => aAcBBe => e => aaAAcde => acde => aAAbcde => abbcdebcde => abbcde 分析过程分析过程 : : abbcde → aAbcde → aAcde abbcde → aAbcde → aAcde → → aAcBe → SaAcBe → S

Page 4: 第五章 语法分析 —— 自下而上分析

4

我们希望把输入串 abbcde 规约到 S 。假定使用下面的规约过程:首先把 a进栈,然后把 b 进栈,因为 A b 是一条规则,于是把栈顶的 b 规约成 A ;再让第二个 b 进栈,这时栈的最顶端的两个符号 Ab ,因 A Ab 是一条规则,于是又把栈顶的 Ab 规约为 A 。此时栈里只有两个符号 aA 了。如此反复整个“移进 - 规约”过程共 10 步,每一步符号栈的变化情形如上图所示。

在上图中共进行了 4 次规约。没实现一步规约都是把栈顶的一串符号用某个产生式的左部符号来代替。后面我们权且把栈顶上的这样一串符号称为“可规约串”,在第 5 )步中,如果用规则 2 )则无法得到最后结果,因此需要精确定义“可规约串”,这是自下而上分析的关键问题。

11 22 33 44 55 66 77 88 99 1010

进进 进进 归归 进进 归归 进进 进进 归归 进进 归归aa bb (2)(2) bb (3)(3) cc dd (4)(4) ee (1)(1)

ee

dd BB BB

bb cc cc cc cc

bb AA AA AA AA AA AA AA

aa aa aa aa aa aa aa aa aa SS

步骤:动作:

Page 5: 第五章 语法分析 —— 自下而上分析

5

(( 11 )最右推导过程见下图 )最右推导过程见下图

(( 22 )最左归约过程见下图 )最左归约过程见下图

S→aAcBeS→aAcBeA→b A→b A→AbA→AbB→dB→d

Page 6: 第五章 语法分析 —— 自下而上分析

6

语法分析树的生成

a b b c d ea b b c d e

A

A

B

S

A → b

A → A b

B → d

S → a A c B e

Page 7: 第五章 语法分析 —— 自下而上分析

7

自下而上分析的中心问题是:怎样判断自下而上分析的中心问题是:怎样判断栈顶的符号串的可规约性,以及如何规栈顶的符号串的可规约性,以及如何规约。这是约。这是 5.25.2 节(算符优先分析)和节(算符优先分析)和 5.35.3节(节( LRLR 分析法)将讨论的问题。各种不分析法)将讨论的问题。各种不同的自下而上分析法的一个共同特点是同的自下而上分析法的一个共同特点是,边输入单词符号(移进符号栈),边,边输入单词符号(移进符号栈),边规约。也就是在从左到右移进输入串的规约。也就是在从左到右移进输入串的过程中,一旦发现栈顶呈现可规约串就过程中,一旦发现栈顶呈现可规约串就立即进行规约。立即进行规约。

Page 8: 第五章 语法分析 —— 自下而上分析

8

令令 GG 是一个文法,是一个文法, SS 是文法的开始符号,假定:是文法的开始符号,假定:

(1).αβδ(1).αβδ 是文法G的一个句型是文法G的一个句型 ;;(2).(2). 如果有 S 如果有 S ==**> α> α AA δ δ 且 A 且 A ==++> β> β ,则称,则称 ββ

是句型是句型 αβδαβδ 相对于非终结符A的相对于非终结符A的短语短语 ;; 特别是特别是,如果有A,如果有A =>β=>β ,则称,则称 ββ 是句型是句型 αβδαβδ 相对于相对于规则A→ 规则A→ ββ 的的直接短语直接短语。一个句型的最左直接。一个句型的最左直接短语称为该句型的短语称为该句型的句柄句柄。。

分析:分析: P85P85 的例的例 5.15.1 和和 5.25.2

5.1.2 规范归约简述句型:假定 G 是一个文法, S 是它的开始符号。如果 S =>α=>α ,则称,则称 αα 为句型为句型*

Page 9: 第五章 语法分析 —— 自下而上分析

9

语法树对应的短语 , 直接短语和句柄 由A由A ==++>β>β 可以看出可以看出 ,β,β 是语法树生长过程中由是语法树生长过程中由

AA 结点开始向下生长出来的全部树叶,缺少一结点开始向下生长出来的全部树叶,缺少一片树叶都不满足A片树叶都不满足A ==++>β.>β. 也即,这些树叶由左也即,这些树叶由左至右排列可以向上归结到某个结点至右排列可以向上归结到某个结点 (( 比如说比如说 A)A),并且由该结点向下生长出来的全部树叶也恰,并且由该结点向下生长出来的全部树叶也恰好是刚归结的这些树叶好是刚归结的这些树叶 ,, 则这个树叶序列就是则这个树叶序列就是该结点的该结点的短语短语。。

如果这种向上归结只需一层如果这种向上归结只需一层 (( 即树叶与该结点即树叶与该结点为父子关系),则为为父子关系),则为直接短语直接短语。。

句柄句柄是语法树中最左那棵子树的树叶的自左至是语法树中最左那棵子树的树叶的自左至右排列,且这棵子树只有父子两代。右排列,且这棵子树只有父子两代。

Page 10: 第五章 语法分析 —— 自下而上分析

10

规范归约 规范归约是规范推导 ( 最右推导 ) 的逆

过程 , 因此规范归约也称最左归约 . 如果文法 G 是无二义性的,则规范推导

的逆过程必定是规范归约 . 我们用句柄来刻画移进 - 归约过程的可

归约串。

Page 11: 第五章 语法分析 —— 自下而上分析

11

移进归约分析器

id id * * id #id #

++EE##

移进归约控制程序

产生式产生式序列序列

栈内容 + 输入缓冲区内容 = # 句型 #

输入缓冲区

Page 12: 第五章 语法分析 —— 自下而上分析

12

分析器的四种动作

1) 移进:将下一输入符号移入栈 2) 归约:用产生式左侧的非终结符替

换栈顶的句柄 3) 接受:分析成功 4) 出错:出错处理各种自底向上分析方法的控制方法不同

Page 13: 第五章 语法分析 —— 自下而上分析

13

例 5-3 : i1*i2+i3 的分析 动作 栈 输入缓冲区动作 栈 输入缓冲区1) # i1*i2+i3 #1) # i1*i2+i3 #2) 2) 移进 移进 #i#i11 *i2+i3 # *i2+i3 #3) 3) 归约 归约 F→i #F F→i #F *i2+i3 # *i2+i3 #4) 4) 归约 归约 T→F #T T→F #T *i2+i3 # *i2+i3 #5) 5) 移进 移进 #T* #T* i2+i3 # i2+i3 #6) 6) 移进 移进 #T*i2 +i3##T*i2 +i3#7) 7) 归约 归约 F→i #T*F F→i #T*F +i3 +i3 ##8) 8) 归约 归约 T→T*F #T T→T*F #T +i3 +i3 ##9) 9) 归约 归约 E→T #E E→T #E +i3 +i3 ##10) 10) 移进 移进 #E+ i3##E+ i3#11) 11) 移进 移进 #E+i3 ##E+i3 #12) 12) 归约 归约 F→i #E+F # F→i #E+F # 13) 13) 归约 归约 T→F #E+T #T→F #E+T #14) 14) 归约 归约 E→E+T #E #E→E+T #E #15) 15) 接受 接受 #E ##E #

E →T|E+T→T|E+TT →F|T*FT →F|T*FF →i|(E)F →i|(E)

Page 14: 第五章 语法分析 —— 自下而上分析

14

产生式序列表示语法分析树 E → idE → id E → idE → id E → idE → id E → E * EE → E * E E → E + EE → E + E

id + id * id

E E E

E

E

Page 15: 第五章 语法分析 —— 自下而上分析

15

5.2算符优先分析 算符优先分析过程是自上而下的归约过程,但算符优先分析法不是算符优先分析过程是自上而下的归约过程,但算符优先分析法不是

一种规范归约。在整个归约过程中,起决定作用的是相继两个终结一种规范归约。在整个归约过程中,起决定作用的是相继两个终结符的优先关系。因此,所谓算符优先分析法就是定义算符之间的某符的优先关系。因此,所谓算符优先分析法就是定义算符之间的某种优先关系。借助这种关系可寻找“可归约串”来进行归约。种优先关系。借助这种关系可寻找“可归约串”来进行归约。

算符优先关系的定义 算符优先关系的定义 (( 终结符之间终结符之间 )) a ≮ b a a ≮ b a 的优先级低于 的优先级低于 bb a ≡ b a a ≡ b a 的优先级等于 的优先级等于 bb a ≯ b a a ≯ b a 的优先级高于 的优先级高于 bb

注意:注意: 1. 1. 算术关系“算术关系“ <”,“≡”<”,“≡” 和“和“ >”>” 与优先关系具有十分不同的与优先关系具有十分不同的性质。例如,性质。例如, aa<<·b·b 并不一定意味着并不一定意味着 b·>ab·>a ,例如:,例如: +<·(+<·( ,(,(<· +<· + 。。 优先关系特点-无交换性、无对称性、无自反性。 优先关系特点-无交换性、无对称性、无自反性。

Page 16: 第五章 语法分析 —— 自下而上分析

16

5.2.1算符优先文法及优先表构造

如果文法 G 中不存在具有相邻非终结符的如果文法 G 中不存在具有相邻非终结符的产生式产生式 (( 如…如… QR…)QR…) ,则称为,则称为算符文法算符文法。。

如果无如果无 εε产生式的算符文法 G中,且任意产生式的算符文法 G中,且任意两个终结符之间至多有一种优先关系,则两个终结符之间至多有一种优先关系,则称为称为算符优先文法算符优先文法。。

算符优先分析仅适用于算符优先文法。算符优先分析仅适用于算符优先文法。

Page 17: 第五章 语法分析 —— 自下而上分析

17

算符优先文法的定义 假定G是一个不含假定G是一个不含 εε产生式的算符文法产生式的算符文法 , , 对任何一对任何一

对终结符对终结符 a,b:a,b: a ≡ b,a ≡ b, 当且仅当当且仅当 GG 中含有形如中含有形如 P→…ab…P→…ab…或或 PP

→…aQb…→…aQb…的产生式的产生式 .. a ≮ b,a ≮ b, 当且仅当当且仅当 GG 中含有形如中含有形如 P→…aR…P→…aR…的产的产

生式生式 ,, 而而 R=>b… R=>b… 或或 R=>Qb… .R=>Qb… . a ≯ b,a ≯ b, 当且仅当当且仅当 GG 中含有形如中含有形如 P→…Rb…P→…Rb…的产的产

生式生式 ,, 而而 R=>…a R=>…a 或或 R=>…aQ .R=>…aQ .

Page 18: 第五章 语法分析 —— 自下而上分析

18

算符优先关系表的构造为了找出所有满足关系≯和≮的终结符对为了找出所有满足关系≯和≮的终结符对 ,,首先需要首先需要

对对 GG 的每个非终结符的每个非终结符 PP构造两个集合构造两个集合 FIRSTVT(P) FIRSTVT(P) 和和 LASTVT(P):LASTVT(P):

FIRSTVT(P)={a| P =FIRSTVT(P)={a| P =++>a… >a… 或或 P =P =++>Qa…,a∈>Qa…,a∈VV T T 而而Q ∈Q ∈VV NN}}

LASTVT(P)={a| P =LASTVT(P)={a| P =++>…a >…a 或或 P =P =++>…aQ, a∈>…aQ, a∈VV T T 而而Q ∈Q ∈VV NN}}

Page 19: 第五章 语法分析 —— 自下而上分析

19

FIRSTVT集和 LASTVT集的构造

由此由此 , , 得得 FIRSTVTFIRSTVT集构造方法集构造方法 ::(1)(1)若有产生式若有产生式 P→a…P→a…或或 P→Qa…,P→Qa…, 则则 a∈ FIRSTVT(a∈ FIRSTVT(

P)P)(2)(2)若若 a∈ FIRSTVT(Q),a∈ FIRSTVT(Q), 且产生式且产生式 P→Q…,P→Q…, 则则 a∈ FIRa∈ FIR

STVT(P)STVT(P)

得得 LASTVTLASTVT集构造方法集构造方法 ::(1)(1)若有产生式若有产生式 P→…aP→…a 或或 P→…aQ,P→…aQ, 则则 a∈ LASTVT(Pa∈ LASTVT(P

))(2)(2)若若 a∈ LASTVT(Q),a∈ LASTVT(Q), 且产生式且产生式 P→…Q,P→…Q, 则则 a∈ LASTa∈ LASTVT(P)VT(P)

Page 20: 第五章 语法分析 —— 自下而上分析

20

算符优先文法 G构造优先关系表的方法(1)(1) 对形如对形如 P→…ab…P→…ab…或或 P→…aQb…P→…aQb…的产生式的产生式 ,, 有有 a ≡ ba ≡ b(2)(2) 对形如对形如 P→…aR…P→…aR…的产生式的产生式 ,, 有有 b ∈ FIRSTVT(R)b ∈ FIRSTVT(R) 则 则 a ≮ ba ≮ b(3)(3) 对形如对形如 P→…Rb…P→…Rb…的产生式的产生式 ,, 有有 a ∈ LASTVT(R)a ∈ LASTVT(R) 则 则 a ≯ ba ≯ b此外此外 ,,若将语句符号若将语句符号 ## 作为终结符对待作为终结符对待 ,, 并设并设 SS

是文法的开始符号是文法的开始符号 ,, 则有则有 #≡#,# ≮ #≡#,# ≮ FIRSTVT(SFIRSTVT(S), LASTVT(S) ), LASTVT(S) ≯ # ≯ #

Page 21: 第五章 语法分析 —— 自下而上分析

21

FIRSTVTFIRSTVT 计算如下:计算如下:若有产生式若有产生式 A→a…A→a… 或或 A→Ba…A→Ba… ,则,则 a→FIRSTVT(A)a→FIRSTVT(A)若若 a FIRSTVT(B)∈a FIRSTVT(B)∈ 且有产生式且有产生式 A→B…A→B… ,则,则 a FIRS∈a FIRS∈TVT(A)TVT(A)LASTVTLASTVT 计算如下:计算如下:若有产生式若有产生式 A→…aA→…a 或或 A→…aBA→…aB ,则,则 a LASTVT(A)∈a LASTVT(A)∈若若 a LASTVT(B)∈a LASTVT(B)∈ 且有产生式且有产生式 A→…BA→…B ,则,则 a LAST∈a LAST∈VT(A) VT(A)

Page 22: 第五章 语法分析 —— 自下而上分析

22

优先关系构造算法:优先关系构造算法:for(for( 每个产生式每个产生式 A→X1X2…Xn) do A→X1X2…Xn) do

for(i=1;i<=n-1;i++)for(i=1;i<=n-1;i++){{if(Xiif(Xi 和和 Xi+1Xi+1 均为终结符均为终结符 ) ) 置置 Xi ≡ Xi+1 Xi ≡ Xi+1 ;;if(i≤n-2if(i≤n-2 且且 XiXi 和和 Xi+2Xi+2 均为终结符均为终结符 ,, 但但 Xi+1Xi+1 为非终结符为非终结符 ) ) 置置 Xi ≡ Xi+1 Xi ≡ Xi+1 ;;if(Xiif(Xi 为终结符为终结符 ,Xi+1,Xi+1 为非终结符为非终结符 ))for(FIRSTVT(Xi+1)for(FIRSTVT(Xi+1) 中的每个中的每个 b)b) 置置 XiXi << ·b;·b;if(Xiif(Xi 为非终结符为非终结符 ,Xi+1,Xi+1 为终结符为终结符 ))for(LASTVT(Xi)for(LASTVT(Xi) 中的每个中的每个 a)a) 置置 a·a· >> Xi+1;Xi+1;endend;;

Page 23: 第五章 语法分析 —— 自下而上分析

23

Page 24: 第五章 语法分析 —— 自下而上分析

24

素短语 素短语素短语是一个短语是一个短语 ,,它至少含有一个终结符它至少含有一个终结符 ,,除它除它本身外不再含有更小的素短语本身外不再含有更小的素短语 ..

最左素短语最左素短语是指处于句型最左边的那个素短语是指处于句型最左边的那个素短语 .. 算符优先文法句型的最左素短语是唯一的。算符优先文法句型的最左素短语是唯一的。

  形式:形式:          ai-1<·ai≡ai+1…≡aj-1≡aj·>aj+1 #ai-1<·ai≡ai+1…≡aj-1≡aj·>aj+1 #          句型中句型中 <·<· 和和 ·>·>之间的符号串是待归约的符号串之间的符号串是待归约的符号串即最左素短语即最左素短语 ..

Page 25: 第五章 语法分析 —— 自下而上分析

25

句柄和最左素短语的区别:句柄和最左素短语的区别: G[E]:E→E+T|T           T→T*F|F        F→(E)|G[E]:E→E+T|T           T→T*F|F        F→(E)|ii          句型句型 T+T*F+i T+T*F+i

直接短语

如果这种向上归结只需一层如果这种向上归结只需一层 (( 即树叶与该结点为父子关系),即树叶与该结点为父子关系),则为则为直接短语直接短语

Page 26: 第五章 语法分析 —— 自下而上分析

26

查找最左素短语的方法1.1. 最左子串法最左子串法 :: 找出句型中最左子串且终结符由左至右的对应关找出句型中最左子串且终结符由左至右的对应关

系满足系满足 aaj-1j-1 ≮aj ≡ aj+1 ≡… ≡ ai ≯ aai+1i+1 检查文法检查文法 GG 的每个产生式的每个候选式,看是的每个产生式的每个候选式,看是否存在这样一个候选式否存在这样一个候选式 ,, 该候选式中的所有终结该候选式中的所有终结符由左至右的排列恰为符由左至右的排列恰为 aajj a aj+1j+1 … a … aii,, 即每一位终即每一位终结符对应相等;如果存在这样的候选式结符对应相等;如果存在这样的候选式 ,, 则该候则该候选式选式 (( 包括候选式中的非终结符包括候选式中的非终结符 )) 即为对应该句即为对应该句型中的最左素短语。 型中的最左素短语。

Page 27: 第五章 语法分析 —— 自下而上分析

27

查找最左素短语的方法

2.2. 语法树法语法树法 :: 设句型为设句型为 w,w, 先画出对应句型先画出对应句型 ww的语法树。其次的语法树。其次

,, 找出该语法树中所有相邻终结符之间的优先关找出该语法树中所有相邻终结符之间的优先关系。系。

Page 28: 第五章 语法分析 —— 自下而上分析

28

例 :

设文法设文法 G G 为为 ::E→E+T|TE→E+T|TT→T+P|PT→T+P|PP→(E)|iP→(E)|i试找出句型试找出句型 P+T+(E+i)P+T+(E+i) 的全部短语和直接短语的全部短语和直接短语

,, 并找出句柄和最左素短语并找出句柄和最左素短语 . .

Page 29: 第五章 语法分析 —— 自下而上分析

29

解 :

设文法设文法 G G 为为 ::E→E+T|TE→E+T|TT→T+P|PT→T+P|PP→(E)|iP→(E)|i

句型句型 P+T+(E+i)P+T+(E+i) 的的语法分析树

E T

ET P

T ( )

E T

P

E

P

i

Page 30: 第五章 语法分析 —— 自下而上分析

30

解 : 如果一个树叶序列由左至右排列最终能够到达某一如果一个树叶序列由左至右排列最终能够到达某一

结点上结点上 ,, 并且包含由该结点推导出的全部树叶并且包含由该结点推导出的全部树叶 ,, 不多不多也不少也不少 ,, 则这一树叶序列即为则这一树叶序列即为短语短语 ..

如果树叶序列与该结点仅差一层如果树叶序列与该结点仅差一层 ,, 即能够一步直接即能够一步直接归结到该结点归结到该结点 ,, 则为则为直接短语直接短语 ..

而位置在最左边的直接短语为而位置在最左边的直接短语为句柄句柄 ..由语法树可以看出由语法树可以看出 ,P,P 可以归结到可以归结到 T,P+TT,P+T 可以归结到可以归结到

E,iE,i 可以归结到可以归结到 P,E+iP,E+i 可以归结到可以归结到 E, (E+i)E, (E+i) 可以归结可以归结到到 P,P+T+(E+i)P,P+T+(E+i) 可以归结到可以归结到 E.E. 其中能够一步归结到其中能够一步归结到某一结点的只有某一结点的只有 PP 和和 i,i, 所以得出所以得出 ::

短语短语 : P, P+T, i,E+i, (E+i): P, P+T, i,E+i, (E+i) 和和 P+T+(E+i);P+T+(E+i);直接短语直接短语 : P, i: P, i句柄句柄 : P: P

Page 31: 第五章 语法分析 —— 自下而上分析

31

解 : 从语法树上寻找最左素短语应遵循这样一个从语法树上寻找最左素短语应遵循这样一个原则原则 ::同层的相邻终结符优先关系为”≡”同层的相邻终结符优先关系为”≡”不同层相邻的终结符不同层相邻的终结符 ,, 层次在下的优先级高层次在下的优先级高 ,, 层层次在上的优先级低次在上的优先级低 ..

从左至右扫描语法分析树的终结符序列可以得到:从左至右扫描语法分析树的终结符序列可以得到:# ≮ + ≯ + ≮ (≮ + ≮ i ≯ ) ≯ ## ≮ + ≯ + ≮ (≮ + ≮ i ≯ ) ≯ #由≮ 由≮ + ≯ + ≯ 和≮ 和≮ i ≯ i ≯ 可知素短语为可知素短语为 P+TP+T 和和 i,i, 最左最左素短语为素短语为 P+T.P+T.

Page 32: 第五章 语法分析 —— 自下而上分析

32

例:文法文法 GG 为:为: E→T|E+T E→T|E+T T→F|T*FT→F|T*F F→(E)|iF→(E)|i求求 T*F+iT*F+i 的最左素短的最左素短

语语 T * F

E + T

i

E

T

解解 : 1.: 1. 画出语法树画出语法树2. 2. 根据语法树根据语法树 ,,确定终结符之间的优先关系:确定终结符之间的优先关系:# # ≮* ≯ + ≮ i ≯ ##3.3. 根据最左素短语的条件得:根据最左素短语的条件得: T*FT*F 为最左素短为最左素短

语语

Page 33: 第五章 语法分析 —— 自下而上分析

33

算符优先分析算法 K:=1; s[k]:=‘#’K:=1; s[k]:=‘#’ RepeatRepeat

把下一个输入符号读进把下一个输入符号读进 aa 中;中; if s[k]if s[k] V∈V∈ TT then j:=k else j:=k-1; then j:=k else j:=k-1;

while s[j] >/a do while s[j] >/a do //// 输入符号的优先级别低,则先将栈内的先规约输入符号的优先级别低,则先将栈内的先规约beginbeginrepeatrepeat

q:=s[j];q:=s[j];

if s[j-1] V∈if s[j-1] V∈ TT then j:=j-1 else j:=j-2 then j:=j-1 else j:=j-2

until s[j] </q;until s[j] </q;

把把 s[j+1]…s[k]s[j+1]…s[k] 规约为某个规约为某个 NN ;;k:=j+1;k:=j+1;s[k]:=Ns[k]:=Nend of while;end of while;

if s[j] if s[j] </a or s[j] ≡a then </a or s[j] ≡a then //// 输入符号的优先级别高,则先进栈输入符号的优先级别高,则先进栈begin k:=k+1;s[k]:=a endbegin k:=k+1;s[k]:=a end

else error /*else error /* 调用出错诊察程序调用出错诊察程序 */*/until a=‘#’until a=‘#’

S 为符号栈, K 代表符号栈 S 的使用深度

Page 34: 第五章 语法分析 —— 自下而上分析

34

算符优先分析过算符优先分析过程见左图:程见左图:

E →T|E+T→T|E+TT →F|T*FT →F|T*FF →i|(E)F →i|(E)

Page 35: 第五章 语法分析 —— 自下而上分析

35

优先函数 在实际实现算符优先分析法时在实际实现算符优先分析法时 ,,使用优先函数使用优先函数 ff和和 gg

..若 若 a ≮ b a ≮ b 则 则 f(a) ≮ g(b)f(a) ≮ g(b)若 若 a ≯ b a ≯ b 则 则 f(a) ≯ g(b)f(a) ≯ g(b)若 若 a ≡ b a ≡ b 则 则 f(a) ≡ g(b)f(a) ≡ g(b)

使用优先函数的好处使用优先函数的好处 ::节省存储空间节省存储空间便于执行比较运算便于执行比较运算

对应一个优先关系表的优先函数对应一个优先关系表的优先函数 ff和和 gg不是唯一的不是唯一的 ,,只要存在一对只要存在一对 ,, 就存在无穷多对就存在无穷多对 ..

也有许多优先关系表不存在对应的优先函数也有许多优先关系表不存在对应的优先函数 ..

Page 36: 第五章 语法分析 —— 自下而上分析

36

于是于是 aa 和和 bb 之间的优先关系可以由比较之间的优先关系可以由比较 ff(a)(a) 与与 g(b)g(b) 的大小来决定。的大小来决定。

关于表关于表 5.15.1 的优先关系所对应的函数可定的优先关系所对应的函数可定义如下表。义如下表。

++ ** (( )) ii ##

ff 22 44 55 00 66 66 00

gg 11 33 66 77 00 77 00

列所对应的

行所对应的

Page 37: 第五章 语法分析 —— 自下而上分析

37

用关系图法构造优先函数1.1. 对所有终结符对所有终结符 a(a(包括”包括” #”),#”), 用有下标的用有下标的 ffaa,g,gaa 为为

结点名画出全部结点名画出全部 nn个终结符所对应的个终结符所对应的 2n2n个结点个结点 ;;2.2.若若 a ≯ b a ≯ b 或或 a≡b, a≡b, 则画一条从则画一条从 ffaa 到到 ggbb 的有向弧的有向弧 ,,若若 a ≮ba ≮b 或或 a≡b, a≡b, 则画一条从则画一条从 ggbb 到到 ffaa 的有向弧的有向弧 ..

3.3. 对每个结点都赋予一个数对每个结点都赋予一个数 ,, 此数等于从该结点出发此数等于从该结点出发所能到达的结点所能到达的结点 ((包括出发结点自身在内包括出发结点自身在内 )) 的个数的个数 ..赋给赋给 ffaa 的数作为的数作为 f(a),f(a),赋给赋给 ggbb 的数作为的数作为 g(b).g(b).

4.4.检查所构造出来的函数检查所构造出来的函数 ff和和 g,g, 看它们同原来的关系看它们同原来的关系表是否矛盾表是否矛盾 .. 如果没有矛盾如果没有矛盾 ,, 则则 ff和和 gg就是所要的优就是所要的优先函数先函数 ,, 如果有矛盾如果有矛盾 ,, 那么就不存在优先函数那么就不存在优先函数 ..

Page 38: 第五章 语法分析 —— 自下而上分析

38

由定义直接构造优先函数对每个终结符对每个终结符 a(a( 包括”包括” #”),#”), 令令 f(a)=g(a)=1,f(a)=g(a)=1, 1.1. 如果如果 a≯b,a≯b, 而而 f(a)<=g(b),f(a)<=g(b), 则令则令 f(a)=g(b)+1;f(a)=g(b)+1; 2.2. 如果如果 a≮b,a≮b, 而而 f(a)>=g(b),f(a)>=g(b), 则令则令 g(b)=f(a)+1;g(b)=f(a)+1; 3.3. 如果如果 a≡b,a≡b, 而而 f(a)<>g(b),f(a)<>g(b), 则令则令 min{f(a),g(b)}=max(f(a),g(b)};min{f(a),g(b)}=max(f(a),g(b)}; 4.4. 重复重复 2-32-3 直到过程收敛直到过程收敛 .. 如果重复过程中有一如果重复过程中有一

个值大于个值大于 2n,2n, 则表明该算符优先文法不存在优则表明该算符优先文法不存在优先函数先函数 ..

Page 39: 第五章 语法分析 —— 自下而上分析

39

两种方法比较 用关系图法构造优先函数仅适用于终结符不用关系图法构造优先函数仅适用于终结符不多的情况多的情况 ,, 由定义直接构造优先函数适用于由定义直接构造优先函数适用于任何情况任何情况 ,, 并且也易于用计算机实现并且也易于用计算机实现 ..

另外另外 ,, 对于一般的表达式文法而言对于一般的表达式文法而言 ,, 优先函数优先函数通常都是存在的通常都是存在的 ..

Page 40: 第五章 语法分析 —— 自下而上分析

40

例 5-12 :表达式文法的算符优先关系

E → E + EE → E + E

| | E - EE - E

| | E * EE * E

| | E / EE / E

| | E ^ EE ^ E

| | ( E )( E )

| | idid

存在优先级 + + ≮ * * * * ≯ + +

id id ≯ + + id id ≯ * *

+ + ≮ id id * * ≮ id id

id id ≯ # # # # ≮ id id

Page 41: 第五章 语法分析 —— 自下而上分析

41

算符优先关系的使用

分析例: id + id * id

在输入符号串中插入优先符,形成一组以 ≮为左端,以≡为中缀,以≯为右端的短语。

# ≮ id ≯ + ≮ id ≯ * ≮ id ≯ # 对短语进行归约后再次插入优先符 # ≮ E + ≮ E * E ≯ # # ≮ E + E ≯ # # E #

Page 42: 第五章 语法分析 —— 自下而上分析

42

算符优先分析的实现 组成结构

移进归约分析器 + 优先关系表 工作框架

输入、输出、初态、终态不变 分析算法 P93

参照输入串、优先关系表,完成一组产生式归约,产生语法分析树。

Page 43: 第五章 语法分析 —— 自下而上分析

43

id+id*id 的分析过程

id + id * id #id + id * id #

算符优先分析控制器

算符优先分析控制器

E → idE → idE → idE → E * EE → E + E

算符优先关系表算符优先关系表

##idid####++##idid++##

++##**++##

idid**++##

**++##

++####

Page 44: 第五章 语法分析 —— 自下而上分析

44

算符优先分析小结 优点

简单、效率高能够处理部分二义性文法

缺点 文法书写限制大占用内存空间大 不规范、存在查不到的语法错误

Page 45: 第五章 语法分析 —— 自下而上分析

45

算法算法 : : 从优先关系构造优先函数从优先关系构造优先函数方法:方法:

1.a VT {#},∈ ∪1.a VT {#},∈ ∪ 建立两个符号建立两个符号 fafa 和和 ga;ga;  2.  2. 若若 a ≡ b, a ≡ b, 则把则把 fafa 和和 gbgb 分在一组;分在一组; 3.a3.a ,, b VT∈b VT∈ ,, 若若 a·a· >> bb ,则从,则从 fafa 至至 gbgb 画一条弧;画一条弧; 若若 aa << ·b·b ,则从,则从 gbgb 至至 fafa 画一条弧画一条弧 ;;  4.  4. 若图中无环,则存在优先函数,若图中无环,则存在优先函数, f(a)f(a) 和和 g(b)g(b) 等于从等于从 fa fa 和和 gbgb 出发的出发的 最长路最长路径。径。

Page 46: 第五章 语法分析 —— 自下而上分析

46

f

Page 47: 第五章 语法分析 —— 自下而上分析

47

解 : 用关系图构造优先函数

fifi

g+g+

f+f+ f)

f)

g*g*

gigi

ii ++ )) (( **

ff 33 55 11 55 55

gg 22 44 66 66 11

33

ii ++ )) (( **

ii ≯≯ ≮≮ ≮≮ ≮≮ ≯≯

++ ≯≯ ≯≯ ≮≮ ≮≮ ≯≯

)) ≮≮ ≮≮ ≮≮ ≮≮ ≡≡

(( ≯≯ ≯≯ ≯≯

** ≯≯ ≯≯ ≯≯

f(f( f*

f*

g)g) g(

g(

55 11 55 55

22 44 66 66 11