编译原理
DESCRIPTION
编译原理. 第一章 编译程序概述 第二章 PL/0 编译程序的实现 第三章 文法和语言 第四章 词法分析 第五章 自顶向下语法分析方法 第六章 自底向上优先分析方法 第七章 LR 分析方法 第八章 语法制导翻译和中间代码生成 第九章 符号表 第一○章 代码优化 第一一章 代码生成. 复习:第 5 章 自顶向下语法分析方法. 一、确定的自顶向下分析思想 二、 LL(1) 文法的判别 三、某些非 LL(1) 文法到 LL(1) 文法等价变换 四、不确定的自顶向下分析思想 五、确定的自顶向下分析方法. 预测分析程序 先进后出栈 - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/1.jpg)
编译原理第一章 编译程序概述第二章 PL/0 编译程序的实现第三章 文法和语言第四章 词法分析第五章 自顶向下语法分析方法第六章 自底向上优先分析方法第七章 LR 分析方法第八章 语法制导翻译和中间代码生成第九章 符号表第一○章 代码优化第一一章 代码生成
![Page 2: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/2.jpg)
复习:第 5 章自顶向下语法分析方法
一、确定的自顶向下分析思想
二、 LL(1) 文法的判别
三、某些非 LL(1) 文法到 LL(1) 文法等价变换
四、不确定的自顶向下分析思想
五、确定的自顶向下分析方法
![Page 3: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/3.jpg)
确定的自顶向下分析方法
• 当文法满足 LL(1) 文法时,可进行确定的自顶向下分析
• 递归子程序法:对应文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串。
• 预测分析方法:预测分析程序
先进后出栈
预测分析表
![Page 4: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/4.jpg)
表驱动的预测分析程序模型
![Page 5: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/5.jpg)
实现步骤:
( 1 ) 判断文法是否为 LL(1) 文法。如果文法中含有左递归,必须先消除左递归
( 2 )构造预测分析表 : Select(A )
( 3 )列出预测分析过程
![Page 6: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/6.jpg)
自底向上分析方法,也称移进归约分析法
实现思想(是推导的逆过程):
对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的可归约串时,就用该产生式的左部非终结符代替相应右部的文法符号串,称为归约。重复这一过程,直到归约到栈中只剩下文法的开始符号时,则分析成功。
关键问题
第 6 章:自底向上分析方法
![Page 7: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/7.jpg)
移进—规约分析( Shift-reduce parsing)
77
#S.R.P
#
符号栈
输入串
要点:建立符号栈,用来纪录分析的历史和现状,并根据所面临的状态,确定下一步动作是移进还是规约。
![Page 8: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/8.jpg)
8888
分析过程:把输入符号串从左向右一一地移进符号栈(一次移一个),检查栈中符号,当在栈顶的若干符号形成当前句型的可归约串时,就根据规则进行规约,将句柄从符号栈中弹出,并将相应的非终结符号压入栈内(即规则的左部符号),然后再检查栈内符号串是否形成新的可归约串,若有就再进行规约,否则移进符号。分析一直进行到读到输入串的右界符为止。最后,若栈中仅含有左界符号和识别符号,则表示分析成功,否则失败。
## S.R.PS.R.P
##符号栈符号栈
输入串输入串
![Page 9: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/9.jpg)
例 1 :文法
SaAcBe
A b
A Ab
B d
输入串 abbcde# 分析
![Page 10: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/10.jpg)
归约分析过程(移进归约):步骤 符号栈 输入符号串 动作1 # abbcde# 移进2 #a bbcde# 移进3 #ab bcde# 归约( A→b
4 #aA bcde# 移进5 #aAb cde# 归约( A→Ab)
6 #aA cde# 移进7 #aAc de# 移进8 #aAcd e# 归约( B→b )9 #aAcB e# 移进10 #aAcBe # 规约 S→aAcBe
11 #S # 接受
![Page 11: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/11.jpg)
上述的每一步规约可以构造一颗语法树:A
b
B
d
A
A
bb
S
A
bb
a c eB
d
A
问题的提出:
① 在构造语法树的过程中,何时规约?
当可归约串出现在栈顶符号串中就可以规约。
② 如何知道在栈顶符号串中已经形成可归约串?
通过自底向上分析算法中的优先关系来计算
![Page 12: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/12.jpg)
自下而上分析的关键问题:如何确定可归约串?
• 简单优先分析法:寻找句柄• 算符优先分析法:寻找最左素短语
![Page 13: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/13.jpg)
一、自底向上优先分析法概述 优先分析法又可分简单优先分析法和算符优先分析法。
① 简单优先分析法:按一定原则求出文法中所有符号(终结符和非终结符)的优先关系,按这种关系求出句柄。(规范归约——从左向右的规约);
② 算符优先分析法:只考虑算符(终结符)之间的优先关系,不考虑非终结符之间的优先关系。按这种关系求出最左素短语。(不规范归约)
简单优先分析法:准确规范,但分析效率低,实际使用价值不大;
算符优先分析法:不规范,但分析速度快,适于实际使用。
![Page 14: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/14.jpg)
句柄的定义:令 G 是一文法, S 是文法的开始符号, δ 是文法 G 的
一个句型。(为 δ 确定可归约串)如果有 SA 且 A ,则称是句型 δ 相对于非终结符 A 的短语。
若有 A ,则称是句型 δ 相对 A 的直接短语。一个句型的最左直接短语称为该句型的句柄。
• 句柄是自底向上句法分析中当前时刻需要规约的符号串。如果能够自动计算出当前的句柄,则可执行自动句法分析。
*+
![Page 15: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/15.jpg)
二、简单优先分析法
1 、优先关系的表示
x =. y 表示 X 与 Y 的优先关系相等
x > . y 表示 X 的优先性大于 Y
x <. y 表示 X 的优先性小于 Y
对任意两个文法符号 X 、 Y 按其在句型中可能会出现的相邻关系来确定优先关系:
![Page 16: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/16.jpg)
确定优先关系的规则( 1 ) X =. Y 当且仅当 G 中存在产生式
A …XY… (在语法树的同一层)
( 2 ) X <. Y 当且仅当 G 中存在产生式A …XB… ,且 B Y… ( Y 在 X 的下一层)
( 3 ) X > . Y 当且仅当 G 中存在产生式A …BD… ,且 B …X 和 D Y… ( X 在 Y 的下一层或X比 Y 先归约——规范归约 / 最左归约 )
+
+ *
![Page 17: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/17.jpg)
例:有文法 G(S): S→bAb
A→( B | a
B→Aa )
解:文法符号优先关系推导如下:
(1) 求 =. 关系 :
由 S→bAb , A→( B , B→Aa )
b =. A , A =. b , (=. B , A =. a , a =. )
![Page 18: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/18.jpg)
(2) 求 <. 关系:
由 S→bAb 且 A ( B 可得 b <.(
A a 可得 b <. a
由 A→( B 且 B ( B… 可得 (<. (
B aa… 可得 (<. a
B Aa ) 可得 (<. A
+
+
+
+
+
![Page 19: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/19.jpg)
(3) 求 > . 关系 :
由 S→bAb ,且 A…) 可得 ) > . b
A…B 可得 B > . b
A a 可得 a > . b
由 B→Aa ) ,且 A…) 可得 ) > . a
Aa 可得 a > . a
A…B 可得 B > . a
+
+
A(B(Aa) …)A(B…BAa
+
+
+
+
![Page 20: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/20.jpg)
S b A ( B a ) #
S >.
b =. <. <. >.
A =. =.( <. <. =. <.
B >. >.
a >. >. =.
) >. >.
# <. <. =.
优先关系矩阵表示法: 所有符号 >.#
寻找句柄
![Page 21: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/21.jpg)
简单优先文法的定义:( 1 )在文法符号集中,任意两个符号之间最多
只有一种优先关系;( 2 )在文法中任意两个产生式没有相同的右部。
![Page 22: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/22.jpg)
S
b A b
( B
S
b A b
a
S
b A b
( B
A a )
( B
A a )
S
b A b
( B
A a )
a
语法树结构如下:
![Page 23: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/23.jpg)
从上图可以看出:
(1) 当 b( 、 ba 出现在某一句型中,则(和 a 在句柄中, b 不在句柄中,则(和 a必须先规约。因此 b <.( ,b <.a 。
(2) 同样可以看出,当 (( , (a , (A 出现在某一句型中,右边的 ( , a , A 出现在句柄中,左边的 ( 不在句柄中。因此,左边 (<. 右边的 ( ,左边(<. a ,左边 (<. b 。
(3) 当 ab 、 aa 出现在某一句型中,左边 a在句柄中,则右边的 a 、 b 不可能在句柄中。因此有左边 a >. b ,左边 a >. a 。
![Page 24: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/24.jpg)
• 因此,可以根据文法符号之间的优先关系确定句柄。
• 在规范归约(最左归约)过程中,出现在栈顶的优先级相同的连续符号串就是句柄。
![Page 25: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/25.jpg)
首先根据已知优先文法构造优先关系矩阵,设置符号栈 S ,算法步骤如下: P105
分析器结构分析器结构 ::
##分析程序 分析程序
优先关系矩阵优先关系矩阵
##
符号栈符号栈
输入串输入串
简单优先分析法的操作步骤
![Page 26: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/26.jpg)
三、算符优先分析1) 这是一种经典的自底向上分析法,简单直观,并被广泛使 用,开始主要是对表达式的分析,现在已不限于此。可以 用于一大类上下无关的文法 .
1. 乘除的优先大于加减 2. 同优先级的运算符左大于右 3. 括号内的优先级大于括号外
于是: 4+8-6/2*3 运算过程和结果唯一。
2) 2) 称为算符优先分析是因为这种方法是仿效算术式的四则运算 而建立起来的,作算术式的四则运算时,为了保证计算结果 和过程的唯一性,规定了一个统一的四则运算法则,规定运 算符之间的优先关系。
![Page 27: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/27.jpg)
① 简单优先分析法:求出文法中所有符号(终结符和非终结符)的优先关系,按这种关系求出句柄。(规范归约——从左向右的规约);
② 算符优先分析法:只考虑算符(终结符)之间的优先关系,不考虑非终结符之间的优先关系。按这种关系求出最左素短语。(不规范归约)
算符优先关系的定义
![Page 28: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/28.jpg)
3) 算符优先分析的特点 :
仿效四则运算过程,预先规定相邻终结符之间的优 先关系,然后利用这种优先关系来确定句型的可归约串 , 并进行规约。
4)4) 分析器结构分析器结构 ::
##分析程序 分析程序
优先关系矩阵优先关系矩阵
##
符号栈符号栈
输入串输入串
![Page 29: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/29.jpg)
(2) 算符优先文法的定义
【算符文法定义】 设有一文法 G ,如果 G 中没有形如 A→…BC…的产生式,其中 B 和 C 为非终结符,则称 G 为算符文法 (或称 OG 文法 ) 。
![Page 30: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/30.jpg)
〖要点〗任何一个产生式中都不包含两个非终结符相邻的情况,就是是算符文法。 或:两个非终结符之间一定通过 1 个或多个终结符相连。
性质 1 :在算符文法中任何句型都不包含两个相邻的非终结符。
性质 2 :如果 Ab或( bA )出现在算符文法的句型中,其中 AVN . b VT, ,则中任何含 b 的短语必含有 A 。(含 b 的短语必含 A ,含 A 的短语不一定含 b )
![Page 31: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/31.jpg)
【算符优先关系的定义 】设 G 是一个算符文法, a 和 b 是任意两个终结符,A , B , C 是非终结符,算符优先关系如下:
(1)a=.b 当且仅当 G 中含有形如 A→…ab…或 A→…aBb… 的产生式 ;
(2) a <.b 当且仅当 G 中含有形如 A→…aB… 的产生式,且 Bb…或 BCb… ;
(3) a >. b 当且仅当 G 中含有形如 A→…Bb… 的产生式,且 B…a或 B…aC 。与简单优先关系区别:区分终结符与非终结符,非终结符忽略不计
+ +
+ +
![Page 32: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/32.jpg)
【算符优先文法的定义】 设有一不含产生式的算符文法 G ,如果对任意两个终结符 a , b 之间至多只有 =. , <. 和 >.三种关系的一种成立,则称 G 是一个算符优先文法 ( 也称 OPG 文法 ) 。 即 a =. b , a <.b , a >. b 只有一种成立,但允许 a <.b , b <. a同时存在。例: E→E+E | E*E | (E) | i 证明不是 OPG 文法。
![Page 33: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/33.jpg)
【算符优先文法的定义】 设有一不含产生式的算符文法 G ,如果对任意两个终结符 a , b 之间至多只有 =. , <. 和 >.三种关系的一种成立,则称 G 是一个算符优先文法 ( 也称 OPG 文法 ) 。 即 a =. b , a <.b , a >. b 只有一种成立,但允许 a <.b , b >. a同时存在。例: E→E+E | E*E | (E) | i 证明不是 OPG 文法。
因为: E→E+E , EE*E 则有 + <. *
又因为: E→E*E, EE+E 则有 + >. *
所以不是算符优先文法。
+
+
A →aB , a= + ,B= E ,
B Cb… , b=*
A →Bb , B= E , b= * ,
B … aC , a=+
![Page 34: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/34.jpg)
算符优先分析法的实现:算符优先分析法的实现:
##分析程序 分析程序
优先关系矩阵优先关系矩阵
##
符号栈符号栈
输入串输入串
当栈内终结符的优先级<=栈外的终结符的优先级时,移当栈内终结符的优先级<=栈外的终结符的优先级时,移进;栈内终结符的优先级>栈外的终结符的优先级时,归进;栈内终结符的优先级>栈外的终结符的优先级时,归约。表明找到了素短语的尾,再往前找其头,并进行规约。约。表明找到了素短语的尾,再往前找其头,并进行规约。
![Page 35: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/35.jpg)
(3) 算符优先关系表
用表格形式来表示各终结符号的优先关系,这种表称为优先表。
构造优先关系表的方法:①按照定义来构造
② 按关系图来构造 构造步骤: (根据算符优先关系的定义 ) 定义两个集合: firstVT集合 lastVT集合。
firstVT(B)={b|Bb… 或 BCb…}
lastVT(B)={a|B…a 或 B…aC}
+ +
++
![Page 36: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/36.jpg)
三种优先关系的计算: a) =. 关系:
A→…ab…
A→…aBb…
b) <. 关系:
对于每个非终结符 B 的 firstVT(B) 有形如 A→…aB… 中,对每一个 b firstVT(B)∈ 。
则 a =. b
则 a <. b
![Page 37: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/37.jpg)
c) >. 关系:
每个非终结符 B 的 lastVT(B)有形如 A→…Bb… 中,对每一个 a lastVT(B)∈
则 a >. b
例:为文法
E’→#E# T→F
E→E+T F→P↑F|P
E→T P→ ( E )
T→T*F P→i
构造算符优先关系表
![Page 38: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/38.jpg)
构造优先关系矩阵的算法构造优先关系矩阵的算法FOR 每条规则 U→x1x2…xn DO FOR i:=1 TO n-1 DO BEGIN IF xi和 xi+1均为终结符 ,THEN 置 xi=.xi+1
IF i≤n-2 ,且 xi和 xi+2都为终结符号但 xi+1为非终结符号 THEN 置 xi=.xi+2
IF xi为终结符号 xi+1为非终结符号 THEN FOR FIRSTVT(xi+1) 中的每个 b DO 置 xi<.b IF xi为非终结符号 xi+1为终结符号 THEN FOR LASTVT(xi) 中的每个 a DO 置 a>.xi+1
END
..
..
..
..
![Page 39: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/39.jpg)
构造构造 FIRSTVT(U)FIRSTVT(U) 的算法的算法
1) 若有规则 U → b… 或 U → Vb…( 存在 Ub… 或 UVb…) 则 b FIRSTVT(U)∈
++++
2) 若有规则 U → V… 且 b FIRSTVT(V), ∈ 则 b FIRSTVT(U) ∈ 说明 : 因为 Vb… 或 VWb…, 所以有 UV…b… 或 UV… Wb…
++++ ++
++
![Page 40: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/40.jpg)
设一个栈 S 和一个二维布尔数组 F F[U,b]=TRUE iff b FIRSTVT(U) ∈PROCEDURE INSERT(U,b) IF NOT F[U,b] THEN BEGIN F[U,b]:=TRUE 把 (U,b) 推进 S 栈 /* b FIRSTVT(U) */ ∈ END BEGIN {main} FOR 每个非终结符号 U 和终结符 b DO F[U,b]:=FALSE /* 赋初值 */ FOR 每个形如 U→b… 或 U→Vb… 的规则 DO INSERT(U,b)
具体方法如下具体方法如下 ::
![Page 41: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/41.jpg)
WHILE S 栈非空 DO BEIGN 把 S 栈的顶项弹出 , 记为 (V,b)/* b FIRSTVT(V)*/ ∈ FOR 每条形如 U→V… 的规则 DO INSTER(U,b); /* b FIRSTVT(U)*/ ∈ END OF WHILE END
上述算法的工作结果是得到一个二维的布尔数组上述算法的工作结果是得到一个二维的布尔数组 F,F, 从从 F F 可以得到任何非终结符号可以得到任何非终结符号 UU 的的 FIRSTVT FIRSTVT FIRSTVT(U)={b|F[U,b]=TRUE} FIRSTVT(U)={b|F[U,b]=TRUE}
![Page 42: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/42.jpg)
构造构造 LASTVT(U)LASTVT(U) 的算法的算法
1. 若有规则 U→…a 或 U→=…aV, 则 a LASTVT(U)∈
2. 若有规则 U→…V, 且 a LASTVT(V)∈ 则 a LASTVT(U)∈
设一个栈 ST, 和一个布尔数组 B PROCEDURE INSERT(U,a) IF NOT B[U,a] THEN BEGIN B[U,a]→TRUE; 把 (U,a) 推进 ST 栈 ; END;
![Page 43: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/43.jpg)
BEGIN FOR 每个非终结符号 U 和终结符号 a DO B[U,a]:=FALSE; FOR 每个形如 U→…a 或 U→…aV 的规则 DO INSERT (U,a); WHILE ST 栈非空 DO BEGIN 把 ST 栈的栈顶弹出 , 记为 (V,a); FOR 每条形如 U→…V 的规则 DO INSERT(U,a); END OF WHILE; END;
![Page 44: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/44.jpg)
解 : (1) 求 firstVT 和 lastVT集
firstVT(E’)={#}
firstVT(E)={+,*,↑, ( , i )
firstVT(T)={*,↑, ( , i )
firstVT(F)={↑, ( , i )
firstVT(P)={ ( , i )
lastVT(E’)={#}
lastVT(E)={+,*,↑, ) , i }
lastVT(T)={*,↑, ) , i }
firstVT(B)={b|Bb… 或 BCb…}
E’= #E#E’ #…
EE+TETT*F
ETFP↑FETP(E)
i
lastVT(B)={a|B…a 或 B…aC}
![Page 45: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/45.jpg)
lastVT(F)={ ) ,↑, i }
lastVT(P)={ i , ) }
(2) 求 =. 关系
E’→#E# # =. #
P→(E) (=. )
(3) 求 <. 关系
E’ → #E# 则 # <.firstVT(E)
所以 # <.+, # <.*, # <.↑, # <. ( , # <.i
![Page 46: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/46.jpg)
E’ →E+T 则 + <.firstVT(T)
所以 + <.*, + <.↑, + <. ( , + <.i
T→T*F 则 * <. firstVT(F)
所以 * <. ↑, * <. ( , * <. i
F→P↑F 则↑ <. firstVT(F)
所以 ↑ <. ↑, ↑ <. ( , ↑ <. i
P→ ( E ) 则( <. firstVT(E)
所以 (<. +, (<. *, (<. ↑, (<.( , (<. i
![Page 47: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/47.jpg)
(4) 求 >. 关系
E’ →#E# 则 lastVT(E) >. #
所以 + >. #, * >. # ,↑ >. # , ) >. #, i >. #
E→E+T 则 lastVT(E) >. +
所以 + >. +, * >. +, ↑ >. + , ) >. +, i >. +
T→T*F 则 lastVT(T) >. *
所以 * >. *, ↑ >. *, i >. *, ) >. *
F→P↑F 则 lastVT(P) >. ↑ 所以 i >. ↑, ) >. ↑
P→(E) 则 lastVT(E) >.)
所以 + >.) , * >.) , ↑ >.) , i >.) , ) >.)
![Page 48: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/48.jpg)
算符优先关系表 + * ↑ i ( ) #
+ >. <. <. <. <. >. >.
* >. >. <. <. <. >. >.
↑ >. >. <. <. <. >. >.
i >. >. >. >. >.
( <. <. <. <. <. =.
) >. >. >. >. >.
# <. <. <. <. <. =.
![Page 49: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/49.jpg)
49494949
算符优先分析法的实现:算符优先分析法的实现:详见详见 P117 P117 图图 6.86.8
##分析程序 分析程序
优先关系矩阵优先关系矩阵
##
符号栈符号栈
输入串输入串
当栈内终结符的优先级<=栈外的终结符的优先级时,移当栈内终结符的优先级<=栈外的终结符的优先级时,移进;栈内终结符的优先级>栈外的终结符的优先级时,归进;栈内终结符的优先级>栈外的终结符的优先级时,归约。表明找到了素短语的尾,再往前找其头,并进行规约。约。表明找到了素短语的尾,再往前找其头,并进行规约。
![Page 50: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/50.jpg)
实例比较• 算符优先归约 ( P115 表 6.8 ) • 规范归约( P115 表 6.8 )• 前者( 1 )去掉单非终结符的归约,( 2 )
并且在归约时不考虑非终结符的名字,因此得到的不是真正的语法树,而是语法树的框架。(比较 P116 图 6.7 与图 6.6 )
• 算符优先分析法的可归约串不是句柄而是最左素短语。
• P116 “ 算符优先分析的关键是如何找最左素短语…… ”
![Page 51: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/51.jpg)
五、最左素短语 定义:设有文法 G[S] ,其句型的素短语是一个短语,它至少包含一个终结符,并除自身外不包含其它素短语,最左边的素短语称最左素短语。
与句柄的区别:至少包含一个终结符。(从而去掉了单非终结符的归约) 例:文法 G[E]: E→E+T|T
T→T*F|F
F→P↑F|P
P→ ( E ) |i
句型 #T+T*F+i# 的语法树如下:
![Page 52: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/52.jpg)
E
E T+
E + T F
T T * F P
i
根据语法树可知:
句型 #T+T*F+i# 的短语有:
T — 相对非终结符 E 的短语
T*F — 相对非终结符 T 的短语
T+T*F — 相对非终结符 E 的短语
i — 相对非终结符 P 、 F 、 T 的短语
T+T*F+i — 相对非终结符 E 的短语
![Page 53: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/53.jpg)
根据素短语的定义可知:
i 和 T*F 为素短语。
其中: T+T*F (含其他 T*F 素短语 ) 和
T+T*F+i 不是素短语。
T*F 为最左素短语。
T 为句柄——最左直接短语
![Page 54: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/54.jpg)
定理:一个 OPG 句型的最左素短语是满足下列条件的 最左子串: aj-1Njaj…NiaiNi+1ai+1
其中 aj-1<.aj
aj=.aj+1, aj+1=. aj+2 ,…, ai-2= .ai-1, ai-1=.ai
ai>. ai+1
算符文法的任一句型形式为#N1a1N2a2…NnanNn+1#
(NiVN 或 Ni = , ai VT)
算符优先分析法的关键:如何确定当前句型的最左素短语?
![Page 55: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/55.jpg)
根据该定理 , 要找句型的最左素短语就是要找满足 上述条件的最左子串 .
算符优先分析法的实现:
详见 P117 图 6.8基本部分是找句型的最左子串(最左素短语) 并进行规约。
![Page 56: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/56.jpg)
六、优先函数:
算符优先关系表示法矩阵表示法 (空间大 )
优先函数法1 、优先函数的定义:
当 a =. b ,令 f(a)=g(b)
当 a<.b ,令 f(a)<g(b)
当 a>.b ,令 f(a)>g(b)
f(a) 、 g(b) 为优先函数,函数值用整数表示
![Page 57: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/57.jpg)
2 、优先函数的构造
构造规则
a) 对终结符 a V∈ T( 包括 # 号 ) 令 f(a)=g(a)=1( 初始化 )
b) 如果 a >. b ,而 f(a)≤g(b) ,则令 f(a)=g(b)+1
c) 如果 a <.b ,而 f(a)≥g(b) ,则令 g(b)= f(a)+1
d) 如果 a=.b ,而 f(a)≠g(b) 则令 min{f(a),g(b)}=max{f(a),g(b)}
重复 b)~d) 过程,直到收敛。若重复过程中有一个值 >2n(n 为终结符个数 ) ,则该文法不存在算符优先函数。
![Page 58: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/58.jpg)
例 1 :有优先表如下,构造优先函数。
+ * + >. <. <.
* >. >. <.
>. >. <.
【解】 (1) 赋初值
+ * f 1 1 1
g 1 1 1
![Page 59: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/59.jpg)
+ * + >. <. <.
* >. >. <.
>. >. <.
+ *
f 2 1 1
g 1 1 1
(2) 对 a>.b 关系有:
+ >.+ f(+)=g(+)+1
+ *
f 2 2 2
g 1 1 1
+ *
f 2 2 1
g 1 1 1
* >.+ * >. * >.+ >. *
![Page 60: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/60.jpg)
+ *
f 2 2 2
g 1 3 3
+ * + >. <. <.
* >. >. <.
>. >. <.
(3) 对 a <.b 关系有+ <. * g(*)= f(+)+1+ <. g()=f(+)+1
+ *
f 2 2 2
g 1 3 3
* <. <. (4) 对 a =. b没有
重复过程 (2) 、 (3)
![Page 61: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/61.jpg)
+ *
+ >. <. <.
* >. >. <.
>. >. <. + *
f 2 2 2
g 1 3 3
(2) 对 a>.b 关系+ >. +
* >.+ * >.* f(*)=g(*)+1
+ *
f 2 4 2
g 1 3 3
+ *
f 2 4 4
g 1 3 3
>. + >. * f()=g(*)+1
![Page 62: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/62.jpg)
+ *
+ >. <. <.
* >. >. <.
>. >. <.
+ *
f 2 4 4
g 1 3 3
(3) 对 a <.b 关系
+ <.* + <.
* <. <. g()=f()+1
+ *
f 2 4 4
g 1 3 5
![Page 63: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/63.jpg)
重复以上过程得: + *
f 2 4 4
g 1 3 5
+ *
f 2 4 4
g 1 3 5
所以存在优先函数为:
结果同上步,因此收敛
![Page 64: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/64.jpg)
例 2 :已知优先关系表,构造优先函数。
+ * i ( ) #
+ >. <. <. <. <. >. >.
* >. >. <. <. <. >. >.
>. >. <. <. <. >. >.
i >. >. >. >. >.
( <. <. <. <. <. ) >. >. >. >. >.
# <. <. <. <. <.
![Page 65: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/65.jpg)
构造过程(1) 初始化
+ * i ( ) #
f 1 1 1 1 1 1 1
g 1 1 1 1 1 1 1
(2) 对 a>.b 关系
+ * i ( ) #
f 2 1 1 1 1 1 1
g 1 1 1 1 1 1 1
+>.+ +>.) +>.#
![Page 66: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/66.jpg)
+ * i ( ) #
f 2 2 1 1 1 1 1
g 1 1 1 1 1 1 1
*>.+ *>.* *>.) *>.#
>.+ >.* >.) >.#
+ * i ( ) #
f 2 2 2 1 1 1 1
g 1 1 1 1 1 1 1
![Page 67: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/67.jpg)
+ * i ( ) #
f 2 2 2 2 1 1 1
g 1 1 1 1 1 1 1
i >.+ i >.* i>. i >.) i >.#
+ * i ( ) #
f 2 2 2 2 1 2 1
g 1 1 1 1 1 1 1
)>.+ ) >.* ) >. ) >.) ) >.#
![Page 68: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/68.jpg)
(3) 对 a<.b 关系+ <.* + <. + <.i + <.(
+ * i ( ) #
f 2 2 2 2 1 2 1
g 1 3 3 3 3 1 1
* <. * <.i * <.(
+ * i ( ) #
f 2 2 2 2 1 2 1
g 1 3 3 3 3 1 1
![Page 69: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/69.jpg)
<. <.i <.(
+ * i ( ) #
f 2 2 2 2 1 2 1
g 1 3 3 3 3 1 1
( <.+ ( <.* ( <. ( <.i ( <.(
+ * i ( ) #
f 2 2 2 2 1 2 1
g 2 3 3 3 3 1 1
![Page 70: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/70.jpg)
#<.+ # <.* # <. # <.i # <.(
+ * i ( ) #
f 2 2 2 2 1 2 1
g 2 3 3 3 3 1 1
(4) 对 a b 关系( ) # #
+ * i ( ) #
f 2 2 2 2 1 2 1
g 2 3 3 3 3 1 1
![Page 71: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/71.jpg)
第二次重复以上过程 (2,3,4 步)
对于 a>.b 关系 + * i ( ) #
f 3 4 4 4 1 4 1
g 2 3 3 3 3 1 1
对于 a <.b 关系 + * i ( ) #
f 3 4 4 4 1 4 1
g 2 4 5 5 5 1 1
![Page 72: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/72.jpg)
对于 a b 关系 + * i ( ) #
f 3 4 4 4 1 4 1
g 2 4 5 5 5 1 1
第三次重复以上过程
对于 a >. b 关系
+ * i ( ) #
f 3 5 5 6 1 4 1
g 2 4 5 5 5 1 1
![Page 73: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/73.jpg)
对于 a <.b 关系 + * i ( ) #
f 3 5 5 6 1 4 1
g 2 4 6 6 6 1 1
对于 a b 关系 + * i ( ) #
f 3 5 5 6 1 4 1
g 2 4 6 6 6 1 1
![Page 74: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/74.jpg)
第四次重复过程
对于 a >. b 关系 + * i ( ) #
f 3 5 5 7 1 7 1
g 2 4 6 6 6 1 1
对于 a <.b 关系 + * i ( ) #
f 3 5 5 7 1 7 1
g 2 4 6 6 6 1 1
![Page 75: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/75.jpg)
+ * i ( ) #
f 3 5 5 7 1 7 1
g 2 4 6 6 6 1 1
对于 a b 关系
第五次重复过程 + * i ( ) #
f 3 5 5 7 1 7 1
g 2 4 6 6 6 1 1
![Page 76: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/76.jpg)
第五次结果同第四次,表示收敛了。
因此优先函数为: + * i ( ) #
f 3 5 5 7 1 7 1
g 2 4 6 6 6 1 1
![Page 77: 编译原理](https://reader036.vdocuments.pub/reader036/viewer/2022062422/56813218550346895d987469/html5/thumbnails/77.jpg)
作业• P122 练习 1 、 2