1、1,第6章 自低向上优先分析,即移进-规约分析。思想:对符号串自左向右扫描,将输入符号移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄或可规约串时(该句柄或可规约串对应某个产生式右部),就用该产生式的左部非终结符代替相应右部的文法符号串,即规约。重复这一过程,直到栈中只剩下文法的开始符号时则认为分析成功,即输入的符号串是文法的句子。,2,6.1 自底向上优先分析概述,有两种优先分析法: 1。 简单优先分析法:求出文法所有符号(终结符,非终结符)之间优先关系,按这种关系确定规约过程中的句柄。 2。算符优先分析法:考虑算符之间优先关系的规约(非规范规约),3,6.3 算符优先分
2、析法,算符优先文法的定义算符优先关系表的构造 算符优先分析算法 算符优先分析法的局限性,4,6.3.1 算符优先分析,自下而上分析算法模型-移进归约 算符优先分析不是规范归约算符优先分析的可归约 串是句型的最左素短语 定义: cfg(上下文无关文法) G 的句型的素短语是一个短语,它至少包含一个终结符,且除自身外不再包含其他素短语。处于句型最左边的素短语为最左素短语. 文法GS的短语:S A且A ,则称是句型相对于非终结符A的短语,5,文法GE: (1) EE+T (2) ET (3) TT*F (4) TF (5) FPF|P (6) P(E) (7) Pi,句型T+T*F+i 其短语有:
3、T+T*F+i T+T*F T T*F i,E,E,T,+,+,E,T,F,*,F,T,T,i,最左素短语为:T*F,句型T+T+F的素短语为:T+T,E,+,+,T,F,E,句型T+T+i的素短语为:T+T, i,素短语为:T*F, i,E,T,T,i,6,分析程序模型,总控程序,算符优先关系表,产生式,输入串#,#,输出,7,例 GE: EET|T TT*F|F FPFP P(E)|i,算符优先关表,8,6.3.2 算符优先文法的定义,算符文法定义:如果不含空产生式的上下文无关文法 G 中,没有形如 ABC的产生式,其中B,CVN 则称G 为算符文法(OG)。 例1 GE:EE+E|E-|
4、E*E|E/E|EE|(E)|i 例2 GE: EET|TTT*F|FFPFPP(E)|i 性质1:在算符文法中任何句型都不包含两个相邻的非终结符. 性质2:如 Ab 或 bA 出现在算符文法的 句型 中,其中 AVN,bVT, 则 中任何 含 b 的短语必含有A。,9,算符优先关系,在OG中定义 算符优先关系:a = b G中有形如:Aab或A aBb.的产生式。 a b G中有形如: A Bb的产生 式,而 B a 或 B aC规定 若 S a或 S Ca 则 # # (认为存在#S#),10,算符优先文法OPG定义,在 OG文法 G 中,若任意两个终结符间至多有一种算符优先关系存在,则称
5、G 为算符优先文法(OPG)。注意:允许bc, cb; 不允许 bc, b“(”。结论 : 算符优先文法是无二义的。,11,6.3.3 算符优先关系表的构造,首先定义如下两个集合: FIRSTVT(B)=bB b 或 B CbLASTVT(B)=aB a 或 B aC 按如下算法计算出给定文法中任何两个终结符对(a,b)之间的优先关系:1) =关系 直接看产生式的右部,若出现了 A ab或 A aBb,则a=b2)关系 求出每个非终结符B的LASTVT(B) 若ABb,则aLASTVT(B),则ab,12,计算算符优先关系,例文法GE: (0) E#E# (1) EE+T (2) ET (3)
6、 TT*F (4) TF (5) FPF|P (6) P(E) (7) Pi,FIRSTVT(E)=# FIRSTVT(E)=+,*,(,i FIRSTVT(T)=*,(,i FIRSTVT(F)=,(,i FIRSTVT(P)=(,i LASTVT(E)=# LASTVT(E)=+,*,),i LASTVT(T)=*,),i LASTVT(F)=,),i LASTVT(P)=),i,13,(0)E#E# (1) EE+T (2) ET (3) TT*F (4) TF (5) FPF|P (6) P(E) (7) Pi,3)关系 找形如:ABb的产生式 E#: 则 LASTVT(E)# E+:
7、 则 LASTVT(E)+ T*: 则 LASTVT(T)* P: 则 LASTVT(P) E): 则 LASTVT(E),2)关系 找形如AaB的产生式 #E:则 #FIRSTVT(E) +T: 则 +FIRSTVT(T) *F: 则 *FIRSTVT(F) F: 则 FIRSTVT(F) (E: 则 (FIRSTVT(E),1)=关系 由产生式(0)和(6),得 #=#, ( = ),14,例GE的算符优先关表(注意加入#),15,6.3.4 算符优先分析算法,算符优先文法句型的性质: 算符文法的任何一个句型应为如下形式: N1a1N2a2 . Nnan Nn+1 其中N k(1kn+1)
8、为非终结符或空,ak(1kn)为终结符。 算符优先文法句型的最左素短语NiaiNi+1ai+1 . Njaj Nj+1满足: ai-1 ai ai =ai+1 = =aj-1 =aj aj aj+1 即:ai-1 aj+1,16,算符优先分析算法,1 k:= 1; S k := “#” 2 repeat read 下一符号到a; 3 if S k Vt then j := k else j := k-1; 4 while S j a do 5 repeat 6 Q := S j ; 7 if S j-1 Vt then j := j-1 8 else j:= j-2 9 until S j Q; 10 将 S j+1 S j+2 S k 归约到某个N;/ 11 k := j+1; 12 S k := N; 13 14 if ( S j a or S j = a) 15 then k := k+1; S k := a 16 else error 17 until a = “#”,17,算符优先分析法,简单,直观,有利于表达式分析,易于手工实现 比规范归约快 可能导致把错误的句子得到正确的归约。该方法仅适用于表达式的语法分析,18,利用算符优先分析算法分析输入串,举例 p115: 分析输入串i+i# GE: EET|T TT*F|F FPFP P(E)|i,