1、第6章 自底向上的语法分析,自底向上分析方法,也称移进-归约分析法。 实现思想:对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的可规约串时,(该句型或可规约串对应某产生式的右部),就用该产生式的左部非终结符代替相应右部的文法符号串,这称为一步归约。重复这一过程直到输入串只剩结束符,栈中只剩文法的开始符号时则为分析成功,否则为出错。 自底向上分析的关键问题是在分析过程中如何确定可规约串。,第6章 自底向上的语法分析,例:文法GS SaAcBe Ab AAb Bd,分析输入串abbcde#,第6章 自底向上的语法分析,例:文法GS SaA
2、cBe Ab AAb Bd,SA A B A BA A A A a b b c d e a b b c d e a b b c d e a b b c d e,SaAcBeaAcdeaAbcdeabbcde,第6章 自底向上的语法分析,6.1 自底向上优先分析概述 6.2 简单优先分析法 6.3 算符优先分析法,6.1 自底向上优先分析概述,优先分析法可分为以下两类: 简单优先分析法 在归约过程中考虑文法所有符号即包括终结符和非终结符之间的优先关系,按照这种关系确定规约过程中的可规约串(句柄),它的规约过程实际上是一种规范规约。该分析法准确、规范,但分析效率较低,实际使用价值不大。 算符优先分
3、析法 在归约过程中,只考虑终结符之间的优先关系来确定可规约串,而与非终结符无关。这样去掉了单非终结符的归约,所以算符优先分析法的规约过程不是规范归约。但它简单,直观,效率较高,特别适用于表达式的分析。,6.2 简单优先分析法,简单优先分析法是按照文法符号(包括终结符和非终结符)之间的优先关系确定句柄。 6.2.1 优先关系的定义 6.2.2 简单优先文法的定义 6.2.3 简单优先分析算法,6.2.1 优先关系的定义,文法中任意两个符号X,Y按其在句型中可能会出现的相邻关系来确定它们的优先关系: X = Y 文法G中存在产生式AXY. X Y 文法G中存在产生式A.BD.,且B+ .X,D*
4、Y.,6.2.1 优先关系的定义,例:文法GS SbAb A(B|a BAa),该文法中符号之间的优先关系为: =:b = A,A = b,( = B,A = a,a = ) :B b,a b,) b,B a,a a,) a,优先关系的定义 X = Y AXY. X Y A.BD., 且B+ .X, D* Y.,6.2.1 优先关系的定义,例:文法GS SbAb A(B|a BAa),优先关系也可用语法树的结构表示,S S S S b A b b A b b A b b A b( B a ( B ( BA a ) A a )( B aA a ),该文法中符号之间的优先关系为: =:b = A,
5、A = b,( = B,A = a,a = ) :B b,a b,) b,B a,a a,) a,6.2.1 优先关系的定义,优先关系矩阵,#表示语句括号, #,例:文法GS SbAb A(B|a BAa),6.2.2 简单优先文法的定义,满足以下条件的文法是简单优先文法 在文法符号集V中,任意两个符号之间最多只有一种优先关系成立。 在文法中任意两个产生式没有相同的右部。 不含空产生式。,文法G1S: SbAb A(B|a BAa),文法G2S: SaAcBe Ab AAb Bd,分别判断以下三个文法是否是简单优先文法,文法G3E: EE+T|T TT*F|F Fi,6.2.2 简单优先文法的
6、定义,文法G1S: SbAb A(B|a BAa),文法G2S: SaAcBe Ab AAb Bd,分别判断以下三个文法是否是简单优先文法,文法G3E: EE+T|T TT*F|F Fi,G2不是,因为有: a =A,a A,G1是,G3不是,因为有: + = T,+ T * = F,* F,6.2.3 简单优先分析算法,简单优先分析方法的组成部分 分析表 分析栈 分析算法,6.2.3 简单优先分析算法,分析算法步骤如下: 将输入符号串a1a2a3.an#依次逐个存入符号栈S中,直到遇到栈顶符号ai的优先性下一个待输入符号ai+1时为止。 栈顶当前符号ai为句柄尾,由此向左在栈中找句柄的头符号
7、ak,即找到ak-1 ai+1。 由句柄ak.ai在文法的产生式中查找右部为ak.ai的产生式,若找到则用相应左部代替句柄,若找不到则为出错,这时可断定输入串不是该文法的句子。 重复上述三步,直到归约完输入符号串,栈中只剩文法的开始符号为止。,6.2.3 简单优先分析算法,例:文法GS SbAb A(B|a BAa),分析串b(aa)b#,6.3 算符优先分析法,某些文法具有“算符”特性 表达式运算符(优先级、结合性) 人为地规定其算符的优先顺序,即给出优先级别和同一级别的结合性 只考虑算符之间的优先关系来确定可规约串,6.3 算符优先分析法,算符优先分析法只考虑算符(广义为终结符)之间的优先
8、关系。 6.3.1 直观算符优先关系 6.3.2 算符优先文法的定义 6.3.3 算符优先关系表的构造 6.3.4 算符优先分析算法,6.3.1 直观算符优先关系,例GE:EE+E|E-E|E*E|E/E|EE|(E)|i 按公认的计算顺序规定优先级和结合性: i的优先级最高 优先级次于i,右结合 *和/优先级次之,左结合 +和-优先级最低,左结合 括号(,)的优先级大于括号外的运算符,小于括号内的运算符,内括号的优先性大于外括号 #的优先性低于与其相邻的算符,6.3.1 直观算符优先关系,算符优先关系表,6.3.2 算符优先文法的定义,定义:如果不含空产生式的上下文无关文法G中没有形如ABC
9、的产生式,其中A,B,CVN ,则称G为算符文法(OG)。例 GE:EE+EE-EE*EE/EEE(E)i 性质1:在算符文法中任何句型都不包含两个相邻的非终结符. 性质2:如 Ab 或 bA 出现在算符文法的句型 中,其中AVN, bVT, 则中任何含b的短语必含有A。,转到算法优先文法分析,6.3.2 算符优先文法的定义,在OG中 定义 (算符优先关系) a = b G中有形如:Aab或A aBb.的产生式。 a b G中有形如: A Bb的产生式,而B+ a 或B+ aC 规定: 若 S+a 或 S+Ca 则 # # 其中:a,bVT , S,A,B,CVN,6.3.2 算符优先文法的定
10、义,设有一不含产生式的算符文法G,若任意两个终结符间至多有一种算符优先关系存在,则称G 为算符优先文法(OPG)。 注意: 不允许 b c, b c, c b同时存在; b = c 不一定有 c = b。,6.3.2 算符优先文法的定义,GE:EE+EE-EE*EE/EEE(E)i 该文法是否为算符优先文法?,6.3.2 算符优先文法的定义,GE:EE+EE-EE*EE/EEE(E)i 该文法是否为算符优先文法? 不是。 对算符+、*来说,有: EE+EE+E*E,此时 + *,6.3.3 算符优先关系表的构造,首先定义如下两个集合: FIRSTVT(B)=bB+b 或 B+Cb LASTVT
11、(B)=aB+a 或 B+aC 按如下算法计算出给定文法中任何两个终结符对(a,b)之间的优先关系: 1) = 关系 若出现了Aab或AaBb,则a=b 2) 关系 求出每个非终结符B的LASTVT(B) 若ABb,则aLASTVT(B),则ab,6.3.3 算符优先关系表的构造,例文法GE: E#E# EE+T ET TT*F TF FPF|P P(E) Pi,FIRSTVT(E)=# FIRSTVT(E)=+,*,(,i FIRSTVT(T)=*,(,i FIRSTVT(F)=,(,i FIRSTVT(P)=(,i LASTVT(E)=# LASTVT(E)=+,*,),i LASTVT(
12、T)=*,),i LASTVT(F)=,),i LASTVT(P)=),i,6.3.3 算符优先关系表的构造,1)=关系 由产生式(1)和(7),得# = #,( = ) 2)关系找形如:ABb的产生式 E#: 则 LASTVT(E) # E+: 则 LASTVT(E) + T*: 则 LASTVT(T) * P: 则 LASTVT(P) E): 则 LASTVT(E) ),例文法GE: E#E# EE+T ET TT*F TF FPF|P P(E)|i,6.3.3 算符优先关系表的构造,例 文法GE的算符优先关系表,6.3.4 算符优先分析算法,根据前面介绍的算符文法的性质可知算符文法的任何
13、一个句型应为如下形式:N1a1N2a2 . NnanNn+1其中Nk(1kn+1)为非终结符或空,ak(1kn)为终结符。 若NiaiNjajNj+1为可规约串,该可规约串中终结符之间的优先关系为:ai-1 aj+1 因为算符优先文法有如下性质,即:如果aNb(或ab)出现在句型r中,则a和b之间有且只有一种优先关系,即: 若ab,则在r中必含有a而不含b的短语存在 若a=b,则在r中含有a的短语必含有b,反之亦然。,查看算符文法的性质,6.3.4 算符优先分析算法,算符优先分析算法在归约过程中,只考虑终结符之间的优先关系来确定可规约串。为解决在算符优先分析过程中如何寻找可规约串,引进最左素短
14、语的概念。 定义 素短语是一个短语,它至少包含一个终结符,且除自身外不再包含其他素短语。处于句型最左边的素短语为最左素短语。,6.3.4 算符优先分析算法,例 文法GE: (1) EE+T (2) ET (3) TT*F (4) TF (5) FPF|P (6) P(E) (7) Pi,对句型 #T1+T2*F+i# 其短语有: T1+T2*F+i T1+T2*F T1,T2*F,i 素短语有:T2*F,i 最左素短语为:T2*F 最左素短语即为算术优先分析法的句柄,EE + T E + T F T T*F Pi,NN + N N + N iN * N,6.3.4 算符优先分析算法,算符优先分
15、析算法描述: k:=1; S k :=#repeat read 下一符号到a;if S k Vt then j:=k else j:=k-1;while S j a do repeat Q := S j ;if S j-1 Vt then j := j-1 else j := j-2until S j # then if (S j a or S j = a) ) then k:=k+1; S k:=a else erroruntil a = #,6.3.4 算符优先分析算法,分析 举例:,GE: E#E# EE+T|T TT*F|F FPF|P P(E)|i,6.3.4 算符优先分析算法,规范规约过程:,GE: E#E# EE+T|T TT*F|F FPF|P P(E)|i,6.3.4 算符优先分析算法,分析 举例:,GE: E#E# EE+T|T TT*F|F FPF|P P(E)|i,第6章 小结,简单优先分析法 符号之间的优先关系 简单优先关系表的构造 简单优先文法 简单优先分析方法 算符优先分析法(使用时有一定的局限性) 算符文法及其两条性质 算符之间的优先关系 算符优先文法及其性质 算符优先关系表的构造 算符优先分析方法,