第六章 自底向上的优先分析法
DESCRIPTION
第六章 自底向上的优先分析法. 6.1 自底向上分析概述 自底向上分析法 ( 或自下而上分析 ) ,也称移进 - 归约分析法。. 它的实现思想是对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄时, ( 该句柄对应某产生式的右部 ) ,就用该产生式的左部非终结符代替相应右部的文法符号串,这称为一步归约。重复这一过程直到归约到栈中只剩文法的开始符号时则为分析成功,. 例 (P102). - PowerPoint PPT PresentationTRANSCRIPT
1
第六章 自底向上的优先分析法
2
它的实现思想是对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄时, (该句柄对应某产生式的右部 ),就用该产生式的左部非终结符代替相应右部的文法符号串,这称为一步归约。重复这一过程直到归约到栈中只剩文法的开始符号时则为分析成功,
6.1 自底向上分析概述 自底向上分析法 (或自下而上分析 ),也称移进 -归约分析法。
3
例 (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 。
4
自底向上构造语法树的过程
推倒的逆过程为: S aAcBe aAcde aAbcde abbcde
5
在上述移进 -归约或自底向上构造语法树的过程中,我们怎么知道何时移进,何时归约,不能只简单地看成栈顶出现某一产生式的右部就可用相应产生式归约,例如在表 6.1 分析到第 5)步时栈中的符号串是 #aAb ,栈顶符号串 b和 Ab 分别是产生式 (2) , (3) 的右部,这时到底用 (2) 归约还是用(3) 归约是自底向上分析要解决的关键问题。
由于移进 -归约是规范推导 (最右推导 )的逆过程,即规范归约 (最左归约 )。只有当句柄出现在栈顶符号串中时,则可用句柄归约,这样一直归约到输入串只剩结束符,文法符号栈中只剩开始符号。这时才能认为输入符号串是文法的句子。否则为出错。 由此可见自底向上分析的关键问题是在分析过程中如何确定句柄,也就是说如何知道何时在栈顶符号串中已形成某句型的句柄,那么就可以确定何时可以进行归约。
6
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 ;
7
(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)
8
6.3 算符优先分析法
算符优先分析的基本思想是只规定算符 (广义为终结符 )之间的优先关系,也就是只考虑终结符之间的优先关系,不考虑非终结符之间的优先关系。
9
如何确定算符优先关系?
人为确定:(1) i的优先级最高(1) 优先级次于i,右结合(2) *和 /优先级次之,左结合(3) +和 -优先级最低,左结合(4)括号‘(’,‘)’的优先级大于
括号外的运算符,小于括号内的运算符,内括号的优先性大于外括号
(5) #的优先性低于与其相邻的算符
+ - * / ( ) i #+ > > < < < < > < >- > > < < < < > < >* > > > > < < > < >/ > > > > < < > < > > > > > < < > < >( < < < < < < = <) > > > > > > >i > > > > > > ># < < < < < < < =
算符优先关系表
10
例如 :若有文法 G为: (1) E→E+E (2) E→E*E (3) E→i 对输入串 i+i*i 的归约过程可表示为表 6.3 。
步骤 栈 当前输入字符 剩余输入串 动作1 # i +i*i# #<i 移进2 #i + i*i# i>+ 归约3 # E + i*i# #<+ 移进4 #E+ i *i# +<i 移进5 #E+i * i# i>* 归约6 #E+E * i# +<* 移进7 #E+E* i # *<i 移进8 #E+E*i # i># 归约9 #E+E*E # *># 归约10 #E+E # +># 归约11 #E # 接受
11
算符优先文法的定义 定义:如果不含空产生式的上下文无关文法 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
12
证明:性质 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。证毕。
13
证明:性质 2 用反证法。 因为由算符文法的性质 1知可有: S γ=αbAβ 若存在 B αb ,这时 b和 A不同时归约,则必有 S BAβ, 这样在句型 BAβ中存在相邻的非终结符 B和 A,所以与性质 1矛 盾,证毕。注意:含 b 的短语必含 A ,含 A 的短语不一定含 b 。
14
算符优先关系的定义:在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 > #
15
在 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 结论 : 算符优先文法是无二义的。
算符优先文法的定义:
可见它不是算符优先文法
*>+ *<+
16
算符优先关系表的构造首先定义如下两个集合: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
17
如何求 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)
18
计算算符优先关系
例文法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
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}
19
(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
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)
1)‘=’关系由产生式 (0)和 (6),得#=#, ( = )
20
表达式文法G’[E’]的算符优先关表
+ * ( ) i # + > < < < > < > * > > < < > < > > > < < > < > ( < < < < = < ) > > > > > i > > > > > # < < < < < =
21
算符优先分析 算符优先分析的可归约 串是句型的最左素短语定义 G 的句型的素短语是一个短语,它至少包含一个终结符,且除自身外不再包含其他素短语。
即素短语必须满足下列两个条件 :1 、至少包含一个终结符号。
2、该短语不再包含满足第一个条件的更小的语。处于句型最左边的素短语为最左素短语
22
文法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
E T+
+E T
F
* FTT i
句型 T+T*F+I的最左素短语为: T*F
E +
+ T
F
E
句型 T+T*F+i的素短语为: T*F, iE
T
T
i
句型 T+T+i的素短语是 : T+T 和 i,其中最左素短语 :T+T
23
算符优先分析算法前面介绍了如何对已给定的文法按其产生式构造算符优先关系表,有了算符优先关系表并满足算符优先文法时,我们就可以对任意给定的符号串进行归约分析,进而判定输入串是否为该文法的句子。然而用算符优先分析法的归约过程与规范归约是不同的。例:表达式文法:(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
注意在算符优先分析过程中,因去掉了单非终结符之间的归约,非终结符的名字没有任何意义。所以在归约过程中所有的非终结符都用同一个名字。
24
算符优先文法句型的性质算符文法的任何一个句型应为如下形式:# 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
算符优先分析过程归约时,只能把 和 之间的符号串作为可归约串进行归约。
25
算符优先分析句型有如下性质: 如果 aNb( 或 ab) 出现在句型 r中,则 a和 b之间有且只有一种 优先关系 ,即: 若 a b 则在 r中必含有 b而不含 a 的短语存在。 若 a b 则在 r中必含有 a而不含 b 的短语存在。 若 a b 则在 r中含有 a的短语必含有 b,反之亦然。
26
由于算符优先分析法去掉了单非终结符之间的归约,尽管在分析过程中,当决定是否为句柄时采取一些检查措施,但仍难完全避免把错误的句子得到正确的归约。
例如,下述文法是一个算符优先文法,其产生式为: S→S;D|D D→D(T)|H H→a|(S) T→T+S|S 其中 VN = {S , D, T, H}, VT = {; ,(,),a,+}, S为开始符号。对应的算符优先关系矩阵为 P120 表 6.14 。 请读者以表 6.14 算符优先关系矩阵表,用算符优先分析法对输入串 (a+a)#进行分析,不难发现它可以完全正确地进行归约,然而 (a+a)# 却不是该文法能推导出的句子。即算符优先分析可能导致把错误的句子得到正确的归约。通常一个适用语言的文法也很难满足算符优先文法的条件,因而致使算符优先分析法仅适用于表达式的语法分析。
27
算符优先分析法
简单,直观,有利于表达式分析,易于手工实现
比规范归约快 可能导致把错误的句子得到正确的归约