第 6 章 自底向上语法分析
DESCRIPTION
第 6 章 自底向上语法分析. 6.1 自底向上语法分析. 一、自底向上方法概述 自底向上方法:从给定终极符串进行归约,并归约成文法的初始符。. 移进 - 归约方法的四个动作 : 移进 : 输入流头符读到分析栈中 归约 : 分析栈句柄归约非终极符 接受 : 分析成功 报错 : 处理错误. 例子: 对输入串 abbcde 进行分析,检查该串是否是 G[S] 的句子。 G[S] : S→aAcBe A→b A→Ab B→d - PowerPoint PPT PresentationTRANSCRIPT
第第 66 章章自底向上语法分析自底向上语法分析
第第 66 章章自底向上语法分析自底向上语法分析
6.1 自底向上语法分析
一、自底向上方法概述 自底向上方法:从给定终极符串进行归约,并归约成文法的初始符。 移进 -归约方法的四个动作 : 移进 :输入流头符读到分析栈中 归约 :分析栈句柄归约非终极符 接受 :分析成功 报错 :处理错误
例子:对输入串 abbcde 进行分析,检查该串是否是 G[S] 的句子。 G[S] : S→aAcBe A→b A→Ab B→d对输入串 abbcde 的最右推导是: SaAcBeaAcdeaAbcdeabbcdeSaAcBeaAcdeaAbcdeabbcde
所以移进 -归约方法的分析过程如下:
移进e##aAcB9归约 (B→d)e##aAcd8移进de# #aAc7移进cde# #aA6归约(A→Ab)cde# #aAb5移进bcde# #aA4归约 (A→b)bcde# #ab3移进bbcde# #a2移进abbcde# #1Action 输入串 符号栈 步骤
归约 (S→aAcBe)##aAcBe10接受##S11
例:考虑文法 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 是文法的任意两个符号,那么它们在句型中相邻出现的充要条件是必须满足下列条件之一:1.有形如 U→SiSj
的产生式2.有形如 U→SiW 且 W Sj
的产生式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
例子: A→abABc A→ccd B→bcb ,其中 d与 b相邻 d b
• Si Sj :当且仅当存在如下产生式 U→…VW… ,且有 V Si 和 W Sj
……) + *
优先关系可用矩阵来表示,称这种矩阵为优先关系矩阵。 具体定义如下图:
M[si,sj]
当 Si Sj
当 Si Sj
当 Si Sj
空 否则
* STEP2 :对每个符号对 Si , Sj 填写优先关系矩阵。
构造优先关系矩阵步骤:* STEP1 :对每个非终极符号 W求下面两种集合 FIRST(W)={S|W S,S(Vn∪Vt)} LAST(W)={S|W S,S(Vn∪Vt)}
+
+
例子:假设有文法 G[Z]: Z→bMb M→a|( L L→M a )第一步: ① Z→b M b b M ②Z→b M b
(…
a…
b ( b a
第二步: ① Z→b M b M b ②Z→b M b
…)…L…a
) b L b a b
)a(bLMZ
)a(bLMZ
所以对 G[Z]: Z→bMb M→a|( L L→M a ) 有: FRIST(M)={ (,a } LAST(M)={ ),L,a } 有下表:
)) L abLAST
M ( a( abFIRSTLMZ
定义 3.13 满足下面两个条件的文法称为简单优先文法。 1.任意两个符号至多成立一种关系 2.任意两个产生式具有不同右部 例子: G[Z]: E→E+T|T T→T*F|F F→(E)|i
E
E + T
T * F+ T + T
下面文法均不为简单优先文法 G1:B→a D→a ( 有两个相同的右部 )
G2:E→E+T|T T→T*F|F F→(E)|i ( 其中 ( E,( E)
定理 3.10 设 S1S2Sn 是简单优先文法
的规范句型 ,其子串 SiSi+1Sj 满足条
件 :Si-1 Si , Si Si+1 Sj ,
Sj Sj+1 ,则 SiSi+1Sj 定为句柄。
例子: ZabCDc a b C D e 则 bCD 是句柄。
分析句子 b( a a )b( 文法 G[Z])的过程:
)a(bLMZ
)a(bLMZ
(aa)b# #bb(aa)b# #b(aa)b# #
归约符 输入流 分析栈 关系
a)b# #b(aMa)b# #b(a
a)b# #b(M
移进项目的处理
移进项目的处理
b##bMMb##b(LLb# #b(Ma)
)b# #b(Maa)b# #b(M
Ma)b# #b(aaa)b# #b((aa)b# #b
b(aa)b# #归约符 输入流 分析栈
Z##bMb停##Z
关系
算符优先文法的定义 算符优先关系表的构造 算符优先分析算法 算符优先分析法的局限性
6.3 算符优先方法
分析程序模型
总控程序
算符优先关系表 产生式
输入串 #
#
输出
6.3.1 直观算符优先分析法
• 自下而上分析算法 模型 ---- 移进归约• 算符优先分析不是规范归约
如何确定算符优先关系?
人为确定:(1) i的优先级最高(1) 优先级次于i,右结合(2) *和 /优先级次之,左结合(3) +和 -优先级最低,左结合(4)括号‘(’,‘)’的优先级大于
括号外的运算符,小于括号内的运算符,内括号的优先性大于外括号
(5) #的优先性低于与其相邻的算符
文法 G[E] : E→E+E|E-E|E*E|E/E|EE|(E)|i+ - * / ( ) i #
+ > > < < < < > < >- > > < < < < > < >* > > > > < < > < >/ > > > > < < > < > > > > > < < > < >( < < < < < < = <) > > > > > > >i > > > > > > ># < < < < < < < =
算符优先关系表
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
计算算符优先关系
例 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
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}
(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), 得#=# , ( = )
表达式文法 G’[E’] 的算符优先关表
+ * ( ) i # + > < < < > < > * > > < < > < > > > < < > < > ( < < < < = < ) > > > > > i > > > > > # < < < < < =
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句型 T+T*F+i其短语有:T+T*F+iT+T*FTT*Fi
E
E T+
+E T
* FTT i
最左素短语为: T*F
F
素短语为: T*F , i
句型 T+T*F+i 的语法树
E
E T+
+E T
* FTT i
句型 T+T*F+i进行算符优先分析时语法树的框架
F
N
N N+
+N N
* NN
i
省略了 E→T, E→T, E→T 的规约
F句型 T+T+F 的素短语为: T+T最左素短语是 T+T
E +
+ T
E
句型 T+T+i 的素短语为: T+T, I最左素短语为 T+T( 注: T+T 不是简单短语,但是素短语)
E
T
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
F
E +
+ T
E
E
T
T
i
分析程序模型
总控程序
算符优先关系表 产生式
输入串 #
#
输出
算符优先分析法
• 简单,直观,有利于表达式分析,易于手工实现
• 比规范归约快• 可能导致把错误的句子得到正确的归约