第 6 章 自底向上语法分析

39
6 6 第第第第第第第第 第第第第第第第第

Upload: kaoru

Post on 22-Jan-2016

83 views

Category:

Documents


0 download

DESCRIPTION

第 6 章 自底向上语法分析. 6.1 自底向上语法分析. 一、自底向上方法概述 自底向上方法:从给定终极符串进行归约,并归约成文法的初始符。. 移进 - 归约方法的四个动作 : 移进 : 输入流头符读到分析栈中 归约 : 分析栈句柄归约非终极符 接受 : 分析成功 报错 : 处理错误. 例子: 对输入串 abbcde 进行分析,检查该串是否是 G[S] 的句子。 G[S] : S→aAcBe A→b A→Ab B→d - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 6 章 自底向上语法分析

第第 66 章章自底向上语法分析自底向上语法分析

第第 66 章章自底向上语法分析自底向上语法分析

Page 2: 第 6 章 自底向上语法分析

6.1 自底向上语法分析

一、自底向上方法概述 自底向上方法:从给定终极符串进行归约,并归约成文法的初始符。 移进 -归约方法的四个动作 : 移进 :输入流头符读到分析栈中 归约 :分析栈句柄归约非终极符 接受 :分析成功 报错 :处理错误

Page 3: 第 6 章 自底向上语法分析

例子:对输入串 abbcde 进行分析,检查该串是否是 G[S] 的句子。 G[S] : S→aAcBe A→b A→Ab B→d对输入串 abbcde 的最右推导是: SaAcBeaAcdeaAbcdeabbcdeSaAcBeaAcdeaAbcdeabbcde

所以移进 -归约方法的分析过程如下:

Page 4: 第 6 章 自底向上语法分析

移进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

Page 5: 第 6 章 自底向上语法分析

例:考虑文法 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

Page 6: 第 6 章 自底向上语法分析

= 归 =>((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

Page 7: 第 6 章 自底向上语法分析

= 归 =>(T , *i) 14= 移 =>(T* , i) 15 = 移 =>(T*i , ) 16= 归 =>(T*F , ) 17 = 归 =>(T , ) 18= 归 =>(E , ) 19

Page 8: 第 6 章 自底向上语法分析

设 Si 和 Sj 是文法的任意两个符号,那么它们在句型中相邻出现的充要条件是必须满足下列条件之一:1.有形如 U→SiSj

的产生式2.有形如 U→SiW 且 W Sj

的产生式3.有形如 U→VSj

且 V Si 的产生式的产生式4.有形如 U→VW 且 V Si 和 W Sj

的产生式的产生式

+

+

+ +

6.2 简单优先方法

Page 9: 第 6 章 自底向上语法分析

定义了三种优先关系 ( , , ) 其定义如下:

• Si Sj :当且仅当存在如下的产生式U→…SiSj

… 例子: A→abABc ,其中 b与 A相邻 b A

• Si Sj :当且仅当存在如下产生式 U→…SiW… ,且有 W Sj

……) +

Page 10: 第 6 章 自底向上语法分析

例子: 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

……) + *

Page 11: 第 6 章 自底向上语法分析

优先关系可用矩阵来表示,称这种矩阵为优先关系矩阵。 具体定义如下图:

M[si,sj]

当 Si Sj

当 Si Sj

当 Si Sj

空 否则

Page 12: 第 6 章 自底向上语法分析

* STEP2 :对每个符号对 Si , Sj 填写优先关系矩阵。

构造优先关系矩阵步骤:* STEP1 :对每个非终极符号 W求下面两种集合 FIRST(W)={S|W S,S(Vn∪Vt)} LAST(W)={S|W S,S(Vn∪Vt)}

+

+

Page 13: 第 6 章 自底向上语法分析

例子:假设有文法 G[Z]: Z→bMb M→a|( L L→M a )第一步: ① Z→b M b b M ②Z→b M b

(…

a…

b ( b a

Page 14: 第 6 章 自底向上语法分析

第二步: ① Z→b M b M b ②Z→b M b

…)…L…a

) b L b a b

Page 15: 第 6 章 自底向上语法分析

)a(bLMZ

)a(bLMZ

Page 16: 第 6 章 自底向上语法分析

所以对 G[Z]: Z→bMb M→a|( L L→M a ) 有: FRIST(M)={ (,a } LAST(M)={ ),L,a } 有下表:

)) L abLAST

M ( a( abFIRSTLMZ

Page 17: 第 6 章 自底向上语法分析

定义 3.13 满足下面两个条件的文法称为简单优先文法。 1.任意两个符号至多成立一种关系 2.任意两个产生式具有不同右部 例子: G[Z]: E→E+T|T T→T*F|F F→(E)|i

E

E + T

T * F+ T + T

Page 18: 第 6 章 自底向上语法分析

下面文法均不为简单优先文法 G1:B→a D→a ( 有两个相同的右部 )

G2:E→E+T|T T→T*F|F F→(E)|i ( 其中 ( E,( E)

Page 19: 第 6 章 自底向上语法分析

定理 3.10 设 S1S2Sn 是简单优先文法

的规范句型 ,其子串 SiSi+1Sj 满足条

件 :Si-1 Si , Si Si+1 Sj ,

Sj Sj+1 ,则 SiSi+1Sj 定为句柄。

例子: ZabCDc a b C D e 则 bCD 是句柄。

Page 20: 第 6 章 自底向上语法分析

分析句子 b( a a )b( 文法 G[Z])的过程:

)a(bLMZ

)a(bLMZ

Page 21: 第 6 章 自底向上语法分析

(aa)b# #bb(aa)b# #b(aa)b# #

归约符 输入流 分析栈 关系

a)b# #b(aMa)b# #b(a

a)b# #b(M

移进项目的处理

移进项目的处理

Page 22: 第 6 章 自底向上语法分析

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

关系

Page 23: 第 6 章 自底向上语法分析

算符优先文法的定义 算符优先关系表的构造 算符优先分析算法 算符优先分析法的局限性

6.3 算符优先方法

Page 24: 第 6 章 自底向上语法分析

分析程序模型

总控程序

算符优先关系表 产生式

输入串 #

#

输出

6.3.1 直观算符优先分析法

• 自下而上分析算法 模型 ---- 移进归约• 算符优先分析不是规范归约

Page 25: 第 6 章 自底向上语法分析

如何确定算符优先关系?

人为确定:(1) i的优先级最高(1) 优先级次于i,右结合(2) *和 /优先级次之,左结合(3) +和 -优先级最低,左结合(4)括号‘(’,‘)’的优先级大于

括号外的运算符,小于括号内的运算符,内括号的优先性大于外括号

(5) #的优先性低于与其相邻的算符

文法 G[E] : E→E+E|E-E|E*E|E/E|EE|(E)|i+ - * / ( ) i #

+ > > < < < < > < >- > > < < < < > < >* > > > > < < > < >/ > > > > < < > < > > > > > < < > < >( < < < < < < = <) > > > > > > >i > > > > > > ># < < < < < < < =

算符优先关系表

Page 26: 第 6 章 自底向上语法分析

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。

Page 27: 第 6 章 自底向上语法分析

算符优先关系

在 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 > #

Page 28: 第 6 章 自底向上语法分析

在 OG 文法 G 中,若任意两个终结符间至多有一种算符优先关系存在,则称 G 为算符优先文法 (OPG) 。注意:允许 b>c, c>b;

不允许 b>c, b<c, b=c 中任两个 同时存在。b=c 不一定 c = b 。例 6.1 中:“(” = “ )”,“)” <>“ (”。 结论 : 算符优先文法是无二义的。

Page 29: 第 6 章 自底向上语法分析

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

Page 30: 第 6 章 自底向上语法分析

计算算符优先关系

例 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}

Page 31: 第 6 章 自底向上语法分析

(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), 得#=# , ( = )

Page 32: 第 6 章 自底向上语法分析

表达式文法 G’[E’] 的算符优先关表

+ * ( ) i # + > < < < > < > * > > < < > < > > > < < > < > ( < < < < = < ) > > > > > i > > > > > # < < < < < =

Page 33: 第 6 章 自底向上语法分析

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

Page 34: 第 6 章 自底向上语法分析

• 算符优先分析的可归约 串是句型的最左素短语定义 cfg (上下文无关文法) G 的句型的素短语是一个短语,它至少包含一个终结符,且除自身外不再包含其他素短语。处于句型最左边的素短语为最左素短语

文法 G[S] 短语的定义 S αAδ 且 A 则称是句型 αδ 相对于非终结符 A 的短语

*

Page 35: 第 6 章 自底向上语法分析

例:有文法 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

Page 36: 第 6 章 自底向上语法分析

句型 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 的规约

Page 37: 第 6 章 自底向上语法分析

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

Page 38: 第 6 章 自底向上语法分析

分析程序模型

总控程序

算符优先关系表 产生式

输入串 #

#

输出

Page 39: 第 6 章 自底向上语法分析

算符优先分析法

• 简单,直观,有利于表达式分析,易于手工实现

• 比规范归约快• 可能导致把错误的句子得到正确的归约