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

Post on 30-Dec-2015

63 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

第五章 语法分析 —— 自下而上分析. 所谓自下而上分析法就是从输入串开始,逐步进行“归约”,直至归约到文法的开始符号;或者说从语法树的末端开始,步步向上“归约”,直到根结。 5.1 自下而上分析基本问题 我们先讨论自下而上分析的一些基本思想和 基本概念: 5.1.1 归约 自下而上分析的关键问题是寻找 可归约串 。对“可归约串”概念的不同定义,就形成了不同的自下而上的分析方法。在算符优先分析法中我们用“最左素短语”来刻画“可归约串”,在“规范归约”中,则用“句柄”来刻画“可归约串” 5.1.2 规范归约简述 - PowerPoint PPT Presentation

TRANSCRIPT

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

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

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

5.1 5.1 自下而上分析基本问题自下而上分析基本问题 我们先讨论自下而上分析的一些基本思想和 基本概念:我们先讨论自下而上分析的一些基本思想和 基本概念: 5.1.15.1.1 归约归约自下而上分析的关键问题是寻找自下而上分析的关键问题是寻找可归约串可归约串。对“可归约串”。对“可归约串”

概念的不同定义,就形成了不同的自下而上的分析方法。在算符优概念的不同定义,就形成了不同的自下而上的分析方法。在算符优先分析法中我们用“最左素短语”来刻画“可归约串”,在“规范先分析法中我们用“最左素短语”来刻画“可归约串”,在“规范归约”中,则用“句柄”来刻画“可归约串”归约”中,则用“句柄”来刻画“可归约串”

5.1.2 5.1.2 规范归约简述规范归约简述 在这一部分应掌握在这一部分应掌握短语短语和和直接短语直接短语和和句柄句柄三个重要概念三个重要概念

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

令令 GG 是一个文法,是一个文法, SS 是文法的开始符,假定是文法的开始符,假定是文法是文法 GG的一个句型,如果有:的一个句型,如果有:

SS**AA 且 且 A A ++ 则称则称是句型是句型相对于非终结相对于非终结符符 AA 的的短语短语。特别是,如果有。特别是,如果有

A A 则称则称是句型是句型相对于规则相对于规则 AA 的的直接直接短语短语,一个句型的最左直接短语成为该句型的,一个句型的最左直接短语成为该句型的句柄句柄。注意:。注意:短语的短语的两两个条件是:个条件是:

SS**AA 且 且 A A ++

[[ 例例 5.1]5.1] 考虑文法:考虑文法: E E T|E+T T|E+T

T T F|T*FF|T*F

F F i | (E) i | (E) (( 5.25.2 ) 对于句型) 对于句型 i*i+i i*i+i 推导推导解: 解: E→E+T→T+T→T*F+T→F*F+T→i*F+T→i*i+FE→E+T→T+T→T*F+T→F*F+T→i*F+T→i*i+F

→ → i*i+ii*i+i

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

尽管有尽管有 E E ++i+i i+i 但是但是 , i+i , i+i 并不是该句型的一并不是该句型的一个短语,因为不存在从个短语,因为不存在从 E(E( 文法开始符)到文法开始符)到 i*Ei*E 的的推导。但是,推导。但是, i, i*i,i, i*i, 和和 i*i+ i i*i+ i 自身都是句型自身都是句型 i*i+i i*i+i

的短语。而且为为直接短语。的短语。而且为为直接短语。

[[ 例例 55 。。 2] 2] 上题文法(上题文法( 55 。。 22 )的另一个句型)的另一个句型E+T*F+i E+T*F+i 的短语有 的短语有 E+T*F+i ,E+T*F, T*F,E+T*F+i ,E+T*F, T*F, 和和 i. i.

其中其中 T*FT*F 和和 ii 为直接短语, 为直接短语, T*FT*F 为句柄。为句柄。

解:解: E→E+T→E+T+T→E+T*F+T→E+T*F+FE→E+T→E+T+T→E+T*F+T→E+T*F+F

→→

E+T*F+iE+T*F+i

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

关于关于规范归约规范归约精确的说,假定精确的说,假定是文法是文法 GG 的一个句子,的一个句子,我们称序列我们称序列

nn n-1n-1 n-2n-2, , 。。。。。。 , , 00

是是的一个规范规约,如果此序列满足:的一个规范规约,如果此序列满足:(( 11 ) ) nn = = ;; (2(2 ) ) 00 为文法的开始符为文法的开始符 ,, 即 即 00 =S; =S;(( 33 )对于任何的)对于任何的 ii , , 0<i <=n, 0<i <=n, i-1i-1 是从是从 ii 经把句柄替换经把句柄替换

为相应产生式的左部符号而得到的。 为相应产生式的左部符号而得到的。 容易看到,规范归约是关于容易看到,规范归约是关于 αα 的一个最右推导的逆过程。的一个最右推导的逆过程。

因此规范归约也成最左归约。因此规范归约也成最左归约。 在形式语言中,最右推导常被称为规范推导。由规范推在形式语言中,最右推导常被称为规范推导。由规范推

导所得的句型称为规范举行。如果文法导所得的句型称为规范举行。如果文法 GG 是无二义的,是无二义的,那么规范推导的逆过程必是规范归约。那么规范推导的逆过程必是规范归约。

5.1.3 5.1.3 符号栈的使用与语法树的表示符号栈的使用与语法树的表示 本节重点掌握符号栈的使用请阅读本节重点掌握符号栈的使用请阅读 P87P87 相应段落。相应段落。 现在举个例子以加深对这一节的理解。现在举个例子以加深对这一节的理解。

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

[[ 例例 5.3]5.3] :对于文法(:对于文法( 5.25.2 )输入串)输入串 i1*i2+i3 i1*i2+i3 的分析(规范归约)步的分析(规范归约)步骤可表示如下:骤可表示如下:

步骤 符号栈 输入串 动作步骤 符号栈 输入串 动作0 # i1*i2+i3# 0 # i1*i2+i3# 预备预备11 #i1 *i2+i3# #i1 *i2+i3# 读入读入 i1i122 #F *i2+i3# #F *i2+i3# 归约,归约, FFi i 33 #T *i2+i3 # #T *i2+i3 # 归约,归约, T T FF44 #T* i2+i3# #T* i2+i3# 读入读入55 #T*i2 +i3# #T*i2 +i3# 读入读入66 #T*F +i3# #T*F +i3# 归约,归约, F F ii77 #T +i3# #T +i3# 归约,归约, T T T*FT*F88 #E +i3# #E +i3# 归约,归约, E E TT99 # E+ i3# # E+ i3# 读入读入1010 #E+i3 # #E+i3 # 读入读入1111 #E+F # #E+F # 归约归约 , F , F ii1212 #E+T # #E+T # 归约归约 , T , T FF1313 #E # #E # 归约,归约, E E E+TE+T1414 #E # #E # 接受接受

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

5.2 5.2 算符优先分析算符优先分析 5.2.1 5.2.1 算符优先文法及优先表的构造算符优先文法及优先表的构造 一个文法,如果它的任何产生式的右部都不含量个相继一个文法,如果它的任何产生式的右部都不含量个相继

(并列)的非终结符,即不含如下形式的产生式右部:(并列)的非终结符,即不含如下形式的产生式右部: … …QR… QR… 则我们称该文法为则我们称该文法为算符文法算符文法。。 在后面的定义中,在后面的定义中, aa 、、 bb 代表任意终结符;代表任意终结符; PP 、、 QQ 、、 RR 代代

表任意非终结符;‘…’代表有终结符和非终结符组成的任意表任意非终结符;‘…’代表有终结符和非终结符组成的任意序列,包括空字。序列,包括空字。

假定假定 GG 是一个不含是一个不含 ---- 产生式的算符文法。对于任何一对终产生式的算符文法。对于任何一对终结符结符 aa 、、 bb ,我们说:,我们说:

(( 1) a1) ab b 当且仅当文法当且仅当文法 GG 中含有形如中含有形如 P P …ab……ab… 或或 P P …aQ…aQb…b… 的产生式的产生式 ;;

(2) a<(2) a<bb 当且仅当当且仅当 GG 中含有形如中含有形如 P P …aR……aR… 的产生式,的产生式, RR 而而 RR++b…b… 或或 R R ++Qb…;Qb…;

(3) a(3) a>b>b 当且仅当当且仅当 GG 中含有形如中含有形如 P P …Rb……Rb… 的产生式, 的产生式, RR 而而RR++…a…a 或或 R R ++…aQ;…aQ;

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

如果一个文法如果一个文法 GG 中的任何终结符对(中的任何终结符对( a, b a, b )至多只满足下述三关系)至多只满足下述三关系之一:之一:

a=a=·b, a<·b, a·>b ·b, a<·b, a·>b 则称则称 GG 是一个是一个算符优先文法算符优先文法。 。 应掌握应掌握算符优先表算符优先表的构造方法。的构造方法。 通过检查通过检查 GG 的每个产生式的每个候选式,可以找出满足的每个产生式的每个候选式,可以找出满足 aa=·b=·b 的的

终结符对。为了找出所有满足关系终结符对。为了找出所有满足关系 <<·· 和和 ·>·> 的终结符对,我们需要的终结符对,我们需要对对 GG 的每个非终结符的每个非终结符 P P 构造两个集合构造两个集合 FIRSTVT(P)FIRSTVT(P) 和和 LASTVT(P):LASTVT(P):

FIRSTVT(P)={a | PFIRSTVT(P)={a | P++a…a… 或或 P P ++Qa…,aQa…,aVVTT 而 而 Q Q VVN N }}

LASTVT(P)={a | PLASTVT(P)={a | P++…a…a 或或 P P ++…aQ,a…aQ,aVVTT 而 而 Q Q VVN N }}

有了这两个集合后,就可以通过检查每个产生式的候选式确定满有了这两个集合后,就可以通过检查每个产生式的候选式确定满足关系足关系 <<·· 和和 ·>·> 的所有终结符对。例如:假定有个产生式的一个候的所有终结符对。例如:假定有个产生式的一个候选式为选式为

… …aP… aP…

那末,对任何那末,对任何 bbFISTVT(P),FISTVT(P), 我们有我们有 a<a<·b·b 。。 类似地,假定有产生类似地,假定有产生式的一个候选式为式的一个候选式为

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

… …Pb…Pb…

那末,对任何那末,对任何 aaLASTVT(P),LASTVT(P), 我们有我们有 aa·>b.·>b.

我们首先讨论构造集合我们首先讨论构造集合 FIRSTVT(P)FIRSTVT(P) 的算法。按定义,的算法。按定义,我们可用下面两条规则来构造集合我们可用下面两条规则来构造集合 FIRSTVT(P):FIRSTVT(P):

(1)(1) 若有产生式若有产生式 PPa…a… 或或 P P Qa…,Qa…, 则则 aaFIRSTVT(P)FIRSTVT(P)

(2)(2) 若若 aaFIRSTVT(Q)FIRSTVT(Q) ,且有产生式,且有产生式 P P Q…Q…

则则 aaFIRSTVT(P)FIRSTVT(P)

同样我们可以构造同样我们可以构造 LASTVT(P)LASTVT(P) 的算法。的算法。 在我们有了每个非终结符在我们有了每个非终结符 P P 的的 FISTVT(P)FISTVT(P) 和和 LASTVTLASTVT

(P)(P) 之后我们就能够造文法之后我们就能够造文法 GG 的优先表。其算法如下: 的优先表。其算法如下: FOR FOR 每一条产生式每一条产生式 PPX1X2…XnX1X2…Xn

FOR i:=1 TO n-1 DOFOR i:=1 TO n-1 DO

BEGINBEGIN

IF Xi IF Xi 和 和 Xi+1 Xi+1 均为终结符均为终结符 THEN THEN 置 置 Xi=Xi=·Xi+1·Xi+1

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

IF I<=n-2IF I<=n-2 且且 XiXi 和和 Xi+2Xi+2 都为终结符,而都为终结符,而 Xi+1Xi+1 为非为非终结符,则置终结符,则置 Xi=Xi=·Xi+2·Xi+2

IF XiIF Xi 为终结符而为终结符而 Xi+1Xi+1 为非终结符 为非终结符 THENTHEN

FOR FISTVT(Xi+1)FOR FISTVT(Xi+1) 中的每个中的每个 a DOa DO

置 置 Xi<Xi<· a· a

IF XiIF Xi 为非终结符而为非终结符而 Xi+1Xi+1 为终结符为终结符 THENTHEN

FOR LASTVT(Xi)FOR LASTVT(Xi) 中的每个中的每个 a DOa DO

置 置 Xi Xi ·>a·>a

ENDEND

至此我们完成了从文法至此我们完成了从文法 GG 构造优先表的算法。构造优先表的算法。

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

5.2.2 5.2.2 算符优先分析算法算符优先分析算法 为了刻画什么是“可归约串”我们将定义算符优先文法的句型的“最为了刻画什么是“可归约串”我们将定义算符优先文法的句型的“最

左素短语”这个概念。左素短语”这个概念。 所谓素短语是指这样的一个短语,它至少含有一个终结符,并且出它所谓素短语是指这样的一个短语,它至少含有一个终结符,并且出它

自身外,不再含有更小的素短语。自身外,不再含有更小的素短语。 所谓最左素短语,是指处于句型最左边的那个素短语。所谓最左素短语,是指处于句型最左边的那个素短语。 我们把算符优先文法句型(括在两个我们把算符优先文法句型(括在两个 ## 号之间)的一般形式写成:号之间)的一般形式写成: #N#N11aa11NN22aa22…N…Nnnaan n NnNn+1+1# # (( 5.45.4 )) 其中每个其中每个 aiai 都是终结符,都是终结符, NiNi 是可有可无的非终结符。是可有可无的非终结符。 一个算符优先文法一个算符优先文法 GG 的任何句型(的任何句型( 5.45.4 )的最左素短语是满足如下条)的最左素短语是满足如下条

件的最左子串:件的最左子串: NNjjaajj…N…Niia a i+1i+1,,

a a j-1j-1<<·a·ajj

aajj=a=aj+1j+1, … , a , … , a i-1i-1==·a ·a ii

aaii·>a ·>a i+1 i+1 根据这个最左素短语的定义我们可以构造算符优先分析根据这个最左素短语的定义我们可以构造算符优先分析算法。参考算法。参考 P93P93

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

5.2.3 5.2.3 优先函数优先函数 在实际实现算符优先分析算法时,一般不用优先表而是用在实际实现算符优先分析算法时,一般不用优先表而是用

两个优先函数两个优先函数 f f 和和 gg。我们把每个终结符号。我们把每个终结符号与两个自然与两个自然数数 f(f())和和 g(g() ) 相对应,使得相对应,使得

若若 1<· 1<· 2 2 则 则 f(f(1)<g(1)<g(2)2) 若若 1=· 1=· 2 2 则 则 f(f(1)=g(1)=g(2)2) 若若 1·1·〉 〉 2 2 则 则 f(f(1)>g(1)>g(2)2) 函数函数 f f 称为入栈优先函数,称为入栈优先函数, gg称为比较优先函数。称为比较优先函数。 构造优先函数的方法应在必须掌握之列。构造优先函数的方法应在必须掌握之列。 如果优先函数存在,那么,从优先表构造优先函数的一个如果优先函数存在,那么,从优先表构造优先函数的一个

简单方法是:简单方法是:(( 11 )对于每个终结符)对于每个终结符 a(a( 包括包括 ##)令其对应两个符号)令其对应两个符号 fafa和和gga a , , 画一张以所有符号画一张以所有符号 fafa和和 gaga为结点的方向图,如果为结点的方向图,如果a·>=·b,a·>=·b, 那么,就从那么,就从 fafa画一箭弧至画一箭弧至 ggb;b; 如果如果 a<·=·b a<·=·b 则画一条从则画一条从 gbgb到到 fafa的箭弧。的箭弧。

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

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

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

例题例题 55 。。 5 5 就是构造优先函数的例子,望同就是构造优先函数的例子,望同学们好好研究一下。学们好好研究一下。

55 。。 22 。。 4 4 算符优先分析中的出错处理算符优先分析中的出错处理

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

例题与习题解答例题与习题解答[[ 例例 5.1] 5.1] 设有文法设有文法 GG 和输入串和输入串 $$

G: SG: SaABe $: abbcdeaABe $: abbcde

A A Abc|bAbc|b

B B dd

通过语法树能使我们直观的理解规范“归约”、“句通过语法树能使我们直观的理解规范“归约”、“句柄”等概念。柄”等概念。

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

上图中图上图中图 aa 是输入串是输入串 abbcdeabbcde 的语法树,一个句型的句柄是该的语法树,一个句型的句柄是该句型语法树中最左子树的末端结的自左至右排列。则此子树为句型语法树中最左子树的末端结的自左至右排列。则此子树为 A A bb 其末端其末端 bb 为句型为句型 abbcdeabbcde 的句柄。将其剪掉(归约)后如图的句柄。将其剪掉(归约)后如图 bb ,,其最左子树其最左子树 A A AbcAbc 其末端结其末端结 AbcAbc 为句型为句型 aAbcBeaAbcBe 的最左子树末的最左子树末端结故为句柄。图端结故为句柄。图 cc 表明句型表明句型 aAdeaAde 的句柄为的句柄为 dd 。将其归约句型。将其归约句型 aaABeABe 的最左子树为其自身。即为其自身句柄。的最左子树为其自身。即为其自身句柄。

[[ 例例 5.2]5.2] 考虑下面文法:考虑下面文法: 11 。 。 EEE+T|TE+T|T 2. T 2. T T*F|FT*F|F 3. F 3. F PPF|PF|P 4. P 4. P (E)|i (E)|i 构造优先关系表构造优先关系表 解: 根据产生式解: 根据产生式 4 4 我们有‘我们有‘ (’=(’=·‘)’, ·‘)’, 从产生式从产生式 11 ,, 2 2 的的 +T+T 和和 T*T*

我们有我们有 +<+<·*,·*, 从产生式从产生式 22 ,, 33 的的 *F*F 和和 PP 我们有我们有 *<*<··;; 由产生式由产生式 11和和 EEE+TE+T 可得可得 ++·>+,·>+, 同理可得:同理可得:。。

由产生式由产生式 P P (E)(E) 和和 E E E+T E+T T+T T+T T*F+T T*F+T F*F+T F*F+T P PF*F*F+T F+T i iF*F+T F*F+T 我们可以得到 我们可以得到 ( <( <·+, ·+, ( <( <·*, ·*, ( <( <··, , ( <( <·i .·i . 总之,我总之,我们可以按定义得到对于文法们可以按定义得到对于文法 GG 的任何终结符对(的任何终结符对( a,b)a,b) 的,至多只的,至多只有一种优先关系。从而得到下面的优先表:有一种优先关系。从而得到下面的优先表:

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

优先关系表优先关系表 + * + * i ( ) # i ( ) #

+ + * * i i ( ( ) ) # #

[[ 例例 5.3] 5.3] 对下列文法对下列文法 G:G:

S’S’#S# P #S# P S|iS|i

S S D(R) D D(R) D i i

R R R; P|P R; P|P

求出每个非终结符的求出每个非终结符的 FIRSTVTFIRSTVT 集和集和 LASTVTLASTVT集,并构造算符优先集,并构造算符优先关系矩阵。关系矩阵。

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

文法文法 GG每个非终结符的每个非终结符的 FIRSTVTFIRSTVT集合集合FIRSTVT(S’)= {#} FIRSTVT(P) ={i, ( }FIRSTVT(S’)= {#} FIRSTVT(P) ={i, ( }FIRSTVT(S)={ (, i } FIRSTVT(D) ={i }FIRSTVT(S)={ (, i } FIRSTVT(D) ={i }FIRSTVT(R) ={;, (, I }FIRSTVT(R) ={;, (, I }

文法文法 GG 的每个非终结符的的每个非终结符的 LASTVTLASTVT集合集合LASTVT(S’) ={ #} LASTVT(P) = {i , ) }LASTVT(S’) ={ #} LASTVT(P) = {i , ) }LASTVT(S) ={ ) } LASTVT(D) = {i }LASTVT(S) ={ ) } LASTVT(D) = {i }LASTVT(R) ={;, ) ,i }LASTVT(R) ={;, ) ,i }

优先关系矩阵优先关系矩阵 ( ) ; ( ) ; i #i #( <( <·· = =·· < <·· < <·· ) ) ··> > ··> > ··>>; <; <· ·· ·> > ··> <> <··i i ··> > ··> > ··> > # <# <· · < <· =·· =·

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

[[ 例例 5.4]5.4] 已知文法已知文法 G[S]G[S] 为算符优先文法,其规则为:为算符优先文法,其规则为: SSSaF|FSaF|F

F F FbP|PFbP|P

P P c|d c|d 求优先关系矩阵求优先关系矩阵解:每个非终结符的解:每个非终结符的 FISRVTFISRVT 集合集合 FIRSTVT(S) = {c, d, a,b}FIRSTVT(S) = {c, d, a,b}

FIRSTVT(F) = {b, c, d}FIRSTVT(F) = {b, c, d}

FIRSTVT(P) ={c , d }FIRSTVT(P) ={c , d }

每个非终结符的每个非终结符的 LASTVTLASTVT集合集合LASTVT(S)= { a, b, c, d}LASTVT(S)= { a, b, c, d}

LASTVT(F) = {b, c, d}LASTVT(F) = {b, c, d}

LASTVT(P) = { c, d }LASTVT(P) = { c, d }

因为因为 SSSaF SaF 则则 LASTVT(S)LASTVT(S)··>a>a 且且 a<a<··FIRSTVT(F)FIRSTVT(F)

则:则: aa··>a, b>a, b··>a, c>a, c··>a, d>a, d··>a >a 且且 a<a<··b,a<b,a<··c,a<c,a<··dd

由于由于 F F FbP; FbP; 则则 LASTVT(F)>bLASTVT(F)>b 且且 b<FIRSTVT(P)b<FIRSTVT(P)

则则 :b>b, c>b, d>b :b>b, c>b, d>b 且且 b<c, b<db<c, b<d

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

优先关系矩阵:优先关系矩阵: a b c da b c d

a > < < <a > < < <

b > > < <b > > < <

c > >c > >

d > >d > >

top related