第五章 语法分析——自下而上分析

本文深入探讨自下而上分析方法,重点介绍LR分析法,包括移进归约、规范归约、算符优先分析法以及算符优先文法。通过详细阐述句柄、最左素短语和优先函数,解析LR分析器的栈结构和动作表,揭示了LR分析在编译原理中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、移进归约

自下而上分析过程:边输入单词符号,边归约。

二、规范归约

1.短语

因为句型是由开始符号推出来的,而短语是由非终结符号推出来的。所以,短语是句型的一部份或全部符号串。

2.直接短语

3.句柄 一个句型的最左直接短语称为该句型的句柄。

4.规范归约

定义:假定a是文法G的一个句子,我们称序列
       an, an-1,…… ,a0
   是的一个规范归约,如果此序列满足:
  (1)  an= a
  (2)  a0为文法的开始符号,即a0=S

  (3)  对任何i,0 < i <=n, ai-1是从ai经把句柄替换成为相应产生式左部符号而得到的。

规范归约是关于是一个最右推导的逆过程

由规范推导推出的句型称为规范句型。

由于规范句型由最右推导推出的句型,故该句型的句柄右边只含有终结符号

6.修剪语法树

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

⑤每棵最左简单子树的叶结点自左至右排列就组成一个句柄

三、用符号栈进行自下而上的语法分析

1.’#’的使用

2.分析过程

5.2 算符优先分析法

定义算符之间优先关系,借助这种关系来寻找“可归约串”和进行归约

二、算符优先文法及优先表构造

1.算符优先文法
(1)算符文法
一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部:
…QR…
    则我们称该文法为算符文法,也称OG文法 (Operater Grammar) 。
约定:
a、b代表任意终结符;
P、Q、R代表任意非终结符;

‘…’代表由终结符和非终结符组成的任意序列,包括空字

(2)定义终结符之间的优先关系

(3)如果一个算符文法G中的任何终结符对(a,b)至多只满足下述三关系之一:
a=.b
a>.b
a<.b

    则称G是一个算符优先文法(OPG文法)。


三、算符优先分析算法的设计

自下而上分析
移进-归约法:句柄为可归纳串

算符优先分析法:最左素短语为可归纳串

算符优先分析算法和设计

(1)句型的一般表示形式:
 #N1a1N2a2…NnanNn+1#
其中,每个ai都是终结符,Ni是可有可无的非终结符


(2)定理:
一个算符优先文法G的任何句型的最左素短语是满足如下条件的最左子串 Njaj…NiaiNi+1,
aj-1 <. aj
  aj =. aj+1,aj+1 =. aj+2,…,ai-1 =. ai
  ai >. ai+1
注意:

出现在左端或右端的非终结符一定属于这个素短语

四、优先函数

1.优先函数的定义

(1)优点:便于比较,节省空间;

(2)缺点:原来不存在优先关系的两个终结符,由于自然数相对应,变成可以比较的。要进行一些特殊的判断。

2.优先函数的构造

LR分析方法

LR分析方法

LR分析方法是一种自下而上的分析方法 
LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程 
LR分析方法是一种适用于一大类上下文无关文法的分析方法 
比较复杂,不适于用手工实现,可借助于YACC/bison实现 

有四种LR分析法:规范LR、LALR、SLR、LR(0)

根据归约过程中向前看输入符号串中字符的个数,定义不同的LR(k)分方法,通常,k=0,1


对于它的结构的几部分的说明: 
1.LR分析器栈的结构_分析栈 
(1)把历史和展望材料抽象成某些状态。分析栈用来存放这些状态。栈顶的状态都代表了整个历史和已经推测出的展望。 
(2)为了有助于明确归约手续,将已归约出的文法符号串也同时放到栈里。 
2.LR分析器栈的结构_动作表和状态转换表 
动作表: 
ACTION[s,a]: 
当状态s面临输入符号a时,应采取什么动作 
每一项ACTION[s,a]所规定的四种动作: 
<1>. 移进 
<2>. 归约 
<3>. 接受 
<4>. 报错 
状态转换表: 
GOTO[s,X]: 
状态s面对文法符号X时,下一状态是什么

<1>. 移进 
把(s,a)的下一状态s’=GOTO[s,a] 和输入符号a推进栈,下一输入符号变成现行输入符号. 
<2>. 归约 
指用某产生式A进行归约. 假若的长度为r, 归约动作是A, 去除栈顶r个项,使状态sm-r变成栈顶状态,然后把(sm-r, A)的下一状态s’=GOTO[sm-r, A]和文法符号A推进栈. 
<3>. 接受 宣布分析成功,停止分析器工作。 
<4>. 报错 发现源程序含有错误,调用出错处理程序

活前缀

活前缀:文法G的活前缀是他的规范句型的前缀,该前缀不超过句柄的右端。

活前缀特点: 
该前缀加上被分析串中未被分析的终结符,就可以构成一个规范句型 
只要输入串的已扫描部分可归约成一个活前缀,意味着扫描过的部分没有错误

活前缀与句柄间的关系 
(1)活前缀中已含有句柄的全部符号(句柄的符号即为其最右符号)。 
  这表明:此时某一产生式A→β的右部符号串β已出现在栈顶,因此相应的分析动作应当是用此产生式进行归约。 
   
(2)活前缀中含句柄的一部分符号(句柄开头的 若干符号与活前缀最右的若干个符号一致)。 
  这表明形如A→β1β2的产生式的右部子串β1已出现在栈顶,正期待着从余留输入串中看到能由β2推出的符号串。 
   
(3)活前缀中全然不包含句柄的任何符号 。 
  第三种情况则意味着,期望从余留输入串中能看到由某一产生式A→α右部,即A所推出的符号串。

LR分析表的构造需要构造识别活前缀的有限自动机, 
用有限自动机中的状态表示分析表中的状态, 
用状态图中的状态之间的转换关系对分析表中的action goto函数等进行定义。

关于识别活前缀的有限自动机课件的例题看理解

LR(0)分析表相当于识别活前缀的有限自动机DFA的状态转换矩阵。 
LR(0)分析表的构造算法。 

活前缀:文法G的活前缀是他的规范句型的前缀,该前缀不超过句柄的右端。
活前缀特点: 
该前缀加上被分析串中未被分析的终结符,就可以构成一个规范句型 
只要输入串的已扫描部分可归约成一个活前缀,意味着扫描过的部分没有错误

活前缀与句柄间的关系 
(1)活前缀中已含有句柄的全部符号(句柄的符号即为其最右符号)。 
  这表明:此时某一产生式A→β的右部符号串β已出现在栈顶,因此相应的分析动作应当是用此产生式进行归约。 
   
(2)活前缀中含句柄的一部分符号(句柄开头的 若干符号与活前缀最右的若干个符号一致)。 
  这表明形如A→β1β2的产生式的右部子串β1已出现在栈顶,正期待着从余留输入串中看到能由β2推出的符号串。 
   
(3)活前缀中全然不包含句柄的任何符号 。 
  第三种情况则意味着,期望从余留输入串中能看到由某一产生式A→α右部,即A所推出的符号串。

LR分析表的构造需要构造识别活前缀的有限自动机, 
用有限自动机中的状态表示分析表中的状态, 
用状态图中的状态之间的转换关系对分析表中的action goto函数等进行定义。

关于识别活前缀的有限自动机课件的例题看理解

LR(0)分析表相当于识别活前缀的有限自动机DFA的状态转换矩阵。 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值