4.5 自底向上分析

30
4.5 自自自自自自 自自自自自自自自自自自自自自自自自自自 自自自自 一。 自自自自自自 自自 自自自 自自自自自自 自自 自自自自自自自自 自自 ,一,一一, 自自自自自自自自自自自 自自 自自 自自自自自自 自自自自自 ),一 ( 自自 自 ) 自自自自自自 自自“自自—自自”自自 4.5.1 自自自自 自自 4.5.2 “ 自自—自自”自自自自自自

description

4.5 自底向上分析 把一个输入符号串逐步归约到文法的开始符号。 这种方法的大致过程是,用一个栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的右部( 句柄) 时,把栈顶的这一部分替换成 ( 归约为 ) 它的左部符号。称作 “移进—归约”分析。 4.5.1 规范归约 句柄 4.5.2 “移进—归约”分析的 栈实现. 4.5.1 规范归约 归约 - PowerPoint PPT Presentation

Transcript of 4.5 自底向上分析

Page 1: 4.5 自底向上分析

4.5 自底向上分析 把一个输入符号串逐步归约到文法的开始符号。 这种方法的大致过程是,用一个栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的右部( 句柄)时,把栈顶的这一部分替换成 ( 归约为 ) 它的左部符号。称作“移进—归约”分析。 4.5.1 规范归约 句柄4.5.2 “ 移进—归约”分析的栈实现

Page 2: 4.5 自底向上分析

4.5.1 规范归约 归约 G=(VT,VN,S,P),α, β ∈(VT∪VN)*,A→β∈P,

αAw αβw 。归约的过程是,已知 αβw 和产生式 A→β ,用产生式 A→β 左部 A 替换 αβw中的 β ,得到符号串 αAw  。 从输入符号串出发 ,每次从被归约的句型中找到一个产生式的右部 ,用其左部替换之,得到新的句型 ,直至归约到文法的开始符号。 因为从左至右读入输入符号串,自然在被归约的句型中找最左边的某个产生式的右部(句柄)进行归约。

Page 3: 4.5 自底向上分析

例 4.12 G[S](4.12), 其产生式如下: ① S→aABe ②A→b     ③A→Abc   ④B→d  (4.12) 输入串 abbcde aAbcde aAde aABe S              SaABe aAde aAbcde abbcde

a b b c d e abbcde

A aAbcde

AaAde

B

S

aABeS

Page 4: 4.5 自底向上分析

例 4.12 G[S](4.12), 其产生式如下: ① S→aABe ②A→b     ③A→Abc   ④B→d  (4.12) 输入串 abbcde aAbcde aAde aABe S              SaABe aAde aAbcde abbcde

a b b c d e abbcde

A aAbcde

AaAde

B

S

aABeS

Page 5: 4.5 自底向上分析

S

A

w

Aw w

已知 w ,分析已识别出,产生式 A 的右部,再看待输入串 w 的最左边符号,用 A 替换得到 Aw; 自上而下分析是从 w A ,看FIRST(), w A w

Page 6: 4.5 自底向上分析

定义 4.3 假定是文法 G 的一个句子。称右句型序列 n , n-1,…, 1, 0 是 的一个规范归约,如果序列满足 1. n= , 0=S ;     2.i(0 ≤ i < n    ), i i+1 规范归约是关于的一个最右推导的逆过程。如果文法 G 是无二义的,那么,规范推导 ( 最右推导 ) 的逆过程必是规范归约 ( 最左归约 ) 。 βw 表示一个规范句型 , 是在 β 归约之前进行的规范归约得到的结果 , (VTVN)* ,w VT

* 。句柄的“最左”特征使得在移进 -归约方法中,它处于符号栈的栈顶。

rm

Page 7: 4.5 自底向上分析

二义性文法存在规范归约不唯一的句子。例如,文法 G[E]:

  E→E+ E E*E (E) id 句子 id+ id*id 有二个不同的最右推导 :      EE+E   EE*E E+ E*E E *id          E+ E*id3 E+E*id         E+id2*id3 E+id*id         id1+id2*id3 id1+id2*id3 句型 E+ E*id3 中 ,句柄不唯一 。 规范归约的中心问题是:如何寻找或确定 一 个句型的句柄 。

Page 8: 4.5 自底向上分析

4.5.2 “ 移进 - 归约”分析法的栈实现 “ 移进一归约”分析器使用一个栈和一个存放输入符号串 w 的缓冲器。分析器的初始状态为 : 栈 输入 $ w $     工作过程:自左至右把串 w 的符号一一移进栈里,一旦栈顶形成句柄时,就进行归约。这种归约可能持续多次,直至栈顶不再呈现句柄为止。然后,继续向栈里移进符号,重复这个过程,直至最终形成如下格局: 栈 输入 $ S         $

   

Page 9: 4.5 自底向上分析

G[s]: SaAcBe A bAb B d

步骤 栈 输入 动作(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 $ 接受

Page 10: 4.5 自底向上分析

“ 移进 - 归约”分析对符号栈的使用有四类操作:移进、归约、接受和出错处理。规范句型 ( 右句型 ) 的“活前缀” , 定义如下 :定义 4 . 4 一个规范句型的一个前缀,若不含句柄之后的任何符号 ,则称它为该规范句型的一个活前缀。 分析过程的每一步骤,栈里的文法符号串加上剩余输入符号串恰好是一个规范句型。而且栈里的文法符号串正好是这个句型的一个活前缀。如在表 4.7(a) 的前三步中可以看到, a及 ab 都是符号串 abbcde 的活前缀。 “移进 - 归约”分析识别规范句型的活前缀。

Page 11: 4.5 自底向上分析

4.6 算符优先分析法 概述 一 . 算符文法的定义 二 . 算符优先分析法的基本思想4.6.1 利用算符优先关系寻找右句型的可归 约串4.6.2 算符优先关系表的构造4.6.3 优先函数总结

Page 12: 4.5 自底向上分析

一 . 算符文法的定义 定义 4.5 设 G 是一个文法 , 如果 G 中不存在形如 A及 A→BC 的产生式 ( 其中A,B,CVN ,, (VN VT)* 且其中不含有相邻非终结符号) ,即 G 中没有右部为或右部具有相邻非终结符号的产生式 , 则称 G 为算符文法。 G[E]: E→E+ E|E-E|E*E|E/E|EE|(E)|-E|id        是算符文法。 (4.13)      E→EAE|(E)|-E|id      A→+ |- |*|/| 不是算符文法。因右部 EAE 具有相邻的非终结符号。

Page 13: 4.5 自底向上分析

二 . 算符优先分析的基本思路 由于文法 (4. 13) 是一个二义文法,它的句子往往有不同的规范推导,按传统的习惯规定优先级从高到低为:乘幂运算符,乘、除运算符,加、减运算符;同级运算符服从左结合原则;有括号时,先括号内后括号外。 文法的句子 id+ id- id*(id+ id) 的归约过程为: (1)id+ id- id*〔 id+ id )     (2) E+ id- id*(id+ id )     (3) E+ E- id*(id+ id )     (4) E- id*(id+ id )     (5) E-E*(id+ id)     (6) E-E*(E+ id)

Page 14: 4.5 自底向上分析

(7) E-E*(E+ E)      (8) E- E*(E)     (9) E- E* E (10) E- E  (11) E

  这个归约过程是唯一的 。上述归约过程中起决定作用的是相邻两个终结符号之间的优先关系 。一旦确定了这种优先关系,就可以借助这种关系去寻找可归约串并进行归约。 终结符号 a与 b之间的优先关系有三种: a b 表示 a 的优先级低于 b     a b 表示 a 的优先级等于 b     a b 表示 a 的优先级大于 b

Page 15: 4.5 自底向上分析

注意: 1. 算术关系“ <”,“=” 和“ >”与优先关系具有十分不同的性质。例如, a< ·b 并不一定意味着 b·>a ,例如: + <· (,( <· + 。 2. 决定优先关系方法: ( a ) 直观方法:代数规则; ( b )对于一个无二义性文法,有机械方法。

Page 16: 4.5 自底向上分析

4.6.1 利用算符优先关系寻找右句型的可归约串 算符文法右句型的形式为(可以证明) β0a1β1a2β2…anβn 其中,  βiVN{}, an VT 。假设在 ai和ai+1 之间三个关系 <·,=, ·> 中至多有一个成立。进而,$作为每一个右句型符号串的左右分界符,算符文法右句型的形式为: $ β0a1β1a2β2…anβn $并规定, ai, $ <· ai, ai ·> $。 在句型中加入优先关系,例如: id+id*id $ <·id ·> + <·id ·> * <·id ·> $句型中 <· 和 ·> 之间的符号串是待归约的符号串。

.

Page 17: 4.5 自底向上分析

找右句型的可归约串 的方法 $ <·id ·> + <·id ·> * <·id ·> $ 1· 找可归约串 的右端; 2 · 找可归约串 的左端; 3 · 归约 使用下面的优先关系表,分析过程如下:

id + * $id · · ·+ · · · ·* · · · ·$ · · ·

Page 18: 4.5 自底向上分析

栈 关系 输入 动作$ <· id+id*id$ 移进 $ id ·> +id*id$ 归约 $ E < · +id*id$ 移进$ E+ < · id*id$ 移进$ E+id · > *id$ 归约$ E+E < · *id$ 移进$ E+E * < · id$ 移进$ E+E * id · > $ 归约$ E+E * E · > $ 归约$ E+E · > $ 归约$ E $ 接受

Page 19: 4.5 自底向上分析

算法 4 . 5 算符优先分析法 方法:       if (ab) or (ab) then begin /* 移进 * /                 把 b 推入栈中;               使 ip前进到下一个符号;                         end if a·b then /* 归约 * /          repeat              从栈中弹出符号            until  栈顶终结符号最近弹出的终结    else error 符号

Page 20: 4.5 自底向上分析

算法中,每一个归约串中至少包含一个终结符号,用到了一个重要的概念和结论。 定义 4 . 5 设 G 是一个算符文法, β 是句型δ 关于 A 的短语 (即有 S αAδ且 A β )且 β 至少含有一个终结符号,并且除自身之外不再含有任何更小的 带有终结符号的短语,则称 β 是句型 αβδ 关于 A 的素短语。所谓最左素短语是指处于句型最左边的那个素短语。 设 G 是一个算符文法,如果 G 中任何两个终结符号之间至多有一种优先关系存在,则是一个算符优先文法。 算符优先文法句型的最左素短语是唯一的。

* +

Page 21: 4.5 自底向上分析

句柄和素短语的区别:G[E]:EE+TT E E+E E*E (E) id T T*FF F (E) id

E

E + T

* FT

F id

id

T

F

id

E

E + E

*E E

id id

id

Page 22: 4.5 自底向上分析

4.6.2 算符优先关系表的构造 一 . 直观方法:代数规则 ( 1) id 是最基本的运算量 ( 2 )一目运算符号减,例如, -id-id ( 3)是右结合。 二 . 形式方法 ( 本节总结时有简单介绍)

Page 23: 4.5 自底向上分析

+ - * / id ( ) $+ - * / id ( ) $

表 4.9 优先关系表

Page 24: 4.5 自底向上分析

4.6.3 优先函数 为了节约存储空间和便于执行比较运算 ,用两个优先函数 f和 g ,它们是从终结符号映射到整数的函数。对于终结符号 a和 b 选择 f和 g, 使之满足: 1.当 a< ·b时 , f(a)< g(b);     2. 当 a = b 时 , f(a)= g(b);    3. 当 a ·> b时 , f(a) > g(b)。   于是 a和 b之间的优先关系可以由比较f(a) 与 g(b) 的大小来决定。 损失 : 错误检测能力降低,例如, id ·>id 不存在 , f(id) >g(id) 可比较。

·

Page 25: 4.5 自底向上分析

表 4.9 对应的优先函数:+ - * / ( ) id $

f 2 2 4 4 4 0 6 6 0g 1 1 3 3 5 5 0 5 0

1) 构造优先函数的算法不是唯一的。2 ) 存在一组优先函数,那就存在无穷组优先函数。

Page 26: 4.5 自底向上分析

算法 4.5 从优先关系构造优先函数方法: 1.aVT{$},建立两个符号 fa和ga;

2. 若 a = b, 则把 fa和 gb 分在一组; 3 . a, b VT,

若 a b ,则从 fa至 gb画一条弧; 若 a b ,则从 gb至 fa画一条弧 ;

4 . 若图中无环,则存在优先函数, f(a)和 g(b)等于从 fa 和 gb 出发的 最长路径。

.

Page 27: 4.5 自底向上分析

id + * $id + < <

* <

$ < < <

gid fid

f* g*

g+ f+

f$ g$

id + * $f 4 2 4 0g 5 1 3 0

Page 28: 4.5 自底向上分析

总结: 1. 算符优先分析法能方便地构造表达式的语法分析器,分析速度也比较快; 2. 诊查错误的能力较弱,适用的范围小; 3. 形式化方法求优先关系简介优先关系定义: 设是 G 不含 - 产生式的算符文法, a,bVT,

1) a = b A…ab... P 或 A…aQb... P

.

Page 29: 4.5 自底向上分析

2) a < b A…aR... P 且 (R b… 或 R Qb… ) 3) a >b A…Rb... P 且 (R …a 或 R …aQ ) a < FIRSTVT(R); LASTVT(R) >b

+

+

+

+

G[E]: EE+TT T T*FF F (E) id + < FIRSTVT(T) LASTVT(T) >*

E

E + T

*T F

idid

id

Page 30: 4.5 自底向上分析

作业: 4.14 4.15 4.16(b)