自底向上分析解读
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
id id + * $ < < <
+ <
* < <
$
gid f* g+
fid g* f+
id f g 4 5
+ 2 1
* 4 3
$ 0 0
f$
g$
找右句型的可归约串 的方法 $ <· id · > + <· id · > * <· id · >$ 1· 找可归约串 的右端; 2· 找可归约串 的左端; 3· 归约 使用下面的优先关系表,分析过程如下:
id · · · + · · · · * · · · · $ ·Biblioteka Baidu · ·
-id-id
(3)是右结合。 二.形式方法(本节总结时有简单介绍)
表4.9
优先关系表
+ * / id ( ) $
+
*
/
例4.12 G[S](4.12),其产生式如下: ①S→aABe ②A→b ③A→Abc ④ B→d (4.12) 输入串 abbcde aAbcde aAde aABe S SaABe aAde aAbcde S S abbcde aABe A aAde B A aAbcde abbcde a b b c d e
(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
id + * $
栈 $ $ id
关系 <· · >
输入 id+id*id$ +id*id$
动作 移进 归约
$E
$ E+ $ E+id $ E+E $ E+E *
<·
<· ·> <· <·
+id*id$
id*id$ *id$ *id$ id$
移进
移进 归约 移进 移进
$ E+E * id
$ E+E * E $ E+E $E
S
A
已知 w,分析已 识别出,产生式A 的右部,再看待输 入串w的最左边符号, 用A替换得到Aw; 自上而下分析是从 w A,看FIRST(), w A w
Aw w
w
定义4.3 假定是文法G的一个句子。称右句 型序列 n , n-1,…, 1, 0 是 的一个规范归 约,如果序列满足 1. n= , 0=S; 2.i(0 ≤ i < n), i rm i+1 规范归约是关于的一个最右推导的逆过程。 如果文法G是无二义的,那么,规范推导(最右 推导)的逆过程必是规范归约(最左归约)。 βw 表示一个规范句型, 是在β归约之前进 行的规范归约得到的结果, (VTVN)* , w VT*。句柄的“最左”特征使得在移进-归 约方法中,它处于符号栈的栈顶。
id
(
)
$
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. 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)
二义性文法存在规范归约不唯一的句子。 例如,文法 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 自底向上分析 把一个输入符号串逐步归约到文法的开始符 号。 这种方法的大致过程是,用一个栈,把输 入符号一个一个地移进到栈里,当栈顶形成某 个产生式的右部( 句柄)时,把栈顶的这一部 分替换成(归约为)它的左部符号。称作“移 进—归约”分析。 4.5.1 规范归约 句柄
4.5.2 “移进—归约”分析的栈实现
句柄和素短语的区别: G[E]:EE+TT E E+E E*E (E) id T T*FF F (E) id
E E T F + T F T * F id E E + E
id
E
id
*
E
id
id
id
4.6.2 算符优先关系表的构造
一.直观方法:代数规则
(1)id是最基本的运算量
(2)一目运算符号减,例如,
4.5.2 “移进- 归约”分析法的栈实现
“移进一归约”分析器使用一个栈和一个 存放输入符号串w的缓冲器。分析器的初始状 态为: 栈 输入 $ w$ 工作过程:自左至右把串w 的符号一一移 进栈里,一旦栈顶形成句柄时,就进行归约。 这种归约可能持续多次,直至栈顶不再呈现句 柄为止。然后,继续向栈里移进符号,重复这 个过程,直至最终形成如下格局: 栈 输入 $S $
算法中,每一个归约串中至少包含一个终结 符号,用到了一个重要的概念和结论。 定义4.5 设G是一个算符文法,β是句型 + * δ关于A的短语(即有S αAδ且A β ) 且β至少含有一个终结符号,并且除自身之外 不再含有任何更小的 带有终结符号的短语, 则称β是句型αβδ关于A的素短语。所谓最 左素短语是指处于句型最左边的那个素短语。 设G是一个算符文法,如果G中任何两个 终结符号之间至多有一种优先关系存在,则是 一个算符优先文法。 算符优先文法句型的最左素短语是唯一的。
表4.9对应的优先函数:
+ f g 2 1
2 1
* 4 3
/ 4 3
4 5
( 0 5
) 6 0
id 6 5
$ 0 0
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出发的 最长路径。
注意:
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 · >$ 句型中<· 和· >之间的符号串是待归约的符号串。
“移进-归约”分析对符号栈的使用有四类 操作:移进、归约、接受和出错处理。 规范句型(右句型)的“活前缀”,定义如下: 定义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 , , (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具有相邻的非终结 符号。
G[s]: SaAcBe
步骤 (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) 栈 $ $a $ab $aA $aAb $aA $aAc $aAcd $aAcB $aAcBe $S
A bAb
B d
输入 动作 abbcde $ 移进 bbcde$ 移进 bcde$ 归约,Ab bcde$ 移进 cde$ 归约,AAb cde$ 移进 de$ 移进 e$ 归约,Bd e$ 移进 $ 归约,SaAcBe $ 接受
4.5.1 规范归约 归约 G=(VT,VN,S,P),α, β ∈(VT∪VN)*,A→β∈P, αAw αβw 。归约的过程是,已知αβw和产生 式A→β,用产生式A→β左部A替换αβw中的β, 得到符号串αAw。 从输入符号串出发 ,每次 从被归约的句型中找到一个产生式的右部 , 用其左部替换之,得到新的句型 ,直至归约到 文法的开始符号。 因为从左至右读入输入符号串,自然在被 归约的句型中找最左边的某个产生式的右部 (句柄)进行归约。
·>
·> ·>
$
$ $ $
归约
归约 归约 接受
算法4.5 算符优先分析法 方法: b) then if (ab) or (a begin /* 移进* / 把b推入栈中; 使ip前进到下一个符 号; end if a· b then /* 归约* / repeat 从栈中弹出符号 until 栈顶终结符号最近弹出的终结 else error 符号
例4.12 G[S](4.12),其产生式如下: ①S→aABe ②A→b ③A→Abc ④ B→d (4.12) 输入串 abbcde aAbcde aAde aABe S SaABe aAde aAbcde S S abbcde aABe A aAde B A aAbcde abbcde a b b c d e