390 likes | 567 Views
第 6 章 自底向上语法分析. 6.1 自底向上语法分析. 一、自底向上方法概述 自底向上方法:从给定终极符串进行归约,并归约成文法的初始符。. 移进 - 归约方法的四个动作 : 移进 : 输入流头符读到分析栈中 归约 : 分析栈句柄归约非终极符 接受 : 分析成功 报错 : 处理错误. 例子: 对输入串 abbcde 进行分析,检查该串是否是 G[S] 的句子。 G[S] : S→aAcBe A→b A→Ab B→d
E N D
第6章 自底向上语法分析
6.1 自底向上语法分析 一、自底向上方法概述 自底向上方法:从给定终极符串进行归约,并归约成文法的初始符。 • 移进-归约方法的四个动作: • 移进:输入流头符读到分析栈中 • 归约:分析栈句柄归约非终极符 • 接受:分析成功 • 报错:处理错误
例子:对输入串abbcde进行分析,检查该串是否是G[S]的句子。例子:对输入串abbcde进行分析,检查该串是否是G[S]的句子。 G[S]: S→aAcBe A→b A→Ab B→d 对输入串abbcde的最右推导是:SaAcBeaAcdeaAbcdeabbcde SaAcBeaAcdeaAbcdeabbcde 所以移进-归约方法的分析过程如下:
步骤 符号栈 输入串 Action 1 # abbcde# 移进 2 #a bbcde# 移进 3 #ab bcde# 归约(A→b) 4 #aA bcde# 移进 5 #aAb cde# 归约(A→Ab) 6 #aA cde# 移进 7 #aAc de# 移进 8 #aAcd e# 归约(B→d) 9 #aAcB e# 移进 10 #aAcBe # 归约(S→aAcBe) 11 #S # 接受
例:考虑文法 G(E): E→T|E+T T→F|T*F F→i|(E) 并假定已给定终极符串(i+i)*i。下面是对该串的移入─归约过程: ( ,(i+i)*i) 1 =移=>(( , i+i)*i) 2 =移=>((i , +i)*i) 3 =归=>((F , +i)*i) 4
=归=>((T , +i)*i) 5 =归=>((E , +i)*i) 6 =移=>((E+ , i)*i) 7 =移=>((E+i , )*i) 8 =归=>((E+F , )*i) 9 =归=>((E+T , )*i) 10 =归=>((E , )*i) 11 =移=>((E) , *i) 12 =归=>(F , *i) 13
=归=>(T , *i) 14 =移=>(T* , i) 15 =移=>(T*i , ) 16 =归=>(T*F , ) 17 =归=>(T , ) 18 =归=>(E , ) 19
设Si和Sj是文法的任意两个符号,那么它们在句型中相邻出现的充要条件是必须满足下列条件之一:设Si和Sj是文法的任意两个符号,那么它们在句型中相邻出现的充要条件是必须满足下列条件之一: 1.有形如U→SiSj的产生式 2.有形如U→SiW且WSj的产生式 3.有形如U→VSj且V Si的产生式的产生式 4.有形如U→VW且V Si和W Sj的产生式的产生式 + + + + 6.2 简单优先方法
定义了三种优先关系( , , )其定义如下: • Si Sj:当且仅当存在如下的产生式U→…SiSj… 例子:A→abABc,其中b与A相邻 b A • Si Sj:当且仅当存在如下产生式U→…SiW…,且有W Sj……) +
例子:A→abABc B→bcd,其中A与b相邻 A b • Si Sj:当且仅当存在如下产生式 U→…VW…,且有V Si和W Sj……) 例子:A→abABc A→ccd B→bcb,其中d与b相邻 d b * +
当 Si Sj 当 Si Sj 当 Si Sj 空 否则 优先关系可用矩阵来表示,称这种矩阵为优先关系矩阵。 具体定义如下图: M[si,sj]
FIRST(W)={S|W S,S(Vn∪Vt)} • LAST(W)={S|W S,S(Vn∪Vt)} + + 构造优先关系矩阵步骤: • STEP1:对每个非终极符号W求下面两种集合 • STEP2:对每个符号对Si,Sj填写优先关系矩阵。
b ( b a 第一步: ①Z→b M b b M ②Z→b M b (… a… 例子:假设有文法 G[Z]: Z→bMb M→a|( L L→M a )
第二步: ①Z→b M b M b ②Z→b M b …) …L …a ) b L b a b
Z M L b ( a ) Z M L b ( a )
Z M L FIRST b ( a M ( a LAST b ) L a ) 所以对G[Z]: Z→bMb M→a|( L L→M a ) 有:FRIST(M)={ (,a } LAST(M)={ ),L,a } 有下表:
E E + T T * F + T + T 定义3.13满足下面两个条件的文法称为简单优先文法。 1.任意两个符号至多成立一种关系 2.任意两个产生式具有不同右部 例子:G[Z]: E→E+T|T T→T*F|F F→(E)|i
G2:E→E+T|T T→T*F|F F→(E)|i (其中( E,( E) 下面文法均不为简单优先文法 • G1:B→a D→a (有两个相同的右部)
Si-1 Si,Si Si+1 Sj , Sj Sj+1,则SiSi+1Sj定为句柄。 例子:ZabCDc a b C D e 则bCD是句柄。 定理3.10设S1S2Sn是简单优先文法的规范句型,其子串SiSi+1Sj满足条件:
Z M L b ( a ) Z M L b ( a ) 分析句子b( a a )b(文法G[Z])的过程:
分析栈 关系 输入流 归约符 # b(aa)b# # b(aa)b# #b (aa)b# #b(a a)b# #b(a a)b# M #b(M a)b# 移进项目的处理 移进项目的处理
分析栈 关系 输入流 归约符 # b(aa)b# #b (aa)b# #b( aa)b# #b(a a)b# M #b(M a)b# #b(Ma )b# #b(Ma) b# L #b(L b# M #bM b# #bMb # Z #Z # 停
6.3 算符优先方法 算符优先文法的定义 算符优先关系表的构造 算符优先分析算法 算符优先分析法的局限性
6.3.1 直观算符优先分析法 分析程序模型 • 自下而上分析算法 模型----移进归约 • 算符优先分析不是规范归约 输入串# 总控程序 输出 # 算符优先关系表 产生式
如何确定算符优先关系? 文法G[E]:E→E+E|E-E|E*E|E/E|EE|(E)|i 人为确定: (1)i的优先级最高 (1) 优先级次于i,右结合 (2)*和/优先级次之,左结合 (3)+和-优先级最低,左结合 (4)括号‘(’,‘)’的优先级大于括号外的运算符,小于括号内的运算符,内括号的优先性大于外括号 (5)#的优先性低于与其相邻的算符 算符优先关系表
6.3.2 算符优先文法的定义 • 定义:如果不含空产生式的上下文无关文法 G 中没有形如 A…BC…的产生式,其中B,C∈VN 则称G 为算符文法(OG)。 例6.1 G[E]:E→E+E|E-|E*E|E/E|EE|(E)|i 例6.2 G’[E]: E→E+T|T T→T*F|F F→P↑F|P P→(E)|i 性质1:在算符文法中任何句型都不包含两个相邻的非终结符. 性质2:如 Ab或 bA 出现在算符文法的 句型 中,其中 A∈VN,b∈VT, 则 中任何 含 b的短语必含有A。
算符优先关系 在OG中 定义(算符优先关系) a = b G中有形如:A…ab… 或A …aBb...的产生式。 a < b G中有形如: A …aB…的产生式, 而B b… 或B Cb… a > b G中有形如: A …Bb…的产生 式,而B …a或 B … aC 规定若S a…或S Ca… 则#<a 若S …a或S …aC 则a>#
在OG文法G 中,若任意两个终结符间至多有一种算符优先关系存在,则称G 为算符优先文法(OPG)。 注意:允许b>c, c>b; 不允许 b>c, b<c, b=c中任两个同时存在。 b=c 不一定 c = b。 例6.1中:“(” = “)”,“)”<>“(”。 结论: 算符优先文法是无二义的。
6.3.3 算符优先关系表的构造 首先定义如下两个集合: FIRSTVT(B)={b|B b… 或 B Cb…} LASTVT(B)={a|B …a 或 B …aC} 按如下算法计算出给定文法中任何两个终结符对(a,b)之间的优先关系: 1) ‘=‘关系 • 直接看产生式的右部,若出现了A →…ab…或 A →…aBb,则a=b 2)’<‘关系 • 求出每个非终结符B的FIRSTVT(B) • 若A→…aB…,则b∈FIRSTVT(B),则a<b 3)’>’关系 • 求出每个非终结符B的LASTVT(B) • 若A→…Bb…,则a∈LASTVT(B),则a>b
计算算符优先关系 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} 例6.3 文法G’[E’]:(0) E’→#E#(1) E→E+T(2) E→T(3) T→T*F(4) T→F(5) F→PF|P(6) P→(E)(7) P→i
(0)E’→#E# (1) E→E+T (2) E→T (3) T→T*F (4) T→F(5) F→PF|P (6) P→(E) (7) P→i 1)‘=’关系由产生式(0)和(6),得#=#, (= ) 3)‘>’关系找形如:A→…Bb…的产生式E#: 则 LASTVT(E)>#E+: 则 LASTVT(E)>+ T*: 则 LASTVT(T)>*P: 则 LASTVT(P)>E): 则 LASTVT(E)>) 2)‘<’关系找形如A→…aB…的产生式#E:则 #<FIRSTVT(E)+T: 则 +<FIRSTVT(T) *F: 则 *<FIRSTVT(F)F: 则 <FIRSTVT(F)(E: 则 (<FIRSTVT(E)
6.3.4 算符优先分析算法 算符优先文法句型的性质 算符文法的任何一个句型应为如下形式: #N1a1N2a2 ... Nnan Nn+1# 其中N k(1≤k≤n+1)为非终结符或空,ak(1≤k≤n)为终结符 算符优先文法句型的最左素短语NiaiNi+1ai+1 ... Njaj Nj+1满足: ai-1< ai ai =ai+1 =…… =aj-1 =aj aj> aj+1 即:ai-1<ai=ai-1=...= aj-1 = aj> aj+1
算符优先分析的可归约 串是句型的最左素短语 定义 cfg(上下文无关文法) G 的句型的素短语是一个短语,它至少包含一个终结符,且除自身外不再包含其他素短语。处于句型最左边的素短语为最左素短语 文法G[S]短语的定义 SαAδ且A 则称是句型αδ相对于非终结符A的短语
例:有文法G[E]:(1) E→E+T(2) E→T(3) T→T*F(4) T→F(5) F→PF|P(6) P→(E)(7) P→i E E + T F E + T T T * F i 句型T+T*F+i其短语有:T+T*F+iT+T*FTT*Fi 素短语为:T*F, i 最左素短语为:T*F
E E + T 句型T+T*F+i的语法树 F E + T T T * F i N 句型T+T*F+i进行算符优先分析时语法树的框架 N + N i N + N N * N 省略了E→T, E→T, E→T的规约
例:有文法G[E]:(1) E→E+T(2) E→T(3) T→T*F(4) T→F(5) F→PF|P(6) P→(E)(7) P→i E T E + F E + T i T 句型T+T+i的素短语为:T+T, I 最左素短语为T+T (注:T+T不是简单短语,但是素短语) E T E + 句型T+T+F的素短语为:T+T 最左素短语是T+T F E + T T
分析程序模型 输入串# 总控程序 输出 # 算符优先关系表 产生式
算符优先分析法 • 简单,直观,有利于表达式分析,易于手工实现 • 比规范归约快 • 可能导致把错误的句子得到正确的归约