收藏 分享(赏)

编译原理课后习题答案.doc

上传人:dzzj200808 文档编号:2769156 上传时间:2018-09-27 格式:DOC 页数:27 大小:331KB
下载 相关 举报
编译原理课后习题答案.doc_第1页
第1页 / 共27页
编译原理课后习题答案.doc_第2页
第2页 / 共27页
编译原理课后习题答案.doc_第3页
第3页 / 共27页
编译原理课后习题答案.doc_第4页
第4页 / 共27页
编译原理课后习题答案.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

1、第一章1解答:程序设计语言:程序设计语言是遵守一定规范的、描述“计算”(Computing)过程的形式语言。一般可以划分为低级语言和高级语言两大类。低级语言是面向机器的语言,它是为特定的计算机系统设计的语言,机器指令、汇编语言是低级语言。高级语言是与具体计算机无关的“通用”语言,它更接近于人类的自然语言和数学表示,例如 FORTRAN、Pascal、C等等我们熟悉的语言是高级语言。语言处理程序:由于目前的计算机只能理解和执行机器语言,因此必须有一个程序将用程序设计语言书写的程序等价(执行效果完全一致)地转换为计算机能直接执行的形式,完成这一工作的程序称为“语言处理程序”。它一般可分为解释程序和

2、翻译程序两大类。翻译程序: 翻译程序(Translator)是一种语言处理程序,它将输入的用程序设计语言书写的程序(称为源程序)转换为等价的用另一种语言书写的程序(称为目标程序)。若源语言是汇编语言,目标程序是机器语言,称这种翻译程序为汇编程序。若源语言是高级语言,目标程序是低级语言,称这种翻译程序为编译程序。解释程序:解释程序(Interpreter)是一种语言处理程序,它对源程序逐个语句地进行分析,根据每个语句的含义执行语句指定的功能。2解答:编译程序的总框图见图 1.2。其中词法分析器,又称扫描器,它接受输入的源程序,对源程序进行词法分析,识别出一个个的单词符号,其输出结果是单词符号。

3、语法分析器,对单词符号串进行语法分析(根据语法规则进行推导或归约),识别出程序中的各类语法单位,最终判断输入串是否构成语法上正确的“程序”。 语义分析及中间代码产生器,按照语义规则对语法分析器归约出(或推导出)的语法单位进行语义分析并把它们翻译成一定形式的中间代码。编译程序可以根据不同的需要选择不同的中间代码形式,有的编译程序甚至没有中间代码形式,而直接生成目标代码。 优化器对中间代码进行优化处理。一般最初生成的中间代码执行效率都比较低,因此要做中间代码的优化,其过程实际上是对中间代码进行等价替换,使程序在执行时能更快,并占用更小的空间。 目标代码生成器把中间代码翻译成目标程序。中间代码一般是

4、一种机器无关的表示形式,只有把它再翻译成与机器硬件直接相关的机器能识别的语言,即目标程序,才能在机器上运行。 表格管理模块保持一系列的表格,登记源程序的各类信息和编译各阶段的进展状况。编译程序各个阶段所产生的中间结果都记录在表格中,所需要的信息也大多从表格中获取,整个编译过程都在不断地和表格打交道。出错处理程序对出现在源程序中的错误进行处理。如果源程序有错误,编译程序应设法发现错误,把有关错误信息报告给用户。编译程序的各个阶段都有可能发现错误,出错处理程序要对发现的错误进行处理、记录,并反映给用户 Chapter 21 试写出 VT0 ,1上下述集合的正则表达式: 所有以 1 开始和结束的符号

5、串。 恰含有 3 个 1 的所有符号所组成的集合。 集合01,1 。 所有以 111 结束的符号串。解答: 1(0|1) *1|1 0 *10*10*10* 01|1 (0|1) *1112 试写出非负整数集的正则表达式。 试写出以非 5 数字为头的所有非负整数集的正则表达式。解答: 0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9) * 0|(1|2|3|4|6|7|8|9)(0|1|2|3|4|5|6|7|8|9) * 3试将 2.8 中所示的有限状态自动机 M 最小化。分析:只能对确定的有限状态自动机进行最小化,本题的自动机已经是确定的。最小化采用状态分

6、离法,具体做法如下: 进行 0等价类的划分:Q 划分为 Qf与 QQ f 若已进行了 k等价划分,即 Q已被划分成(Q 1,Q 2,Q n),再进行 k1 划分,对 Qi(i1n),若 q、qQ i,使得对某一个 aVT,(q,a)Q j和(q,a)Q l,jl 或 (q,a)存在而(q,a)不存在或反之。则将 Qi划分为二个子集 Qi1,Q i2,使 qQi1,q Q i2。 重复直至无法进一步划分为止。对最后划分得到的状态子集中每一个子集,选择该子集中任何一个状态作为该状态子集的代表,然后修改原来的有限状态自动机的状态转换函数,凡在 作用下转向某状态子集中任何一个状态的一律改成转向该状态子

7、集的代表。若一个状态子集中某一状态是原来的开始状态,则该状态子集的代表就是新的有限状态自动机的开始状态。同理,若一个状态子集中的状态均是最终状态,则该状态子集的代表就是新的有限状态自动机的最终状态。 抹去可能存在的无用状态与不可及状态。解答:此有限状态自动机的状态转换表如表 3.1所示:表 2.1 M的状态转换表a b A B C B D C C B E D D F AcceptE G E AcceptF G E AcceptG D F Accept由此看出:此有限状态自动机是确定的。最小化:初始划分由 2个子集组成,即:(A,B,C,D,E,F,G)集合D,E,F,G不需要进一步划分,考察子

8、集A,B,C。由于(B,a)=D D,E,F,G,而(A,a)(C,a)BA,BC,因此 Q可进一步划分为:(A,C,B,D,E,F,G)。由于(A,b)C A,C,而(C,b)ED,E,F,G。因此 Q可进一步划分为:(A,C,B,D,E,F,G)。这时不能再划分了,得到的最小化的有限状态自动机如表 3.2所示:表 2.2 最小化的有限状态自动机a b A B C C B E B D C D D D Accept4某程序语言的无(正负)符号常数可以用下面正则表达式 R 来表示:(D +E|D+.D+E|E|.D+E)(+|-)D|D)D *|D+|D*.D+ 试把它转换成确定性有限状态自动机

9、。 把上述有限状态自动机最小化。 在上述有限状态自动机中添加相应动作,取出无(正负)符号常数。分析:从正则表达式构造有限状态自动机可以分两步进行。 画一条从结点 X 到结点 Y 的有向弧,有向弧上标以正则表达式 R。结点 X 为标以“” 的初始状态,结点 Y 为标以“”的最终状态。从这一有向图出发反复应用图 3.2 所示的替代规则,直至所有有向弧都以 VT中的符号或标记为止。 图 2.2 3 条替代规则 消除应用所得到的传递图中的 弧,可以分为两步:首先消除 环路,其次消除其他 弧。a) 环路的消除方法:i将 环路的诸项合并为一个顶点。ii修改各个相关的有向弧。iii若 环路中某一状态是最终(

10、或初始)状态,则新顶点是最终(或初始)状态。b)其它 弧的消除有两种方法:1)子集法:即计算 -Closure(T) ,其表示从状态集 T 中任何一状态沿 弧可以到达的状态全体。其要点是:从初始状态 q0的 X=-Closure(q 0)开始,按如下方法构造状态集:i令 SetX;ii若 Set 中还有未考察过的状态子集 Xi,则对于每一输入符号 aVT,求 T=-Closure(move(X i,a) ) ,Set=Set T(其中move(Xi,a)=q|q(p,a),pXi) 。重复执行(2) ,直至不存在这样的 Xi。这样得到的 Set 即为消除 弧后的确定的有限状态机(DFA ) 。

11、DFA 的初始状态就是 -Closure(q 0) ,最终状态由那些至少含有一个最终状态的状态子集组成。2)逐步消除法:其要点是找到类似于图 2.3 所示,但从 B 再无 弧引出的 弧。图 2.3 逐步消除法删除状态 A 到状态 B 的 弧,对每一条从状态 B 到状态 C 标记为 ai的弧,增加 1 条从状态 A 到状态 C 标记为 ai的弧。若B 是最终状态,则让 A 为最终状态。重复上述过程直至消除全部的 弧,这样得到的一般是不确定的有限状态自动机(NFA) 。解答: 图 3.4 给出了从正则表达式 R 构造有限状态自动机 M 的过程。图 2.4 替代规则的应用过程应用子集法消除?弧:-C

12、losure(x)=x,2,令 A1x,2,计算:-Closure(move (A1,D) ) -Closure(7,10,2,1 )=7,10,2,1,y-Closure(move (A1,) )=-Closure(5,3 )=5,3-Closure(move (A1,E ) )-Closure(4)=4令 A27,10,2,1,y,A35,3,A44,计算:-Closure(move (A2,D) ) 7,10,2,1,y-Closure(move (A2,) )8,3-Closure(move (A2,E ) )4-Closure(move (A3,D) ) 5,6,3,y-Closur

13、e(move (A4,D) ) 12,y-Closure(move (A4,) )11-Closure(move (A4,) )11令 A58,3,A65,6,3,y,A7=12,y,A811,计算:-Closure(move (A5,D) 8,9,3,y-Closure(move (A6,D) 5,6,3,y-Closure(move (A6,E )4-Closure(move (A7,D) 12,y-Closure(move (A8,D) 12,y令 A98,9,3,y,计算:-Closure(move (A9,D) 8,9,3,y-Closure(move (A9,E )4得到的 DFA

14、 M的初始状态是 A1,最终状态集由 A2,A6,A7,A9 组成。图 2.5 是 M的状态转换图,M的状态转换表如表 2.3 所示。表 2.3 M的状态转换表D E + - A1 A2 A4 A3 A2 A2 A4 A5 AcceptA3 A6 A4 A7 A8 A8 A5 A9 A6 A6 A4 AcceptA7 A7 AcceptA8 A7 A9 A9 A4 Accept图 2.5 M的状态转换图采用状态分离法:初始时分成 2 个子集,即:(A1,A3,A4,A5,A8,A2,A6,A7,A9)考察子集 A2,A6,A7,A9,它进一步可分成:(A6,A9,A2,A7)考察子集 A1,A

15、3,A4,A5,A8,它进一步分成:(A4,A1,A8,A3,A5)不能再进一步划分了,得到的最小化的有限状态自动机如图 2.6 所示:图 2.6 最小化的有限状态自动机由于数的表示和具体的机器有着内在联系,这里仅将此无(正负)符号常数的十进制数部分和指数部分分别存入 2个工作单元。设立下述工作单元:此常数的十进制数部分 number此常数的指数部分 exp小数点位数 n此常数指数部分正负号 expsign这 4个工作单元进入有限状态自动机的模拟程序时被初始化为 0。函数过程 getchar,其功能是读入下一个字符到工作单元 char中。函数过程 value,其功能是求出存放在工作单元 cha

16、r中数字字符的值。经过加工后的状态矩阵如表 2.4所示:表 2.4 加工后的状态矩阵D E + - A1 #1,A2 #2,A3 #2,A4 A2 #3,A2 #2,A3 #2,A4 #10,AcceptA3 #4,A6 A4 #5,A7 #6,A8 #7,A8 A6 #4,A6 #2,A4 #11,AcceptA7 #8,A7 #12,AcceptA8 #9,A7 矩阵中元素 A1,A2,.,A7 表示应该转换的下一个状态。 1,2,.,12 表示应该执行的语义子程序。各语义子程序的代码归结如下:1:number:=value (char);getchar;2:getchar;3:numbe

17、r:=number*10+value(char);getchar;4:n:=n+1; number:=number*10+value(char);getchar;5:expsign:=1;exp:=value(char );getchar;6:expsign:=1;getchar;7:expsign=-1;getchar;8:exp:=exp*10+value(char);getchar;9:exp:=value(char);getchar;10:按硬件要求构造无(正负)符号数;11:exp:=-n; 按硬件要求构造无(正负)符号数;12:if expsign=-1 then exp:=-ex

18、p;exp=exp-n; 按硬件要求构造无(正负)符号数;5.设要识别的单词有限集是STEP,SWITCH,STRING,相应正则表达式是 STEP|SWITCH|STRING,试把它转换成确定性有限状态自动机。解答:6设 VTa,b ,试构造下述正则表达式的确定性有限状态自动机: a(a|b)*baa (a|b)* bbb* 解答: 由此正则表达式构造的有限状态自动机 M1 的状态转换图如图 2.7 所示:图 2.7 有限状态自动机 M1 的转换图确定化(表 3.5):表 3.5 M1 的确定化Q a b 1 2 2 2 2,3 2,3 2,4 2,3 2,4 2,5 2,3 2,5 2 2

19、,3 A对应的状态转换图如图 3.8 所示:图 2.8 DFA M1 的状态转换图 由正则表达式构造的有限状态自动机 M2 的状态转换图如图 2.9 所示:图 2.9 M2 的状态图确定化(表 2.6):表 2.6 M2 的确定化Q a b 1 1 1,2 1,2 1 1,2,3 1,2,3 1 1,2,3 对应的状态转换图如图 2.10 所示:图 2.10 DFA M2 的状态转换图9对于下列的状态转换矩阵:a b S A S A A B B B B Za b S A S A B A ZB B B 分别画出相应的状态转换图。 用自然语言分别描述它们所识别的输入串的特征。解答: 表 1 所对应

20、的状态转换图如图 2.11 所示:图 2.11 表 3.6 对应的状态转换图表 2 所对应的状态转换图如图 2.12 所示:图 2.12 表 3.7 对应的状态转换图 表 1 所识别的输入串是:以 b*aa*b 开头的后接任意多个 a 或 b 的a,b上的字符串。表 2 所识别的输入串是:仅含有一个 a 的a,b上的字符串。10. 将习题图 2.1 所示的非确定的有限状态自动机确定化和最小化。习题图 2.1 非确定的有限状态自动机 M解答:确定化(表 2.8):表 2.8 M 的确定化a b S A A B,C A B,C A Z令 BB,C对应的状态转换图如图 2.14 所示:图 2.14

21、DFA M的状态转换图确定化的 M已是最小化的。11.消除传递图 T(习题图 2.2)中的弧。习题图 2.2 传递图 T解答:i)先消除环路,合并状态 2 和 3,得到的传递图 T如图 3.16 所示:图 2.16 消除?环路的传递图 Tii)采用逐步消除法去除其他弧,最终得到的传递图 T如图 2.17 所示:图 2.17 消除所有 弧的传递图Chapter 32设有文法 G1:|002028028 的最右推导:8828280284321 的最左推导:44343243214321 的最右推导:11212132132143213证明文法 G是二义性文法:ifthenelse|ifthen|s0|

22、1分析:只要找出该文法的一个二义性句子即可证明。解答:句子 if 0 then if 1 then s else s 对应如下两棵不同的推导树:图 3.1 句子 if 0 then if 1 then s else s的推导树(1)图 3.1 句子 if 0 then if 1 then s else s的推导树(2)4设有文法 G:-|/|i|() 试写出 i/(i-i-i)的推导树。 试写出(-i)/ 的短语、简单短语和句柄。分析:只要给出句型(句子)对应的推导树就容易求出短语、简单短语和句柄。解答: i/(i-i-i)的推导树如下:图 3.3 句子 i/(i-i-i)的推导树(-i)/的

23、推导树如下:图 3.4 句子(-i)/的推导树短语:,i,-i,(-i),(-i)/简单短语:,i句柄:5对布尔矩阵求 B+。解答:利用 Warshall算法求解的结果如下:7对表结构语言 G:a| |(),| 试给出(a,(a,a)的最左和最右推导。 指出(a,a),(a),a) 的最右推导,以及规约的每一步的句柄。 给出(a,a),(a),a) 的推导树自下而上的构造过程。分析:本题是要让读者明确,自下而上构造推导树的过程是最右推导(规范推导) 的逆过程,这一过程正是自底向上句法分析的过程,其要点是找句柄、归约。解答: 句子(a,(a,a)的最左推导为:()(,)(,)(a,)(a,()(

24、a,(,)(a,(,)(a,(a ,)(a,(a,a)最右推导为:()(,)(,()(,(,)(,(,a)(,(,a)(, (a,a)(,(a,a)(a,(a,a) 句子(a,a),(a),a) 的最右推导及归约的每一步句柄如表 3.1 所示:表 3.1 句子(a,a),(a),a)的最右推导过程最右推导 每一步归约时的句柄() ()(,) ,(,a) a(,a) (),a) ()(,),a) ,(,(),a) ()(,(),a) (,(a),a) a(,(a),a) ,(,(a),a) (,(a),a) (),(a),a) ()(,),(a),a) ,(,a),(a),a) a(,a),(a

25、),a) (a,a),(a),a) a 句子(a,a),(a),a) 的推导树如图 3.5 所示:图 3.5 句子(a,a),(a),a)的推导树构造过程如图 3.6 所示:图 3.6 句子(a,a),(a),a)的推导树自下而上的构造过程Chapter 4(略)Chapter 51. 考察算术表达式翻译文法 T1:T1=(+,*,(,),C,C,ADD,MUL,R,)其中 R 由下面规则组成:+,ADD,*,MUL,(),C,C其相应输入文法是 LR(1)。试对该输入文法的下推自动机控制表作适当改动,构造翻译下推自动机的控制表,使该翻译下推自动机把任何一个由 C,+,*组成的中缀表达式翻译成

26、后缀表达式。分析:设翻译文法中的翻译规则形如:x,y把自底向上的下推自动机改造成相应的下推翻译自动机的方法很简单:只需规定,当下推自动机应用产生式 i 进行规约的同时,输出 y 中的输出符号。解答:输入文法的 LR(1)状态集如表 5.1。表 5.1 输入文法的 LR(1)状态集状态 T 项目集 文法符号BGOTO(T,B)*, 1+, /+ 1, /+ 2*, /+/* 2, /+/* 3(), /+/* ( 40C, /+/* C 5* Accept1*+, /+ + 6*, /+ /+ #22*, /+/* * 73 *, /+/* /+/* #4*(), /+/* 8+, )/+ 8,

27、 )/+ 9*, )/+/* 9, )/+/* 10(), )/+/* ( 114C, )/+/* C 125 *C, /+/* /+/* #6*+, /+ 13*, /+/* 13, /+/* 3(), /+/* ( 46C, /+/* C 5*, /+/* 14(), /+/* ( 47C, /+/* C 5*(), /+/* ) 158*+, )/+ + 16*, )/+ )/+ #29*, )/+/* * 1710 *, )/+/* )/+/* #4*(), )/+/* 18+, )/+ 18, )/+ 9*, )/+/* 9, )/+/* 10(), )/+/* ( 1111C, )

28、/+/* C 1212 *C, )/+/* )/+/* #6*+, /+ /+ #113*, /+/* * 714 *, /+/* /+/* #315 *(), /+/* /+/* #5*+, )/+ 19*, )/+/* 19, )/+/* 10(), )/+/* ( 1116C, )/+/* C 12*, )/+/* 20(), )/+/* ( 1117C, )/+/* C 12*(), )/+/* ) 2118*+, )/+ + 16*+, )/+ )/+ #119*, )/+/* * 1720 *, )/+/* )/+/* #321 *(), )/+/* )/+/* #5翻译下推自动机

29、的控制表如表 5.2 所示:表 5.2 翻译下推自动机的控制表动作表(Action) 转向表(Goto)状态 T+ * ( ) C 0 S4 S5 1 2 31 S6 Acc 2 R#2 S7 R#2 3 R#4 R#4 R#4 4 S11 S12 8 9 105 R#6, GEN(C) R#6, GEN(C) R#6,GEN(C) 6 S4 S5 13 37 S4 S5 148 S16 S15 9 R#2 S17 R#2 10 R#4 R#4 R#4 11 S11 S12 18 9 1012 R#6, GEN(C) R#6, GEN(C) R#6, GEN(C) 13 R#1,GEN(ADD

30、) S7 R#1,GEN(ADD) 14 R#3,GEN(MUL) R#3,GEN(MUL) R#3,GEN(MUL) 15 R#5 R#5 R#5 16 S11 S12 19 1017 S11 S12 2018 S16 S21 19 R#1,GEN(ADD) S17 R#1,GEN(ADD) 20 R#3,GEN(MUL) R#3,GEN(MUL) R#3,GEN(MUL) 21 R#5 R#5 R#5 2. 考察下述文法 G:i:=+*()i试写出各产生式的语义子程序。解答:让非终结符带有属性.type 指出数据类型,属性.val 存放运算结果。 i:=if i.type=.type th

31、enGEN(:=,.val,i.val);else if i.type=real AND .type=int thenbeginT:=NEWTEMP;GEN(float,.val,T);GEN(:=,T,i.val);end.else if i.type=int AND .type=real thenbeginT:=NEWTEMP;GEN(int,.val,T);GEN(:=,T,i.val);end.else error. E 1+.val:=NEWTEMP;if .type=int AND .type=int thenbegin.type:=int;GEN(int+,.val, .val,

32、.val);end.else if .type=real AND .type=real thenbegin.type:=real;GEN(real+,.val, .val,.val);end.else if .type=int AND .type=real thenbegin.type:=real;T:=NEWTEMP;GEN(float, .val,T);GEN(real+,T, .val,.val);end.else if .type=real AND .type=int thenbegin.type:=real;T:=NEWTEMP;GEN(float, .val,T);GEN(real

33、+, .val,T,.val);end.else error.*.val:=NEWTEMP;if .type=int AND .type=int thenbegin.type:=int;GEN(int*,.val, .val,.val);end.else if .type=real AND .type=real thenbegin.type:=real;GEN(real*,.val, .val,.val);end.else if .type=int AND .type=real thenbegin.type:=real;T:=NEWTEMP;GEN(float, .val,T);GEN(rea

34、l*,T, .val,.val);end.else if .type=real AND .type=int thenbegin.type:=real;T:=NEWTEMP;GEN(float, .val,T);GEN(real*, .val,T,.val);end.else error.().val:= .val;.type:= .type;i.val:= i.val;.type:=i.type;Chapter 6(略)Chapter 71.考察下面程序段:procedure p(x,y,z)beginy:=y+1;z:=z+x;end;begina:=2;b:=3;p(a+b,a,a);wr

35、ite(a);end;若参数通信分别是: 按名 按值方式,上述程序执行后,输出 a 的值分别是多少?解答:按名调用的特点是:在被调用过程执行时,用实参替换形参,然后执行替换后的程序,因此本程序相当于执行如下程序段:a:=2;b:=3;a:=a+1;a:=a+a+b;输出 a 的值是 9。按值调用的特点是:传送的是实在参数的当时值,该值成为形参的初值,是一种单向的行为,它并不改变实参的值。所以 a 的值不变,仍是 2。 2. 考察下面 C 程序:main()int ;P1() P2();P2() P3();P3() P1();试说明,该程序执行时,运行栈中调用记录的变化情况。解答:程序流进入过程

36、 P1时,栈空间中各调用记录的布局如图 7.2 所示。 图 7.2 程序流进入过程 P1时各调用记录的布局程序流进入过程 P2时,栈空间中各调用记录的布局如图 7.3 所示。图 7.3 程序流进入过程 P2时各调用记录的布局程序流进入过程 P3时,栈空间中各调用记录的布局如图 7.4 所示。图 7.4 程序流进入过程 P3时各调用记录的布局3.下标变量地址计算可以采用另一种方法:直接生成计算下标变量地址的中间代码。考察下述和下标变量有关的产生式: i 1, 试写出相应求下标变量地址的语义子程序。解答:由于在处理数组定义时,已经将数组的维数 n,每一维的上下界 Ui、Li,长度 di 以及数组元

37、素存贮首地址stp,address(a0,0)均存放在数组的信息向量表中。为得到这些数据,用属性 id.dim 表示数组的维数,函数 limit(id,j)返回dj,函数 getaddr(id)返回假头地址 address(a0,0),过程 Mark_indirect(T)表示在 T 中添加间址标记。各产生式的语义子程序为: i.dim:=1;.array:=i.array;/* i.array 表示数组名*/.val:=.val; 1,.dim:= 1.dim+1;D:=Newtemp;GEN(*,1.val,limit(.array,.dim),D);GEN(+,D,.val,D);.va

38、l:=D;.array:= 1.array;Checkdim(.dim,.array.dim); /*检查维数的正确性*/L:=Newtemp;GEN(+,getaddr(.array),.val,L);Mark_indirect(L);.val:=L;4.过程语句: call i() 1, 的中间代码采用下面形式:(call,i.VAL,.VAL,.VAL)试写出生成上述形式的中间代码的语义子程序。解答:让带有属性:.que (队头)和.tail(队尾) 。1 的语义子程序为:fetch(.que, .tail);Gen(call,i.VAL,.VAL,.VAL);2 的语义子程序为:.qu

39、e= 1.que;.tail= 1.tail;Append(.tail,.val);3 的语义子程序为:MakeQueue(.que, .tail);Append(.tail,.val); 5. 考察下面 Pascal 程序:Program P(input,output);var a,b:integer;c1:array110 of real;Procedure f1(x,y:integer);var d,e:integer;c2:array120 of real;Procedure f2;var u,v:real;beginend;beginf2;end;Procedure f3;var h

40、1,h2:integer;beginf1(h1,h2);end;beginf3;end. 给出程序流进入过程 f1 和 f2 时区头地址表的内容。 给出程序流进入 f2 时运行栈中的主要内容。解答:本题中过程的嵌套和调用关系可示意性地由图 7.5 表示。 图 7.5 过程的嵌套和调用关系 当程序流进入 f1 时,区头地址表的内容有以下两项:过程 f1的调用记录首址P过程的调用记录首址当程序流进入 f2 时,区头地址表的内容有以下三项:过程 f2的调用记录首址过程 f1的调用记录首址P过程的调用记录首址(2)程序流进入 f2时,运行栈的主要内容如图 7.6所示。图 7.6 程序流进入 f2 时运

41、行栈的情形Chapter 81.考察下述文法 G:i:=+*()i试写出各产生式的语义子程序。解答:让非终结符带有属性.type 指出数据类型,属性.val 存放运算结果。 i:=if i.type=.type thenGEN(:=,.val,i.val);else if i.type=real AND .type=int thenbeginT:=NEWTEMP;GEN(float,.val,T);GEN(:=,T,i.val);end.else if i.type=int AND .type=real thenbeginT:=NEWTEMP;GEN(int,.val,T);GEN(:=,T,

42、i.val);end.else error. E 1+.val:=NEWTEMP;if .type=int AND .type=int thenbegin.type:=int;GEN(int+,.val, .val,.val);end.else if .type=real AND .type=real thenbegin.type:=real;GEN(real+,.val, .val,.val);end.else if .type=int AND .type=real thenbegin.type:=real;T:=NEWTEMP;GEN(float, .val,T);GEN(real+,T,

43、 .val,.val);end.else if .type=real AND .type=int thenbegin.type:=real;T:=NEWTEMP;GEN(float, .val,T);GEN(real+, .val,T,.val);end.else error.*.val:=NEWTEMP;if .type=int AND .type=int thenbegin.type:=int;GEN(int*,.val, .val,.val);end.else if .type=real AND .type=real thenbegin.type:=real;GEN(real*,.val

44、, .val,.val);end.else if .type=int AND .type=real thenbegin.type:=real;T:=NEWTEMP;GEN(float, .val,T);GEN(real*,T, .val,.val);end.else if .type=real AND .type=int thenbegin.type:=real;T:=NEWTEMP;GEN(float, .val,T);GEN(real*, .val,T,.val);end.else error.().val:= .val;.type:= .type;i.val:= i.val;.type:

45、=i.type;2.试写出第二类 if 语句翻译的语义动作子程序。解答:设条件语句的产生式为:if then 1 else 2语义可描述为:t:=;if t then goto L1;1;goto L2;L1:2;L2:让带有属性.type 和属性.false、.true(分别指出了假链与真链的链首地址) 。运用拆因子技术,把产生式改造为if then 1 else 2 各产生式的语义子程序如下:if CheckBool(.type);TLT:=NewTL;GEN(LABEL,TLT);Backpatch(.true,TLT);.false:=.false; then 1.TL:=NewTL;

46、GEN(BR, .TL);TLF:=NewTL;GEN(LABEL,TLF);Backpatch(.false,TLF); else 2GEN(LABEL,.TL);3. 考察 Pascal 中下面形式定义的 for 语句:for V:= to do 假定上述形式的 for 语句等价于:begint1:=e1;t2:=e2;if t1t2 thenbeginV:=t1;L1:;V:=succ(V);if Vt2 then goto L1;endend试写出符合上述规定的语义动作子程序。解答:将产生式拆因子为 2 个产生式:for V:= to do 各产生式的语义动作子程序如下:for V:= to check(V.type, .type, .type);.next:=NEWTL

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报