300 likes | 433 Views
4.5 自底向上分析 把一个输入符号串逐步归约到文法的开始符号。 这种方法的大致过程是,用一个栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的右部( 句柄) 时,把栈顶的这一部分替换成 ( 归约为 ) 它的左部符号。称作 “移进—归约”分析。 4.5.1 规范归约 句柄 4.5.2 “移进—归约”分析的 栈实现. 4.5.1 规范归约 归约
E N D
4.5 自底向上分析 把一个输入符号串逐步归约到文法的开始符号。 这种方法的大致过程是,用一个栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的右部( 句柄)时,把栈顶的这一部分替换成(归约为)它的左部符号。称作“移进—归约”分析。 4.5.1 规范归约 句柄 4.5.2“移进—归约”分析的栈实现
4.5.1 规范归约 归约 G=(VT,VN,S,P),α, β∈(VT∪VN)*,A→β∈P, αAw αβw 。归约的过程是,已知αβw和产生式A→β,用产生式A→β左部A替换αβw中的β,得到符号串αAw。 从输入符号串出发,每次从被归约的句型中找到一个产生式的右部,用其左部替换之,得到新的句型 ,直至归约到文法的开始符号。 因为从左至右读入输入符号串,自然在被归约的句型中找最左边的某个产生式的右部(句柄)进行归约。
例4.12G[S](4.12),其产生式如下: ①S→aABe ②A→b ③A→Abc ④B→d (4.12) 输入串 abbcde aAbcde aAde aABe S SaABe aAde aAbcde abbcde S S aABe A aAde B A aAbcde abbcde a b b c d e
例4.12G[S](4.12),其产生式如下: ①S→aABe ②A→b ③A→Abc ④B→d (4.12) 输入串 abbcde aAbcde aAde aABe S SaABe aAde aAbcde abbcde S S aABe A aAde B A aAbcde abbcde a b b c d e
S 已知 w,分析已识别出,产生式A 的右部,再看待输入串w的最左边符号,用A替换得到Aw; 自上而下分析是从w A,看FIRST(), w A w A w Aw w
定义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
二义性文法存在规范归约不唯一的句子。例如,文法 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中 ,句柄不唯一 。 规范归约的中心问题是:如何寻找或确定 一 个句型的句柄 。
4.5.2 “移进- 归约”分析法的栈实现 “移进一归约”分析器使用一个栈和一个存放输入符号串w的缓冲器。分析器的初始状态为: 栈 输入 $ w$ 工作过程:自左至右把串w 的符号一一移进栈里,一旦栈顶形成句柄时,就进行归约。这种归约可能持续多次,直至栈顶不再呈现句柄为止。然后,继续向栈里移进符号,重复这个过程,直至最终形成如下格局: 栈 输入 $S $
“移进-归约”分析对符号栈的使用有四类操作:移进、归约、接受和出错处理。 “移进-归约”分析对符号栈的使用有四类操作:移进、归约、接受和出错处理。 规范句型(右句型)的“活前缀”,定义如下: 定义4.4 一个规范句型的一个前缀,若不含句柄之后的任何符号,则称它为该规范句型的一个活前缀。 分析过程的每一步骤,栈里的文法符号串加上剩余输入符号串恰好是一个规范句型。而且栈里的文法符号串正好是这个句型的一个活前缀。如在表4.7(a)的前三步中可以看到,a及ab都是符号串abbcde的活前缀。 “移进-归约”分析识别规范句型的活前缀。
4.6 算符优先分析法 概述 一. 算符文法的定义 二. 算符优先分析法的基本思想 4.6.1 利用算符优先关系寻找右句型的可归 约串 4.6.2 算符优先关系表的构造 4.6.3 优先函数 总结
一. 算符文法的定义 定义4.5设G是一个文法,如果G中不存在形 如A及A→BC的产生式(其中A,B,CVN , , (VNVT)*且其中不含有相邻非终结符号),即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具有相邻的非终结 符号。
二.算符优先分析的基本思路 由于文法(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)
(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
注意: 1. 算术关系“<”,“=”和“>”与优先关系具有十分不同的性质。例如,a<·b并不一定意味着b·>a,例如:+ <·(,(<· +。 2. 决定优先关系方法: (a) 直观方法:代数规则; (b)对于一个无二义性文法,有机械方法。
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 ·> $ 句型中<·和·>之间的符号串是待归约的符号串。 .
找右句型的可归约串 的方法 $ <·id ·> + <·id ·> * <·id ·> $ 1·找可归约串 的右端; 2 ·找可归约串 的左端; 3 ·归约 使用下面的优先关系表,分析过程如下:
栈 关系 输入 动作 $ <· 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 $ 接受
算法4.5算符优先分析法 方法:if (ab) or (ab) then begin /* 移进* / 把b推入栈中; 使ip前进到下一个符号;end if a·b then /* 归约* / repeat从栈中弹出符号 until栈顶终结符号最近弹出的终结 elseerror 符号
算法中,每一个归约串中至少包含一个终结 符号,用到了一个重要的概念和结论。 定义4.5 设G是一个算符文法,β是句型 δ关于A的短语(即有S αAδ且A β ) 且β至少含有一个终结符号,并且除自身之外 不再含有任何更小的 带有终结符号的短语, 则称β是句型αβδ关于A的素短语。所谓最 左素短语是指处于句型最左边的那个素短语。 设G是一个算符文法,如果G中任何两个 终结符号之间至多有一种优先关系存在,则是 一个算符优先文法。 算符优先文法句型的最左素短语是唯一的。 * +
句柄和素短语的区别: G[E]:EE+TT E E+E E*E (E) id T T*FF F (E) id E E E + T E + E T T * F E * E id F F id id id id id
4.6.2 算符优先关系表的构造 一.直观方法:代数规则 (1)id是最基本的运算量 (2)一目运算符号减,例如, -id-id (3)是右结合。 二.形式方法(本节总结时有简单介绍)
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)可比较。 ·
表4.9对应的优先函数: 1) 构造优先函数的算法不是唯一的。 2) 存在一组优先函数,那就存在无穷组优先函数。
算法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出发的 最长路径。 .
gid fid f* g* g+ f+ f$ g$
总结: 1. 算符优先分析法能方便地构造表达式的语法分析器,分析速度也比较快; 2. 诊查错误的能力较弱,适用的范围小; 3. 形式化方法求优先关系简介 优先关系定义: 设是G不含-产生式的算符文法,a,bVT, 1) a = b A…ab... P 或 A…aQb... P .
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 F T * id id id