编译原理——第五章 自下而上分析

一.移进规约

1.基本思想

用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选式时,即把栈顶的这一部分替

换成(归约为)该产生式的左部符号。

2.规约

是指根据文法的产生式规则,把产生式的右部替换成左部符号。

二.规范规约

1)短语:
        定义:令G是一个文法,S是文法的开始符号,假定abd是文法G的一个句型其中α,β,d∈(VN∪VT)*,A∈VN ,如果有

       则b称是句型abd相对于非终结符A的短语。



2)直接短语
        特别是,如果有AÞb,则称b是句型abd相对于规则A® b的直接短语。


3)句柄
        一个句型的最左直接短语称为该句型的句柄。
          定义:假定a是文法G的一个句子,我们称序列


               an, an-1,¼ ,a0
            是a的一个规范归约,如果此序列满足:
          (1)  an= a
          (2)  a0为文法的开始符号,即a0=S
          (3)  对任何i,0 < i £ n, ai-1是从ai经把句柄替换成为相应产生式左部符号而得到的。


三.修建语法树

 (1)子树:是由该树的某个结点(子树的根)连同它的所有子孙组成。

 (2)简单子树:只有单层分支的子树(只有父子两代没有第三代)

 (3) 对语法树有如下结论

 ①每个句型都有一棵语法树与之对应
 ②每棵语法树的叶结点自左至右排列就组成一个句型
 ③每棵子树的叶结点自左至右排列就组成一个短语
 ④每棵简单子树的叶结点自左至右排列就组成一个直接短语
 ⑤每棵最左简单子树的叶结点自左至右排列就组成一个句柄

四.算法优先分析法

(1)算符文法
 一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部:
…QR…
    则我们称该文法为算符文法,也称OG文法

((1)算符文法
 一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符

2.构造算符优先关系表
(1)通过检查产生式的每一个候选式可以找出满足a=.b
  (即P→…ab…或P→…aQb…的产生式)
(2)为了满足<.和>.,需对G中每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P)

(3)构造集合FIRSTVT(P)的算法

 按其定义,可用下面两条规则来构造集合FIRSTVT(P):

 ① 若有产生式P→a…或P→Qa…,
  则aFIRSTVT(P);
 ② 若aFIRSTVT(Q),且有产生式P→Q…,
  则aFIRSTVT(P)。
(4)同理构造构造集合LASTVT(P)的算法
 按其定义,可用下面两条规则来构造集合LASTVT(P):
 ① 若有产生式P→… a或P→… aQ ,
  则a LASTVT(P);
 ② 若a LASTVT(Q),且有产生式P→… Q ,
  则a LASTVT(P)。
(5)有了这两个集合之后,就可以通过检查每个产生式的候选式确定满足关系<.和>.的所有终结符对。
五.LR分析法
1.LR分析器
LR(0)分析表的构造 项目、项目集、项目集规范族 项目集的闭包(closure) 有效项目 SLR分析表的构造
有效项目 规范LR分析表的构造 LALR(look ahead )分析表的构造 LR分析方法是一种自下而上的分析方法
LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程
LR分析方法是一种适用于一大类上下文无关文法的分析方法比较复杂,不适于用手工实现,可借助于YACC/bison实现。

2.LR文法

一个文法,如果能构造出一个所有条目都唯一的分析表。
LR(k)文法
 最多向前看K个的符号就可以决定动作的LR分析器所分析的文法成为LR(k)文法。
我们最感兴趣的是k=0,1


3.活前缀

活前缀特点:
该前缀加上被分析串中未被分析的终结符,就可以构成一个规范句型
只要输入串的已扫描部分可归约成一个活前缀,意味着扫描过的部分没有错误
活前缀与句柄间的关系
(1)活前缀中已含有句柄的全部符号(句柄的符号即为其最右符号)。
(2)活前缀中含句柄的一部分符号(句柄开头的 若干符号与活前缀最右的若干个符号一致)。
(3)活前缀中全然不包含句柄的任何符号 。
活前缀的识别与LR分析表构造
LR分析表的构造需要构造识别活前缀的有限自动机,
用有限自动机中的状态表示分析表中的状态,
用状态图中的状态之间的转换关系对分析表中的action goto函数等进行定义。
构造识别活前缀的NFA
    1、构造文法的所有产生式的项目,每个项目都为NFA的一个状态。
  2、确定初态、句柄识别态、句子识别态。
 由于S′(起始符)仅在第一产生式的左部出现 ,因此规定起始符相关的项目1为初态 
 其余每个状态都为活前缀的识别态(终态)
 圆点在最后的项目为句柄识别态 
 第一个产生式的句柄识别态为句子识别态 。


六.LR(0)项目集规范族构造

构成识别一个文法活前缀的DFA项目集(状态)的全体称为这个文法的LR(0)项目集规
NFA确定化为DFA的工作量较大,我们考虑直接构造出项目集作为DFA的状态,就可直接构造DFA。

通过闭包函数(CLOSURE)来求DFA一个状态的项目集。

七.感想

整体来讲,这一章和上一章是反着来的。规约的问题理解起来似乎更为复杂,但其结构更为合理。将输入符号存到栈中,

当顶部出现候选式时就转换为符号。题目也是难度也是稳步攀升,一章比一章复杂。

八.题目





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值