270 likes | 372 Views
第六章 自底向上的优先分析法. 6.1 自底向上分析概述 自底向上分析法 ( 或自下而上分析 ) ,也称移进 - 归约分析法。. 它的实现思想是对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄时, ( 该句柄对应某产生式的右部 ) ,就用该产生式的左部非终结符代替相应右部的文法符号串,这称为一步归约。重复这一过程直到归约到栈中只剩文法的开始符号时则为分析成功,. 例 (P102).
E N D
6.1 自底向上分析概述 自底向上分析法(或自下而上分析),也称移进-归约分析法。 它的实现思想是对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄时,(该句柄对应某产生式的右部),就用该产生式的左部非终结符代替相应右部的文法符号串,这称为一步归约。重复这一过程直到归约到栈中只剩文法的开始符号时则为分析成功,
例(P102) 设文法G[S]为:(1) S→aAcBe(2) A→b(3) A→Ab(4) B→d 对输入串abbcde#进行分析,检查该符号串是否是G[S]的句子。 由于自底向上分析的移进-归约过程是自顶向下最右推导的逆过程,而最右推导为规范推导,自左向右的归约过程也称规范归约。 容易看出对输入串abbcde的最右推导是:S aAcBe aAcde aAbcde abbcde 由此我们可以构造它的逆过程即归约过程。 先设一个先进后出的符号栈,并把句子左括号“#”号放入 栈底,其分析过程如P102页的表6.1。
自底向上构造语法树的过程 推倒的逆过程为:S aAcBe aAcde aAbcde abbcde
在上述移进-归约或自底向上构造语法树的过程中,我们怎么知道何时移进,何时归约,不能只简单地看成栈顶出现某一产生式的右部就可用相应产生式归约,例如在表6.1分析到第5)步时栈中的符号串是#aAb,栈顶符号串b和Ab分别是产生式(2),(3)的右部,这时到底用(2)归约还是用(3)归约是自底向上分析要解决的关键问题。在上述移进-归约或自底向上构造语法树的过程中,我们怎么知道何时移进,何时归约,不能只简单地看成栈顶出现某一产生式的右部就可用相应产生式归约,例如在表6.1分析到第5)步时栈中的符号串是#aAb,栈顶符号串b和Ab分别是产生式(2),(3)的右部,这时到底用(2)归约还是用(3)归约是自底向上分析要解决的关键问题。 由于移进-归约是规范推导(最右推导)的逆过程,即规范归约(最左归约)。 只有当句柄出现在栈顶符号串中时,则可用句柄归约,这样一直归约到输入串只剩结束符,文法符号栈中只剩开始符号。这时才能认为输入符号串是文法的句子。否则为出错。 由此可见自底向上分析的关键问题是在分析过程中如何确定句柄,也就是说如何知道何时在栈顶符号串中已形成某句型的句柄,那么就可以确定何时可以进行归约。
6.2简单优先分析法 简单优先分析法是按照文法符号(终结符和非终结符)的优先关系确定句柄的.因此,首先要介绍两个文法符号的优先关系如何确定. 6.2.1 优先关系 首先定义优先关系的表示: X Y表示X的优先性等于Y。X Y表示X的优先性低于Y X Y表示X的优先性高于Y。 优先关系是有序的, X Y不一定Y X;X Y不一定Y X;X Y不一定Y X;
(1)X Y 当且仅当G中存在产生式A→…XY… (2)X Y 当且仅当G中存在产生式A→…XB…,且B Y… (3)X Y 当且仅当G中存在产生式A→…BD…, 且B …X和D Y… 见P104-105页的例题6.2 简单优先文法的定义(P105) 简单优先分析法 (P105)
6.3 算符优先分析法 算符优先分析的基本思想是只规定算符(广义为终结符)之间的优先关系,也就是只考虑终结符之间的优先关系,不考虑非终结符之间的优先关系。
如何确定算符优先关系? 人为确定: (1)i的优先级最高 (1) 优先级次于i,右结合 (2)*和/优先级次之,左结合 (3)+和-优先级最低,左结合 (4)括号‘(’,‘)’的优先级大于括号外的运算符,小于括号内的运算符,内括号的优先性大于外括号 (5)#的优先性低于与其相邻的算符 算符优先关系表
例如:若有文法G为:(1) E→E+E(2) E→E*E(3) E→i 对输入串i+i*i的归约过程可表示为表6.3。
算符优先文法的定义 • 定义:如果不含空产生式的上下文无关文法 G 中没有形如 A…BC…的产生式,其中B,C∈VN 则称G 为算符文法(OG)。 例6.1 G[E]:E→E+E|E*E|i 是OG文法 性质1:在算符文法中任何句型都不包含两个相邻的非终结符.(证明P108,用归纳法证明) 性质2:如 Ab或 bA 出现在算符文法的 句型 中,其中 A∈VN,b∈VT, 则 中任何 含b的短语必含有A。(注意:含A的短语不一定含b) 用反证法P108
证明:性质1 用归纳法 设γ是句型,即S γS=ω0 ω1 ... ωn-1 ωn=γ 推导长度为n,归纳起点n=1时,S=ω0 ω1=γ,即S γ,必存在产生式S→γ,而由算符文法的定义,文法的产生式中无相邻的非终结符,显然满足性质1。 假设n>1, ωn-1满足性质1。 若ωn-1=αAδ,A为非终结符。 由假设α的尾符号和δ的首符号都不可能是非终结符,否则与假设矛盾。 又若A→β是文法的产生式,则有ωn-1 ωn=αβδ=γ 而A→β是文法的原产生式,不含两个相邻的非终结符,所以αβγ也不含两个相邻的非终结符。满足性质1。证毕。
证明:性质2 用反证法。 因为由算符文法的性质1知可有:S γ=αbAβ 若存在B αb,这时b和A不同时归约,则必有S BAβ, 这样在句型BAβ中存在相邻的非终结符B和A,所以与性质1矛 盾,证毕。注意:含b的短语必含A,含A的短语不一定含b。
算符优先关系的定义: 在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, b<c, b=c中任两个 同时存在。 b=c 不一定 c = b。 例:G:(1) E→E+E (2) E→E*E (3) E→i对i+i*I可以画两棵语法树如图 E E E+E E*E E*E E+E i i i i i i 结论: 算符优先文法是无二义的。 *<+ *>+ 可见它不是算符优先文法
算符优先关系表的构造 首先定义如下两个集合: 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 即a<FIRSTVT(B) 3)’>’关系 • 求出每个非终结符B的LASTVT(B) • 若A→…Bb…,则a∈LASTVT(B),则a>b 即 LASTVT(B)>b
如何求FIRSTVT集: • 若有产生式A →a…或A →Ba…则a∈FIRSTVT(A) • 若a ∈FIRSTVT(B)且有产生式A →B…则a ∈FIRSTVT(A) • 如何求LASTVT集: • 若有产生式A →… a或A →…aB 则a∈LASTVT(A) • 若a ∈LASTVT(B)且有产生式A →… B则a ∈LASTVT(A)
计算算符优先关系 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} 例文法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)
算符优先分析 • 算符优先分析的可归约 串是句型的最左素短语 定义 G 的句型的素短语是一个短语,它至少包含一个终结符,且除自身外不再包含其他素短语。 • 即素短语必须满足下列两个条件: • 1、至少包含一个终结符号。 • 2、该短语不再包含满足第一个条件的更小的语。 处于句型最左边的素短语为最左素短语
E 文法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 句型T+T*F+i其短语有:T+T*F+iT+T*FTT*Fi E + T F E + T T T * F i E T E + 句型T+T*F+i的素短语为:T*F, i F E + T 句型T+T*F+I的最左素短语为:T*F i T 句型T+T+i的素短语是: T+T 和 i,其中最左素短语:T+T
算符优先分析算法前面介绍了如何对已给定的文法按其产生式构造算符优先关系表,有了算符优先关系表并满足算符优先文法时,我们就可以对任意给定的符号串进行归约分析,进而判定输入串是否为该文法的句子。然而用算符优先分析法的归约过程与规范归约是不同的。例:表达式文法:(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对i+i#的规范规约和算符优先规约见P115表6.7和表6.8 注意在算符优先分析过程中,因去掉了单非终结符之间的归约,非终结符的名字没有任何意义。所以在归约过程中所有的非终结符都用同一个名字。
算符优先文法句型的性质 算符文法的任何一个句型应为如下形式: #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 算符优先分析过程归约时,只能把 和 之间的符号串作为可归约串进行归约。
算符优先分析句型有如下性质: 如果aNb(或ab)出现在句型r中,则a和b之间有且只有一种 优先关系,即: 若a b则在r中必含有b而不含a的短语存在。 若a b则在r中必含有a而不含b的短语存在。 若a b则在r中含有a的短语必含有b,反之亦然。
由于算符优先分析法去掉了单非终结符之间的归约,尽管在分析过程中,当决定是否为句柄时采取一些检查措施,但仍难完全避免把错误的句子得到正确的归约。由于算符优先分析法去掉了单非终结符之间的归约,尽管在分析过程中,当决定是否为句柄时采取一些检查措施,但仍难完全避免把错误的句子得到正确的归约。 例如,下述文法是一个算符优先文法,其产生式为:S→S;D|DD→D(T)|HH→a|(S)T→T+S|S 其中VN={S,D,T,H},VT={;,(,),a,+},S为开始符号。 对应的算符优先关系矩阵为P120表6.14。 请读者以表6.14 算符优先关系矩阵表,用算符优先分析法对输入串(a+a)#进行分析,不难发现它可以完全正确地进行归约,然而(a+a)#却不是该文法能推导出的句子。即算符优先分析可能导致把错误的句子得到正确的归约。通常一个适用语言的文法也很难满足算符优先文法的条件,因而致使算符优先分析法仅适用于表达式的语法分析。
算符优先分析法 • 简单,直观,有利于表达式分析,易于手工实现 • 比规范归约快 • 可能导致把错误的句子得到正确的归约