1 / 30

4.5 自底向上分析

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

louise
Download Presentation

4.5 自底向上分析

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

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

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

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

  6. 定义4.3假定是文法G的一个句子。称右句型序列 n , n-1,…, 1, 0是的一个规范归约,如果序列满足 1. n= , 0=S; 2.i(0 ≤ i < n),   i i+1 规范归约是关于的一个最右推导的逆过程。 如果文法G是无二义的,那么,规范推导(最右推导)的逆过程必是规范归约(最左归约)。 βw 表示一个规范句型, 是在β归约之前进行的规范归约得到的结果, (VTVN)* , w  VT*。句柄的“最左”特征使得在移进-归约方法中,它处于符号栈的栈顶。  rm

  7. 二义性文法存在规范归约不唯一的句子。例如,文法  G[E]: E→E+E  E*E (E)  id 句子id+id*id有二个不同的最右推导 : EE+E EE*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中 ,句柄不唯一 。 规范归约的中心问题是:如何寻找或确定 一 个句型的句柄 。

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

  9. G[s]: SaAcBe A bAb B d

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

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

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

  13.     二.算符优先分析的基本思路 由于文法(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)

  14. (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 

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

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

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

  18. 栈 关系 输入 动作 $ <· 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 $ 接受

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

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

  21. 句柄和素短语的区别: G[E]:EE+TT E E+E E*E (E) id T T*FF F (E) id E E E + T E + E T T * F E * E id F F id id id id id

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

  23. 表4.9 优先关系表

  24. 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)可比较。 ·

  25. 表4.9对应的优先函数: 1) 构造优先函数的算法不是唯一的。 2) 存在一组优先函数,那就存在无穷组优先函数。

  26. 算法4.5 从优先关系构造优先函数 方法:1.aVT{$},建立两个符号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出发的 最长路径。 .

  27. gid fid f* g* g+ f+ f$ g$

  28. 总结: 1. 算符优先分析法能方便地构造表达式的语法分析器,分析速度也比较快; 2. 诊查错误的能力较弱,适用的范围小; 3. 形式化方法求优先关系简介 优先关系定义: 设是G不含-产生式的算符文法,a,bVT, 1) a = b  A…ab... P 或 A…aQb... P .

  29. 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]: EE+TT T T*FF F (E) id + < FIRSTVT(T) LASTVT(T) >* E E + T F T * id id id

  30. 作业:4.14 4.15 4.16(b)

More Related