编译原理作业集-第五章-修订(精选.)
第五章语法分析—自下而上分析本章要点1. 自下而上语法分析法的基本概念:2. 算符优先分析法;3. LR分析法分析过程;4. 语法分析器自动产生工具Y ACC;5. LR分析过程中的出错处理。
本章目标掌握和理解自下而上分析的基本问题、算符优先分析、LR分析法及语法分析器的自动产生工具YACC等内容。
本章重点1.自下而上语法分析的基本概念:归约、句柄、最左素短语;2.算符优先分析方法:FirstVT, LastVT集的计算,算符优先表的构造,工作原理;3.LR分析器:(1)LR(0)项目集族,LR(1)项目集簇;(2)LR(0)、SLR、LR(1)和LALR(1)分析表的构造;(3)LR分析的基本原理,分析过程;4.LR方法如何用于二义文法;本章难点1. 句柄的概念;2. 算符优先分析法;3. LR分析器基本;作业题一、单项选择题:1. LR语法分析栈中存放的状态是识别________的DFA状态。
a. 前缀;b. 可归前缀;c. 项目;d. 句柄;2. 算符优先分析法每次都是对________进行归约:(a)句柄(b)最左素短语(c)素短语(d)简单短语3. 有文法G=({S},{a},{S→SaS,S→ε},S),该文法是________。
a. LL(1)文法;b.二义性文法;c.算符优先文法;d.SLR(1)文法;4. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,和LL(1)分析法属于自顶向下分析;a. 深度分析法b. 宽度优先分析法c. 算符优先分析法d. 递归下降子程序分析法5. 自底向上语法分析采用分析法,常用的是自底向上语法分析有算符优先分析法和LR分析法。
a. 递归b. 回溯c. 枚举d. 移进-归约6. 一个LR(k)文法,无论k取多大,。
a. 都是无二义性的;b. 都是二义性的;c. 一部分是二义性的;d. 无法判定二义性;7. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,和LR分析法属于自底向上分析。
a. 深度分析法b. 宽度优先分析法c. 算符优先分析法d. 递归下降子程序分析法8. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,自顶向下分析试图为输入符号串构造一个;a. 语法树b. 有向无环图c. 最左推导d. 最右推导9. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,自底向上分析试图为输入符号串构造一个。
a. 语法树b. 有向无环图c. 最左推导d. 最右推导10. 采用自顶向下分析方法时,要求文法中不含有。
a. 右递归b. 左递归c. 直接右递归d. 直接左递归11. LR分析是寻找右句型的;而算符优先分析是寻找右句型的。
a. 短语;b. 素短语;c. 最左素短语;d. 句柄12. LR分析法中分析能力最强的是;分析能力最弱的是。
a. SLR(1);b. LR(0);c. LR(1);d. LALR(1)13. 设有文法G:T->T*F | FF->F↑P | PP->(T) | a该文法句型T*P↑(T*F)的最左直接短语是下列符号串________。
a. (T*F),b. T*F,c. P,d. P↑(T*F)14. 在通常的语法分析方法中,()特别适用于表达式的分析。
a.算符优先分析法b.LR分析法c.递归下降分析法d.LL(1)分析法15. .运算符的优先数之间有几种关系。
a.3种b. 2种c. 4种d. 1种16. 算符优先法属于()a.自上而下分析法b.LR分析法c.SLR分析法d.自下而上分析法17. 在LR分析法中,分析栈中存放的状态是识别规范句型的DFA状态。
a.句柄b. 前缀c. 活前缀d. LR(0)项目一.答案:1. b;2. b;3. b;4. d;5. d;6. a;7. c;8. c;9. d;10. b;11. d,c;12. c,b;13. a;14. a 15. a;16. d;17. c;二、填空题:1. 规范归约的关键问题是________ 。
2. LR(k)分析法中,L 的含义是____________________,R 的含义是_______________________,k 的含义是 。
3. 移进一归约分析对符号串的使用有四类操作:移进、__________、_________和出错处理。
4. 设文法G (E 为其开始符号)产生式如下:E→E+T|T T→T*F|F F→(E )|i则句型E+T*F+i 的句柄是_________________。
5. 自下而上分析方法的基本思想是:从输入符号串开始,利用文法规则逐步进行归约,直至归约到文法的 。
6. 在算符优先分析中,用 来刻画“可归约串”;在规范归约分析中,用 来刻画“可归约串”。
7. 在LR(0)分析中,相容的项目集,必须满足的条件是_______,_______。
8. LR 语法分析栈中存放的状态是识别_______的DFA 状态。
9. 在LR 分析过程中的任何时候,栈里的文法符号从下往上应该构成 ,把输入串的剩余部分配上之后应成为 。
10. 对于LR(0)分析法来说,项目A→β1⋅β2对活前缀αβ1是有效的,其条件是存在规范推导 。
11. 形式上我们说一个LR(1)项目[A→α⋅β,a]对于活前缀γ是有效的,如果存在规范推导 。
12. LR(k)分析方法中项目类型可分为四类 、 、 和 。
13. 所谓算符优先分析法就是仿照算术四则运算的运算过程设计的一种语法分析方法。
它首先要规定 ,然后利用这种关系确定 ,并进行 。
14. 如图所示的语法树中,a ,b 不在同一句柄中, 先归约,所以 的优先级高于 。
PbR……a…Q15. 对于句型η的语法树,若它的一棵子树的根标记为A ,且将此子树的末端结点标记从左至右排列起来所形成的符号串为β,则β是 ;此时文法中必有推导 。
16. LR(0)每个项目中圆点的左部表示在分析过程中,要用该产生式归约时, ,右部表示 。
17. 根据项目的定义,可给出文法中所有产生式的项目,而每个项目都为识别 的NFA 的一个状态。
二.答案:1. 寻找或确定一个句型的句柄;2. 从左到右扫描输入串,构造一个最右推导的逆过程;3. 归约,接受;4. T*F ;5. 开始符号;6. 最左素短语,句柄;7. 移进项目和归约项目并存,多个归约项目并存;8. 文法活前缀和可归前缀;9. 活前缀,规范句型;10.ωβαβωα21*'RRA S ⇒⇒;11. δαβωωδRRA S ⇒⇒*',其中γ=δα,a 是ω的第一个符号,或者a是#而ω为ε。
12. 归约项目,接受项目,移进项目,待约项目;13. 运算符之间的优先关系;句型的“句柄”, 归约;14. a ,a ,b ;15. 句型η相对于A 的一个短语;A==>+ β;16. 句柄已识别的部分(进入符号栈),等待识别的部分;17. 活前缀三、判断题1. 一个二义性文法可以是SLR 文法或LALR 文法。
( )2. LL(1)文法不能用LR (1)分析器来分析。
( )3. LR 分析器在自左至右扫描输入串时就能发现其中的任何错误,并能准确地指出出错地点。
( )4. 在归约过程的任一时刻,一个上下文无关文法的任何句型的直接短语一般都不是唯一的。
( )5. 算符优先分析法不是一种规范规约法。
( )6. 存在有左递归规则的文法是LL(1)的。
( )7. 任何算符优先文法的句型中不会有两个相邻的非终结符号。
( )8. 算符优先文法中任何两个相邻的终结符号之间至少满足三种关系(<·,·>,=·)之一。
( ) 9. 任何LL(1)文法都是无二义性的。
( )10. 每一个SLR(1)文法也都是LR(1)文法。
( )11. 存在一种算法,能判定任何上下文无关文法是否是LL(1)的。
( ) 12. 任何一个LL(1)文法都是一个LR(1)文法,反之亦然。
( )13. LR(1)分析中括号中的1是指,在选用产生式A→α进行分析,看当前读入符号是否在FIRST(α)中。
( )14. 若某一个句型中出现了某一产生式的右部,则此右部不一定是该句型的句柄。
( ) 15. 算符优先关系表不一定存在对应的优先函数。
( ) 16. 简单优先文法允许任意两个产生式具有相同右部。
( ) 17. 一个句型的句柄一定是文法某产生式的右部。
( ) 18. 若一个句型中出现了某产生式的右部,则此右部一定是该句型的句柄。
( ) 19. 根据项目的定义,可给出文法中所有产生式的项目,而每个项目都为识别活前缀的DFA 的一个状态。
( ) 四.答案:1. ×;2. ×;3. √;4. √;5. √;6. ×;7. √;8. ×;9. √;10. √;11. √;12. ×;13. √;14. ×;15. √;16. ×;17. √;⒙ ×;19. ×;五、名词解释:1. 短语,直接短语,句柄;2. 规范归约,规范推导;3. 算符文法,算符优先文法;4. 素短语,最左素短语;5. 前缀,活前缀;6. LR(0)项目,LR(0)项目集规范族;五. 答案:1. 设G是一个文法,S是文法的开始符号,假定αβδ是文法G的一个句型,如果有:S=>*αAδ且A=>*β,则称β是句型αβδ相对于非终结符A的短语。
特别地,如果A=>β,则称β是句型αβδ相对于规则A->β的直接短语。
一个句型的最左直接短语称为该句型的句柄。
2. 在形式语言中,最右推导常称规范推导。
规范归约是最右推导的逆过程,也称最左归约。
3. 一个文法,如果它的任何一个产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部:……QR……,则我们称该文法为算符文法。
在一个算符文法中的任何终结符对(a,b),至多只满足下述三个关系之一:a⋅=b,a<⋅b,a⋅>b,则称G是一个算符优先文法。
4. 所谓素短语是指这样的一个短语,它至少含有一个终结符,并且,除自身之外不再含任何更小的素短语。
所谓最左素短语是指处于句型最左边的哪个素短语。
5. 一个字的前缀是指该字的任意首部。
活前缀是指规范句型的一个前缀,这种前缀不含句柄之后的任何符号。
6. 文法G的每一个产生式的右部添加一个小圆点,称为G的一个LR(0)项目。
构成识别一个文法活前缀的DFA的项目集(状态)的全体,称为该文法的项目集规范族。
六、简答题:1. 说明任何SLR(1)文法都是LR(1)文法。
2. 为什么移进-归约法不是一种语法分析方法?3. LR(k)分析法是如何做到严格地自左向右进行分析的?4. 使用状态有限的识别可归前缀的有穷自动机,为什么可以识别语言的无穷多个句子?5. LR项目的含义是什么?六.答案:1. 假设有一个SLR(1)文法G不是LR(1)文法,那么在G的LR(1)项目集规范族中,或有下面的(i),或有下面的(ii),或两种情形都有与之对应,G的LR(0)项目集规范族或有下面的(i),或有下面的(ii),或两者皆有:因为G是SLR(1)文法,因此有:a不属于FOLLOW(A),FOLLOW(A)∩FOLLOW(B)=Φ根据G的LR(1)项目集,有a∈FOLLOW(A),FOLLOW(A)∩FOLLOW(B)≠Φ这和假设矛盾。
《编译原理》课后习题答案第5章
《编译原理》课后习题答案第5章《编译原理》课后习题答案第5章.pdf《编译原理》课后习题答案第5章.pdf第5章自顶向下语法分析方法第1题对文法G[S] S→a|∧|(T) T→T,S|S(1) 给出(a,(a,a))和(((a,a),∧,(a)),a)的最左推导。
(2) 对文法G,进行改写,然后对每个非终结符写出不带回溯的递归子程序。
(3) 经改写后的文法是否是LL(1)的?给出它的预测分析表。
(4) 给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。
答案:(1) 对(a,(a,a)的最左推导为:S(T) (T,S) (S,S) (a,S) (a,(T)) (a,(T,S)) (a,(S,S)) (a,(a,S)) (a,(a,a))对(((a,a),∧,(a)),a) 的最左推导为:S(T) (T,S) (S,S) ((T),S) ((T,S),S) ((T,S,S),S) ((S,S,S),S) (((T),S,S),S) (((T,S),S,S),S) (((S,S),S,S),S) (((a,S),S,S),S) (((a,a),S,S),S) (((a,a),∧,S),S) (((a,a),∧,(T)),S)(((a,a),∧,(S)),S)《编译原理》课后习题答案第5章.pdf《编译原理》课后习题答案第5章.pdf(((a,a),∧,(a)),S) (((a,a),∧,(a)),a)(2) 改写文法为:0) S→a 1) S→∧ 2) S→( T ) 3) T→S N 4) N→, S N 5) N→ε非终结符FIRST集FOLLOW集S {a,∧,(} {#,,,)} T {a,∧,(} {)} N {,,ε} {)}对左部为N的产生式可知:FIRST (→, S N)={,} FIRST (→ε)={ε} FOLLOW (N)={)}由于SELECT(N →, S N)∩SELECT(N →ε) ={,}∩ { )}= 所以文法是LL(1)的。
编译原理 第5章习题解答
第五章习题解答5.1 设一NDPDA识别由下述CFG定义的语言,试给出这个NDPDA的完整形式描述。
S→SASCS→εA→AaA→bC→DcDD→d5.2 消除下列文法的左递归:① G[A]:A→BX∣CZ∣WB→Ab∣BcC→Ax∣By∣Cp② G[E]:E→ET+∣ET–∣TT→TF*∣TF/FF→(E)∣i③ G[X]:X→Ya∣Zb∣cY→ Zd∣Xe∣fZ→X e∣Yf∣a④ G[A]:A→Ba|Aa|cB→Bb|Ab|d5.3 设文法G[<语句>]:<语句>→<变量>: = <表达式>|if<表达式>then<语句>|if<表达式>then<语句>else<语句> <变量>→i<表达式>→<项>|<表达式>+<项><项>→<因子>|<项>*<因子><因子>→<变量>|′(′<表达式>′)′试构造该文法的递归下降子程序。
5.4 设文法G[E]:E→ TE'E'→ + E∣εT→ FT'T'→ T∣εF→ PF'F'→ *F∣εP→ (E)∣ a∣^①构造该文法的递归下降分析程序;②求该文法的每一个非终结符的FIRST集合和FOLLOW集合;③构造该文法的LL(1)分析表,并判断此文法是否为LL(1)文法。
5.5 设文法G[S]:S→ SbA∣aAB→ SbA→ Bc①将此文法改写为LL(1)文法;②求文法的每一个非终结符的FIRST集合和FOLLOW集合;③构造相应的LL(1)分析表。
5.6 设文法G[S]:S→ aABbcd∣εA→ ASd∣εB→ SAh∣eC∣εC→ Sf∣Cg∣εD→ aBD∣ε①求每一个非终结符的FOLLOW集合;②对每一个非终结符的产生式选择,构造FIRST集合;③该文法是LL(1)文法。
软件工程 编译原理 第五章 自顶向下的语法分析方法
例:文法G(E):
E→TE E→+TE | T→FT PROCEDURE F; T→*FT | IF SYM=‘i’ THEN ADVANCE F→(E) | i ELSE 对应的递归下降子程序为: IF SYM=‘(’ THEN
其中不以P开头。
可以把P的规则等价地改写为如下的非直接左递归 形式: 左递归变 P→P 右递归 P→P|
一般而言,假定P关于的全部产生式是 P→P1 | P2 | … | Pm | 1 | 2|…|n 其中,每个都不等于,每个都不以P开头 那么,消除P的直接左递归性就是把这些规则改写 成:
第5章 自顶向下的语法分析方法
语法分析的作用是识别由词法分析给出 的单词符号序列是否是给定文法的正确句 子(程序)。 目前语法分析常用的方法有: 1、自顶向下(自上而下)分析 2、自底向上(自下而上)分析
5.3非LL(1)文法到LL(1)文法的等价转换
确定的自顶向下分析要求给定语言的文法必
须是 LL(1)形式。然而,不一定每个语言都是 LL(1)文法,对一个语言的非LL(1)文法是否能变
换为等价的LL(1)形式以及如何变换是我们讨论
的主要问题。由LL(1)文法的定义可知若文法中 含有左递归或含有左公共因子,则该文法肯定不 是LL(1)文法,因而,我们设法消除文法中的左 递归,提取左公共因子对文法进行等价变换。
1、提取公共左因子
若文法中含有形如:A→αβ|αγ的产生式,这导 致了对相同左部的产生式其右部的FIRST集相交, 也就是 SELECT(A→αβ)∩SELECT(A→αγ) ≠ φ ,不满足 LL(1)文法的充分必要条件。
编译原理第5章
二.算符优先分析法的基本思路
是仿照算术表达式的四则运算过程而设计的一 种语法分析方法。
终结符号 运算符 非终结符号 运算对象 算符优先分析法的关键在于用合适的方法去定义 任何两个可能相继出现的结符号a和b(它们之间 可能插有一个非终结符号)之间的优先级。然后利 用这种关系比较相邻运算符之间的优先级来确定 可归约串并进行归约。
bcde#
归约Ab
4
#aA
bcde#
移进
5
#aAb
cde#
归约AAb
6
#aA
cde#
移进
7
#aAc
de#
移进
8
#aAcd
e#
归约Bd
9
#aAcB
e#
移进
10
#aAcBe
# 归约SaAcBe
11
#S
#
接受
5.2算符优先分析法 概述 一. 算符文法的定义 二. 算符优先分析法的基本思想
算符优先分析法概述
第五章 自底向上分析
P94
概论
▪ 思想
• 自下而上的语法分析过程是最右推导的逆过
程(最左归约);即从输入串开始,朝着文 法开始符号进行归约,直至到达文法开始符 号为止的过程。
▪ 核心
• 寻找句型中的“句柄”进行归约,用不同的
方法寻找句柄,就可获得不同的分析方法
5.1 自底向上分析
一、规范归约
•归约 G=(VT,VN,S,P),α, β ∈(VT∪VN)*,A→β∈P,
规范句型的特点:
生式如下:
①S→aAcBe
②A→b
句柄后不会出现非终结符号。
③A→Ab
④B→d
对输入串abbcde#进行分析
编译原理第五章 (2)
可归前缀集:
开始符产生式的右部
{aAc} {aAc,aAbb } {aAc,aAbb,ab }
13
A → Abb[2] A → b[3]
LR(0)分析法基本概念
LR(0)项目: S 若A→是产生式,则称A→为LR(0)项目(简称项目)。 a A A c c
例: S → aAc 对应四个LR(0)项目: c 1. S → aAc 符号栈中不包含句柄的任何部分 2. S → aAc 符号栈中包含句柄中的a 3. S → aAc 符号栈中包含句柄中的aA 4. S → aAc 符号栈中包含完整句柄aAc
G[S]的LRSM
B e [4]
例3:构造LR(0)状态机 SE$ EE+T ET T id T ( E )
25
SE$ EE+T ET T id T ( E )
0
T
9
T
6
S→ E $ E→ E+T E→ T T→ id T→ ( E )
(
id +
E→T
活前缀的描述性定义 形成可归前缀之前,包括可 归前缀在内所有规范句型的前缀都称为活前缀。 LR类语法分析的思想。 LR(0)分析法关键技术是计算文法的所有规范活
前缀及所有归约规范活前缀。
9
派生定理
开始符产生式的右部是归约活前缀。 如果A是归约活前缀,且A→是产生式,则也 是归约活前缀。 分析: A A、 A
20
例1:计算下列文法的LR(0)状态机。 G[S]: S → aAc[1] A → dbb[2] A → b[3]
21
0
S → aAc[1]
εNO a
G[S]: S → aAc[1] A → dbb[2] A → b[3]
编译原理-第五章习题答案
上一页
下一页
11
例:5.3 文法:SaAcBe A bAb B d 句子:abbcde
步骤 (1) (2) (3) (4) (5) (6)
栈
# #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
输入 abbcde# bbcde# bcde# bcde# cde# cde#
上一页
下一页
20
5)构造算符优先文法G的优先表的算法
思路:对文法中的每一个产生式的候选式检查,判断句型中相邻符号之间 的关系 来构造优先表; 具体算法: FOR 每条产生式P→X1X2…Xn FOR i=1 TO n-1 IF Xi,Xi+1∈VT,THEN Xi=Xi+1; IF i ≤n-2且Xi,Xi+2∈VT,Xi+1∈VN THEN Xi=Xi+2; IF Xi∈VT,Xi+1∈VN THEN FOR FIRSTVT(Xi+1)中的每个a Xi <. a; NEXT IF Xi∈VN,Xi+1∈VT THEN FOR LASTVT(Xi)中的每个a DO a .> Xi+1; NEXT NEXT NEXT
上一页
下一页
8
例:5.1 P85 文法: E→T|E+T T→F|T*F F→i|(E) 句型:i1*i2+i3其中:短语有i1、i2、i3、i1*i2、 i1*i2+i3 直接短语:i1、i2、i3;句柄:i1 例:5.2 P85 文法如上 E 句型:E+T*F+i 短语:E+T*F+i,E+T*F,T*F,i 直接短语:T*F和i E + 句柄:T*F
编译原理教程课后习题答案——第五章
第五章代码优化5.1 完成以下选择题:(1) 优化可生成的目标代码。
a. 运行时间较短b. 占用存储空间较小c. 运行时间短但占用内存空间大d. 运行时间短且占用存储空间小(2) 下列优化方法不是针对循环优化进行的。
a. 强度削弱b. 删除归纳变量c. 删除多余运算d. 代码外提(3) 基本块内的优化为。
a. 代码外提,删除归纳变量b. 删除多余运算,删除无用赋值c. 强度削弱,代码外提d. 循环展开,循环合并(4) 在程序流图中,我们称具有下述性质的结点序列为一个循环。
a. 它们是非连通的且只有一个入口结点b. 它们是强连通的但有多个入口结点c. 它们是非连通的但有多个入口结点d. 它们是强连通的且只有一个入口结点(5) 关于必经结点的二元关系,下列叙述中不正确的是。
a. 满足自反性b. 满足传递性c. 满足反对称性d. 满足对称性【解答】(1) d (2) c (3) b (4) d (5) d5.2 何谓局部优化、循环优化和全局优化?优化工作在编译的哪个阶段进行?【解答】优化根据涉及的程序范围可分为三种。
(1) 局部优化是指局限于基本块范围内的一种优化。
一个基本块是指程序中一组顺序执行的语句序列(或四元式序列),其中只有一个入口(第一个语句)和一个出口(最后一个语句)。
对于一个给定的程序,我们可以把它划分为一系列的基本块,然后在各个基本块范围内分别进行优化。
通常应用DAG方法进行局部优化。
(2) 循环优化是指对循环中的代码进行优化。
例如,如果在循环语句中某些运算结果不随循环的重复执行而改变,那么该运算可以提到循环外,其运算结果仍保持不变,但程序运行的效率却提高了。
循环优化包括代码外提、强度削弱、删除归纳变量、循环合并和循环展开。
5.3 将下面程序划分为基本块并作出其程序流图。
read(A,B)F=1C=A*AD=B*Bif C<D goto L1E=A*AF=F+1E=E+Fwrite(E)haltL1: E=B*BF=F+2E=E+Fwrite(E)if E >100 goto L2haltL2: F=F-1goto L1【解答】先求出四元式程序中各基本块的入口语句,即程序的第一个语句,或者能由条件语句或无条件转移语句转移到的语句,或者条件转移语句的后继语句。
《编译原理》习题参考答案(六)
《编译原理》习题参考答案(六)第五章5.4 为下列类型写类型表达式:(a) 指向实数的指针数组,数组的下标从1到100。
(b) 两位数组(即数组的数组),他的行下标从1到10,列下标从1到20。
(c) 函数,他的定义域是从整数到整数的指针的函数,它的值域是从一个整数和一个字符组成的纪录。
Solution:(a) array ( 1 . . 100 , pointer ( real ) )(b) array ( 1 . . 10 , array ( 1 . . 20 , type ) )(c) ( integer →pointer(integer) )→record((i : integer) * ( c : char )) 假定作为值域的记录类型的两个域分别叫i和c。
5.6 下列文法定以字面常量表的表。
符号的解释和图5.2文法的那些相同,增加了类型list,它表示类型T的元素表。
→ D ; EP→ D ; D | id : TD→ list of T | char | integerTE→ ( L ) | literal | num | id→ E , L | EL写一个类似5.3节中的翻译方案,以确定表达式( E )和表( L )的类型。
P→ D ; ED→ D ; DD→ id : T { addtype ( id.entry , T.type ) }T→ char { T.type := char }T→ integer { T.type := integer }T→ list of T1 { T.type := list ( T1.type ) }E→ literal { E.type := char }E→ num { E.type := integer }E→ id { E.type := lookup ( id.entry ) }E→ ( L ) { E.type := list ( L.type ) }L→E{L.type:=E.type}L→ E , L1 { L.type := if L1.type = E.type then E.typeelse type_error }5.16 对下面的每对表达式,找出最一般的合一代换:(a) α1 → ( α2 →α1 )(b) array ( β1 ) → ( pointer( β1 ) →β2 )(c) γ1 →γ2(d) δ1 →(δ1 →δ2 )Solution:S(α1) = array ( β1 ) S(α2) = pointer ( β1 ) S(β2) = array ( β1 ) (a)(c):S(γ1) = α1 S(γ2) = α2 → α1 (a)(d):S(α1) = S(α2) = S(δ1) = S(δ2) = α (b)(c):S(γ1) = array ( β1 ) S(γ2) = pointer ( β1 ) → β2 (b)(d): 无 (c)(d):S(γ1) = δ1 S(γ2) = δ1 → δ25.17 仿效例5.5,推到下面map 的多态类型: map: ∀ α . ∀ β . ( ( α → β ) * list ( α ) ) → list ( β ) map 的ML 定义是 fun map ( f , l ) = if null ( l ) then nilelse cons ( f ( hd ( l ) ) , map ( f , tl ( l ) ) );在这个函数体中,内部定义的标识符的类型是: null : ∀α . list (α ) → boolean ; nil : ∀α . list (α ) ;cons : ∀α . ( α * list (α ) ) → list (α ) ;hd:∀α . list (α ) →α;∀α . list (α ) → list (α ) ;tl:Solution:行定型断言代换规则(1) f : α( Exp Id )(2) l : β( Exp Id )(3) map : γ( Exp Id )(4) map ( f , l ) : δγ = ( α * β ) →δ(Exp Funcall)(5) null : list (α0) → boolean ( Exp Id ) 和( Type Fresh )(6) null ( l ) : boolean β = list (α0) (Exp Funcall)(7) nil : list (α1) ( Exp Id ) 和( Type Fresh )(8) l : list (α0) 由(2)可得(9) hd : list (α2) →α2( Exp Id ) 和( Type Fresh )(10) hd ( l ) : α0α2 = α0(Exp Funcall)(11) f ( hd ( l ) ) : α3α = α0→α3( Exp Id )(12) f : α0→α3由(1)可得(13) tl : list (α4)→ list (α4) ( Exp Id ) 和( Type Fresh )(14) tl ( l ) : list (α0) α4 = α0(Exp Funcall)(15) map : ((α0→α3)*list(α0))→δ由(3)可得(16) map ( f , tl ( l ) ) : δ(Exp Funcall)(17) cons : α5 * list(α5) → list(α5) ( Exp Id ) 和( Type Fresh ) (18) cons (…) : list (α3) α5 = α3 , δ=list(α3) (Exp Funcall)(19) if : boolean *α6 * α6→α6( Exp Id ) 和( Type Fresh )(20) if (…) : list (α1) α6 = α1 , α3 = α1(Exp Funcall)(21) match : α7 *α7 →α7( Exp Id ) 和( Type Fresh ) (22) match (…) : list (α1) α7 = list (α1) (Exp Funcall)至此有map : ( (α0→α1)*list(α0) )→list(α1)所以map : ∀α . ∀β . ( ( α→β ) * list ( α ) ) → list ( β )5.18 假定类型名link和cell如5.5节那样定义,下面的表达式中,那些结构等价?那些名字等价?(a) link(b) pointer ( cell )(c) pointer ( link )(d) pointer ( record ( ( info : integer ) * ( next : pointer ( cell ) ) ) ) Solution:(a)、(b)、(d)结构等价,无名字等价。
编译原理 第五章 语法分析-自下而上分析
5.2.2 算符优先分析算法
• 素短语:
–是一个短语,它至少含有一个终结符,并且,除 它自身之外不再含任何更小的素短语。
• 最左素短语:
–最左边的素短语是最左素短语。
• 例子:
– 对文法(5.3)p*p和i是句型p*p+i的素短语,而p*p+i 本身也是素短语。
பைடு நூலகம்
• 算符优先文法:
算符优先文法,我们把句型(括在两个#之间) 的一般形式写成: #N1a1N2a2…NnanNn+1# 其中,每个ai都是终结符,Ni是可有可无的非终结 符。 文法G的任何短语是满足如下条件的最左子串 Njaj…NiaiNi+1 aj-1⋖ aj aj ≖ aj+1 , …,aj-1 ≖ ai ai ⋗ ai+1
– 对于每个终结符a(包括#)令其对应两个符号fa 和ga ,画一张以fa 和ga 所有符号为结点的方向图, 如 果 a⋗≖b, 那 么 , 就 从 fa 画 一 箭 弧 至 gb ; 如 果 a ⋖≖b,就画一条从gb到fa的箭弧。 – 对每个结点都赋予一个数,此数等于从该结点能 到达结点(包括出发结点自身在内)的个数。赋 给fa的数作为f(a),赋给gb的数作为g(b)。 –检查所构造出来的函数f和g,看它们 同原来的关 系表是否有矛盾。如果没有矛盾,则f和g就是所 要的优先函数。如果有矛盾,那么,就不存在优 先函数。
• 例子:假定文法G
S→aAcBe A→b A→Ab B→d 输入串abbcde归约到S过程。
图5.1 规约中符号栈的变迁
步骤 动作
1 进 a
2 进 b
3 归 (2)
4 进 b
5 归 (3)
6 进 c
7 进 d d
编译原理 第5章--代码优化
(2) 确定满足以下条件的出口语句: 确定满足以下条件的出口语句 出口语句: 下一个入口语句的前导语句 入口语句的前导语句; ① 下一个入口语句的前导语句; 转移语句 包括转移语句自身); 语句(包括转移语句自身 ② 转移语句 包括转移语句自身 ; 停语句 包括停语句自身 包括停语句自身)。 ③ 停语句(包括停语句自身 。
第5章
代码优化
(3) 图中各个结点上可能附加一个或多个标识符,表示这些 图中各个结点上可能附加一个或多个标识符 附加一个或多个标识符, 变量具有该结点所代表的值。 变量具有该结点所代表的值。
一个基本块由一个四元式 序列组成 四元式都可以用相应的 一个 基本块由一个四元式序列 组成 , 且 每一个 四元式都可以用 相应的 基本块 由一个四元式序列组成, 每一个四元式都可以用 DAG结点表示。 结点表示。 结点表示 给出了不同四元式和与其对应的DAG结点形式。图中,各结点圆圈 结点形式。 图5–1给出了不同四元式和与其对应的 给出了不同四元式和与其对应的 结点形式 图中, 中的ni是构造 构造DAG过程中各结点的编号, 过程中各结点的编号, 中的 过程中各结点的编号 而各结点下面的符号(运算符、标识符或常数)是各结点的标记, 是各结点的标记 而各结点下面的符号 运算符、标识符或常数 是各结点的标记,各结点右 运算符 边的标识符是结点上的附加标识符。 边的标识符是结点上的附加标识符。 附加标识符 除了对应转移语句的结点右边可附加一语句位置来指示转移目标外, 除了对应转移语句的结点右边可附加一语句位置来指示转移目标外,其余 对应转移语句的结点右边可附加一语句位置来指示转移目标外 各类结点的右边只允许附加标识符。 各类结点的右边只允许附加标识符。 除对应于数组元素赋值的结点 标记为 继外, 除对应于数组元素赋值的结点(标记为 ]=)有三个后继外,其余结点最多只 应于数组元素赋值的结点 标记为[ 有三个后继外 有两个后继。 两个后继。 后继
