4.4 算 符 优 先 分 析 法

4.4 算 符 优 先 分 析 法

4.4.1 方法概述

所谓算符优先分析法就是依照算术表达式的四则运算过程而设计的一种语法分析方法

这种分析方法首先要规定运算符之间(确切地说是终结符之间)的优先关系和结合性质,然后借助这种关系,比较相邻运算符的优先级来确定句型的可归约串并进行归约。

下面,以表达式的文法为例,说明采用这种分析法分析符号串 id + id * id 的分析过程。

例如,文法 G [ E ]为

E → E + E | E * E | ( E ) | id

这个文法是一个二义性文法,因而对句子 id + id * id 有两种不同的规范归约,也就是在归约过程中句型的句柄不唯一。

句子 id + id * id 的两种不同的规范归约过程如下:

第一个规范归约过程           第二个规范归约过程
(1 ) id + id * id			(1 ) id + id * id
(2 ) E + id * id			(2 ) E + id * id
(3 ) E + E * id				(3 ) E + E * id
(4 ) E + E * E				(4 ) E * id
(5 ) E + E					(5 ) E * E
(6 ) E						(6 ) E

分析上述归约过程,句型 E + E * id 在第一个规范归约中 id 是它的句柄;而在第二个规范归约中 E + E 是它的句柄。此现象是由于没有定义运算符 + 和 * 的优先关系而引起的。在第一个规范归约中是假定 * 优先于 + ,所以不能立即把 E + E 归约为 E ;而在第二个规范归约中是假定 + 优先于 * ,因此必须先把 E + E 归约为 E 。可见上述归约过程中起决定作用的是相邻两个终结符号之间的优先关系。于是算符优先分析法的关键在于用合适的方法去定义任何两个可能相邻出现的终结符号 a 和 b 之间的优先关系。

任何两个相邻终结符号 a 和 b 之间的优先关系有 3 种:

a <· b	 a 的优先级低于 b
a =· b	 a 的优先级等于 b
a >· b	a 的优先级高于 b

注意,优先关系与出现的左右次序有关,这一点不同于数学中的 < , = 和 > 。例如,a <· b不一定有 b > · a 。通常表达式中运算符的优先关系有( < · + 但没有 +> ·(而是有 +< ·(。

一个文法的终结符号之间的优先关系可用一个矩阵来表示,矩阵的每一行每一列都是文法的终结符,矩阵元素是两终结符之间可能的优先关系。算符优先分析法借助优先关系矩阵(也称优先关系表,简称优先表)寻找句型的可归约串。

需要指出的是,算符优先分析法并不是对所有的文法都适合,它对文法有一定的要求,要求文法是算符优先文法,也就是说,只有当描述语言的文法是算符优先文法,才能采用算符优先分析法进行语法分析。

4.4.2 算符优先文法的定义

  1. 算符文法的定义

设有文法 G ,若 G 中没有形如 U → … VW … 的规则,其中 V 和 W 为非终结符,则称 G 为算符文法,也称 OG 文法。也就是说,在算符文法中,任何一个规则右部都不存在两个非终结符相
邻的情况,由定义可知,算符文法具有两个重要的性质(不证明,仅给出结论)。

性质 1 在算符文法中任何句型都不含两个相邻的非终结符。
性质 2 若 Ab 或 bA 出现在算符文法的句型 β 中,其中 A ∈ V N ,b ∈ V T ,则 β 中任何含 b的短语必含有 A 。
  1. 定义任意两个终结符号之间的优先关系

设 G 是一个算符文法,a 和 b 是任意两个终结符, P , Q , R 是非终结符,算符优先关系 <·,·, > ·定义如下:

(1 ) a= · b 当且仅当 G 中含有形如 P → … ab … 或 P → … aQb 的规则。

(2 ) a <· b 当且仅当 G 中含有形如 P → … aR … 的规则,且 R ⇒+ b … 或 R ⇒ + Qb …。

(3 ) a >· b 当且仅当 G 中含有形如 P → … Rb … 的规则,且 R ⇒+… a 或 R ⇒+… aQ 。

3. 算符优先文法的定义

设有一个不含 ε 规则的算符文法 G ,如果任意两个终结符号对(a , b )在 <·、 > ·和 · 3 种关系中只有一种关系成立,则称 G 是算符优先文法,也称 OPG 文法

对前述算术表达式的文法
E → E + E | E * E | ( E ) | id
由算符文法和算符优先文法的定义,我们不难证明该文法是一个算符文法,但不是算符优先文法。因为该文法的任一规则右部都不包含两个相邻的非终结符,所以该文法是算符文法。但是,由于 E → E + E 和 E ⇒+ E * E ,有+<· * ,又由于 E → E * E 和 E ⇒+ E + E有 +> · * ,即运算符 + 和 * 之间存在两种不同的优先关系,所以该表达式的文法只是算符文法而不是算符优先文法。

若算术表达式的文法为

E → E + T | T
T → T * F | F
F → ( E ) | id

显然,该算术表达式的文法是算符优先文法。

4.4.3 算符优先关系表的构造

对算符优先文法,根据优先关系的定义,可按如下方法直接构造优先关系表。

首先对文法每个非终结符 A 定义两个集合:

FIRSTVT ( A ) = { b | A ⇒+ b … 或A ⇒+ Bb …,b ∈ V T , B ∈ V N }

LASTVT ( A ) = { a | A ⇒+… a 或 A ⇒+… aB ,a ∈ V T , B ∈ V N }

使用这两个集合,构造文法 G 的优先关系表的算法如下。

输入:算符优先文法 G 。

输出:关于文法 G 的优先关系表。

方法:

(1 )为每个非终结符 A 计算 FIRSTVT ( A )和 LASTVT ( A )。

(2 )执行程序

for (每个产生式 A → x 1 x 2 … x n )
for ( i =1 ; i <= n -1 ; i ++ )
{ if (
x i ∈ V T 且 x i +1 ∈ V T )置 x i · x i +1 ;
if ( i <= n -2 且 x i ∈ V T 、 x i +2 ∈ V T ,而 x i +1 ∈ V N )置 x i · x i +2 ;
if ( x i ∈ V T , x i +1 ∈ V N )
for ( FIRSTVT ( x i +1 )中的每个 b )置 x i < · b ;
if ( x i ∈ V N , x i +1 ∈ V T )
for ( LASTVT ( x i )中的每个 a )置 a >· x
i +1 ;
}

(3 )对 FIRSTVT ( S )中的所有 b ,置 $ <· b ;对 LASTVT ( S )中的所有 a ,置 a > · $ ;置 $ · $ ( S 为文法开始符号)。

【例 4.12 】
设有表达式的文法 G [ E ]:

E → E + T | T
T → T * F | F
F → ( E ) | id

构造该文法的算符优先关系表。
首先计算每个非终结符的 FIRSTVT 和 LASTVT :在这里插入图片描述
执行算法,逐条扫描文法规则,因有 E → ( E )的规则,则有(· )。
寻找终结符在左边,非终结符在右边的符号对有

+ T 则 +<· FIRSTVT ( T )
* F 则 * <· FIRSTVT ( F )
( E 则( <· FIRSTVT ( E )

寻找非终结符在左边,终结符在右边的符号对有

E + 则 LASTVT ( E ) >·+

T * 则 LASTVT ( T ) >·*

E )则 LASTVT ( E ) >· )

最后,对 $ 有 $ · $ , $ < · FIRSTVT ( E ), LASTVT ( E ) > · $ ,从而构造出文法 G [ E ]的算符优先关系表如表 4.4 所示。

在这里插入图片描述
4.4.4 算符优先分析算法的设计

对于算符优先分析法,它虽然是一种自下而上的语法分析方法,但它并不是一种规范归约的分析方法。这是因为在算符优先文法中,仅在终结符号之间定义优先关系而未对非终结符定义优先关系,从而无法使用优先关系表去识别由单个非终结符组成的可归约串,也就是说,算符优先分析法不是用句柄来刻画可归约串,而是用最左素短语来刻画可归约串的。

  1. 最左素短语

所谓句型的素短语是指这样一种短语,它至少包含一个终结符,并且除自身之外,不再包含其他的素短语。句型最左边的素短语称为最左素短语。

例如,考虑例 4.12 中的文法 G [ E ]的句型 T + T * F + id 的素短语和最左素短语。
首先给出句型 T + T * F + id 的语法树,见图 4.5 。
在这里插入图片描述

由素短语定义可知 T * F 和 id 是素短语。 T * F 为最左素短语(注意: T 是该句型的句柄,而不是素短语)。

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值