收藏 分享(赏)

编译原理与技术练习题汇总.doc

上传人:dzzj200808 文档编号:2702705 上传时间:2018-09-25 格式:DOC 页数:31 大小:244KB
下载 相关 举报
编译原理与技术练习题汇总.doc_第1页
第1页 / 共31页
编译原理与技术练习题汇总.doc_第2页
第2页 / 共31页
编译原理与技术练习题汇总.doc_第3页
第3页 / 共31页
编译原理与技术练习题汇总.doc_第4页
第4页 / 共31页
编译原理与技术练习题汇总.doc_第5页
第5页 / 共31页
点击查看更多>>
资源描述

1、编译原理与技术练习题 1练习 1 1.1 为什么高级程序语言需要编译程序?1.2 解释下列术语:源程序,目标程序,翻译程序,编译程序,解释程序1.3 简单叙述编译程序的主要工作过程。1.4 编译程序的典型体系结构包括哪些构件,主要关系如何,请用辅助图示意。1.5 编译程序的开发有哪些途径?了解你熟悉的高级编程语言编译程序的开发方式。1.6 运用编译技术的软件开发和维护工具有许多类,简单叙述每一类的主要用途。1.7 了解一个真实编译系统的组成和基本功能。1.8 简单说明学习编译程序的意义和作用。1.9 如果机器 H 上有两个编译:一个把语言 A 翻译成语言 B,另一个把 B 翻译成 C,那么可以

2、把第一个编译的输出作为第二个编译的输入,结果在同一类机器上得到从 A 到 C 的编译。请用 T 形图示意过程和结果。编译原理与技术练习题 2练习 22.1 词法分析器的主要任务是什么?2.2 下列各种语言的输入字母表是什么?(1) C(2) Pascal(3) Java(4) C#2.3 可以把词法分析器写成一个独立运行的程序,也可以把它写成一个子程序,请比较各自的优劣。2.4 用高级语言编写一个对 C#或 Java 程序的预处理程序,它的作用是每次调用时都把下一个完整的句子送到扫描缓冲区,去掉注释和无用的空格、制表符、回车、换行。2.5 用高级语言实现图 2.5 所示的 Pascal 语言数

3、的状态转换图。2.6 用高级语言编程实现图 2.6 所示的小语言的词法扫描器。2.7 用自然语言描述下列正规式所表示的语言:(1) 0(0|1)*0(2) (|0)1)*)*(3) (a|b)*a(a|b|)(4) (A|B|.|Z)(a|b|.|z)*(5) (aa|b)*(a|bb)*(6) (0|1|.|9|A|B|C|D|E)+(t|T)2.8 为下列语言写正规式(1) 所有以小写字母 a 开头和结尾的串。(2) 所有以小写字母 a 开头或者结尾(或同时满足这两个条件)的串。(3) 所有表示偶数的串。(4) 所有不以 0 开始的数字串。(5) 能被 5 整除的 10 进制数的集合。(6

4、) 没有出现重复数字的全体数字串。2.9 试构造下列正规式的 NFA,并且确定化,然后最小化。(1) (a|b)*a(a|b)(2) (a|b)*a(a|b) *(3) ab(ba|ab)*(bb|aa)*ab(4) 00|(0|1)*|11(5) 1(0|1)*01(6) 1(1010*|1(010)*1*02.10 请分别使用下面的技术证明(a|b)*,(a*|b*)*以及(a|)b*)* 这三个正规式是等价的:(1) 仅用正规式的定义及其代数性质;编译原理与技术练习题 3(2) 从正规式构造的最小 DFA 的同构来证明正规式的等价。2.11 构造有限自动机 M,使得(1) L(M) =

5、anbn | n 1;(2) L(M) = anbncn | n 1;(3) 它能识别 0, 1上 0 和 1 的个数都是偶数的串;(4) 它能识别字母表0, 1上的串,但是串不含两个连续的 0 和两个连续的 1;(5) 它能接受形如dd*,d*E 和dd 的实数,其中 d=0,1,2,3,4,5,6,7,8,9 。(6) 它能识别a, b上不含子串 aba 的所有串。2.12 分别将下列 NFA 确定化,并画出最小化的 DFA:(a)a10a,bb(b)a40a,ba123abbba(c)abFAa,bBCDbbaSE 2.13 下面是 URL 的一个极其简化的扩展正规式的描述:letter

6、 A-Za-zdigit 0-9letgit letter| digit letgit_hyphen letgit | _letgit_hyphen_string letgit_hyphen | letgit_hyphen letgit_hyphen_stringlabel letter (letgit_hyphen_string? letgit)? URL (label.)*label(1) 请将这个 URL 的扩展正规改写成只含字母表A, B, 0, 1, _, .上符号的正规式;(2) 构造出识别(1)更简化的 URL 串的有限自动机。2.14 用某种高级语言实现(1) 将正规式转换成

7、NFA 的算法;(2) 将 NFA 确定化的算法;(3) 将 DFA 最小化的算法。2.15 描述下列语言词法记号的正规表达式:(1) 描述 C 浮点数的正规表达式。(2) 描述 Java 表达式的正规表达式。2.16 Pascal 语言的注释允许两种不同的形式:花括弧对.,以及括弧星号对(*.*)。(1) 构造一个识别这两种注释形式的 DFA;(2) 用 Lex 的符号构造它的一个正规式。2.17 写一个 Lex 输入源程序,它将产生一个把 C 语言程序中(注释除外)的保留字全部大写。编译原理与技术练习题 4练习 33.1 对于文法 G3.26EE T | E+T | E-TT F | T*

8、F | T/FF (E) | i 证明(i+T)*i 是它的一个句型。3.2 给定文法 G3.27SS aAcB | BdS B aScA | cAB | b A BaB | aBc | a 试检验下列符号串中哪些是 G3.27 S中的句子。(1) aacb (2) aabacbadcd (3) aacbccb (4) aacabcbcccaacdca (5) aacabcbcccaacbca3.3 考虑文法 G3.28S S (L) | aL L, S | S(1) 指出该文法的终结符号及非终结符号。(2) 给出下列各句子的语法分析树: (a,a) (a,(a, a) (a, (a, a),

9、 (a, a) (3) 分别构造(b)中各句子的一个最左推导和最右推导。3.4 考虑文法 G3.29S S aSbS | bSaS |(1) 讨论句子 abab 的最左推导,说明该文法是二义性的。(2) 对于句子 abab 构造两个相应的最右推导。 (3) 对于句子 abab 构造两棵相应的分析树。 (4) 此文法所产生的语言是什么?3.5 文法 G3.30S为: S Ac | aB A ab B bc 写出 L(G3.30)的全部元素。 3.6 试描述由下列文法 GS所产生的语言。 (1) S 10S0 | aA AbA | a (2) S SS | 1A0 A1A0 | (3) S 1A

10、| B0 A1A | C BB0 | C C1C0 | (4) S bAdc AAS | a 编译原理与技术练习题 5(5) S aSS Sa(6) A 0B | 1C B 1 | 1A | 0BB C 0 | 0A | 1CC3.7 设已给文法 G3.31=(VN,VT,P,S),其中: VN = S VT = a1,a2,an, , , P = Sa i| i=1,2,nS S, S SS , S S S,试指出此文法所产生的语言。3.8 已知文法 G3.32=(A,B,C,a,b,c,A,P),其中 P 由以下 产生式组成:A abc A aBbcBb bB Bc CbccbC Cb a

11、C aaBaC aa 问:此文法表式的语言是什么?3.9 已知文法 G3.33 P:P aPQR |abR RQ QR bQ bb bR bc cR cc 证明 aaabbbccc 是该文法的一个句子。3.10 构造一个文法,使其产 生的语言是由算符+, *, (, ) 和运算对象 a 构成的算术表达式的集合。3.12 已知语言 L=anbbn| n1, 写出产生语言 L 的文法。3.13 写一文法,使其语言是偶正整数的集合。 要求:(1) 允许 0 打头。 (2) 不允许 0 打头。3.14 文法 G3.34 S为: S Ac|aB, A ab B bc 该文法是否为二义的?为什么?(提示:

12、找一个句子,使之有两棵不同的分析 树。 ) 3.15 证明下述文法 G3.35表达式 是二义的: 表达式 a | (表达式) |表达式运算符表达式 运算符 + | - | * | / 3.16 下面的文法产生 a 的个数和 b 的个数相等的非空 a、b 串 S aB | bAB bS | aBB | b A aS | bAA | a 其中非终结符 B 推出 b 比 a 的个数多 1 个的串, A 则反之。(1) 证明该文法是二义的。 (2) 修改上述文法,不增加非终结符,使之成为非二义文法,并产生同样的语言。 编译原理与技术练习题 63.17 考虑文法 G3.36R RR | R | RR |

13、 R* | (R) | a | b 其中 R | R 表示 R 或 R;RR 表示 R 与 R 的连接;R*表示 R 的闭包。(1) 证明此文法生成=a, b上的除了和 的所有正规表达式。 (2) 试说明此文法是二义性的。(3) 构造一个等价的无二义性文法,该文法给出*、 连接和|等运算符号的优先级和结合规则。3.18 给出产生下述语言的上下文无关文法:(1) an bn am bm | n, m0。(2) 1n 0m1m 0n | n, m0。(3) cT | a, b*,其中 T 是的逆。(4) w | wa,b+,且 w 中 a 的个数恰好比 b 多 1 。(4) w | wa,b+,且

14、|a| |b| 2|a| 。(5) w | w 是不以 0 开始的奇数集 。3.19 设 G=(VN,VT,P,S)为 CFG,1,2, n为 V 上的符号串,试证明: 若 12 n 则存在 V 上的符号串 1,2,, n,使 =12 n,且有 ai i (i=1,2,n)。3.20 设 G=(VN,VT,P,S)为 CFG, 和 都是 V 上的符号串,且 ,试证明:(1) 当 的首符号为终结符号时, 的首符号也必为终结符号;(2) 当 的首符号为非终结符号 时, 则 的首符号也必为非 终结符号。3.21 写出下列语言的 3 型文法:(a) an | n0(b) anbm | n, m1 (c

15、) anbmck | n, m, k1 3.22 已知文法 G3.37 S:S dABA aA|aB |Bb 给出相应的正规式和等价的正规文法。3.23 给出下列文法 GA消除左递归后的等价文法:(1) A BaC | CbBB Ac | cC Bb | b (2) A B a | A a | cB B b | A b | d(3) S SA | A A SB | B | (S) | ( ) B S | (4) S AS | b A SA | a (5) S (T) | a | T S | T, S 编译原理与技术练习题 7练习 44.1 证明:含有左递归的文法不是 LL(1)文法。4.2 对

16、于文法 G4.11SS uBDz B Bv | w D EF E y | F x | (1) 计算文法 G4.11 各非终结 符的 FIRST 集和 FOLLOW 集,以及各 产生式的 SELLECT 集。(2) 判断该文法是否是 LL(1)文法。(3) 若不是 LL(1)文法,则修改此文法 , 使其成为能产生相同语言的 LL(1) 文法。4.3 已知布尔表达式文法 G4.12bexpr bexpr bexpr or bterm | bterm bterm bterm and bfactor | bfactor bfactor not bfactor | (bexpr) | true | fa

17、lse 改写文法 G4.12 为扩充的巴克斯范式,并为每个非终结符构造递归下降分析子程序。4.4 已知用 EBNF 表示的文法 G4.13A A B B X A X (a | b) a | b 试用类 C 或类 PASCAL 语言写出其递归下降子程序。4.5 已知文法 G4.14SS (L) | a L L, S | S (1) 消除文法 G4.14 的左递归 ,并 为每个非终结符构造不带回溯的递归子程序。(2) 经改写后的文法是否是 LL(1)文法?给出它的预测分析表。(3) 给出输入串 (a, a)$ 的分析过程,并说明该符号串是否为文法 G4.14 的句子。4.6 对于文法 G4.15R

18、编译原理与技术练习题 8R R | T | T T TF | F F F* | C C (R) | a | b(1) 消除文法的左递归。(2) 计算文法 G4.15 各非终结 符的 FIRST 集和 FOLLOW 集。(3) 构造 LL(1)分析表。4.7 已知文法 G4.16A A aABe | a B Bb | d(1) 判断该文法是否为 LL(1) 文法。 (2) 写出输入串 aade$ 的分析过程。编译原理与技术练习题 9练习 55.1 设文法 G5.10E为E E+T | E-T | TT T*F | T/F | FF FP | PP (E) | i求以下句型的短语、直接短语 、素短

19、 语、句柄和最左素短语:(1)E-T/F+i(2)E+F/T-Pi(3)T*(T-i)+P(4)(i+i)/i-i5.2 根据下列优先关系矩阵计算其优先函数,并 说明优先函数是否存在。S A B a b cS A B a b c 5.3 对于文法 G5.11SS (R) | a | b R TT S; T | S(1)计算 G5.11 S的 FIRSTTV 和 LASTTV;(2)构造 G5.11 S的优先关系表,并说明 G5.11 S是否为算符优先文法;(3)计算 G5.11 S的优先函数。5.4 对于文法 G5.12 SS S;G | GG G(T) | HH a | (S)T T+S |

20、 S编译原理与技术练习题 10(1)构造 G5.12 S的算符优先关系表,并判断 G5.12 S是否为算符优先文法;(2)给出句型 a(T+S);H;S 的短 语、直接短 语、句柄、素短 语和最左素短语;(3)分别给出(a+a)和 a;(a+a)的分析 过程,并说明它们是否为 G5.12 S的句子;(4)给出(3)中输入串的最右推导,分 别说明它们是否为 G5.12 S的句子;(5)从(3)和(4)说明算符优先分析的优缺点。5.5 对于文法 G5.13PP LAd | cdL cA aP | P | a请证明它不存在优先函数。5.6 给定文法 G5.14 SS AS | bA SA | a(1

21、)构造它的 LR(0)的项集;(2)构造识别该文法所有活前缀的 DFA;(3)这个文法是 SLR(1)吗?若是,构造出它的 SLR(1)分析表。5.7 给定文法 G5.15SS AS | A aA | b(1)构造它的 LR(1)文法;(2)构造识别该文法所有活前缀的 DFA;(3)构造出它的 SR(1)分析表;(4)给出字符串 abab$的分析过程。5.8 若有定义二进制数的文法 G5.16DD L . L | LL LB | BB 0 | 1 (1) 通过构造该文法的无冲突的分析表来说明它是哪类 LR 文法;(2) 给出输入串 101.010 的分析过程。5.9 给定文法 G5.17S编译

22、原理与技术练习题 11S L = R| RL *R | idR L(1)构造它的 LR(0)的项集;(2)构造它的 LR(0)项集规范族;(3)构造识别该文法所有活前缀的 DFA;(4)该文法是 SLR(1)、LR(1)以及 LALAR(1)?构造相应的分析表。5.10 对于文法 G5.18SS AA Ab | bBaB aAc | aAb | a(1)证明它是 SLR(1)文法,但不是 LR(0)文法;(2)证明所有 SLR(1)文法都是 LR(1)文法。5.11 证明文法 G5.19MM NN Qa | bQc | dc | bdaQ D是 LALR(1)文法,但不是 SLR(1)文法。5

23、.12 证明文法 G5.20SS aAa | aBb | bAb | bBaA cB c是 LR(1)文法,但不是 LALR(1)文法。5.13 对于文法 G5.21SS AaAb | BbBa A B (1)证明它是 LL(1)文法,但不是 SLR(1)文法;(2)证明所有 LL(1)文法都是 LR(1)文法。5.14 对于下列各个文法,判断它是哪类最简单的 LR 文法,并构造相应的分析表。编译原理与技术练习题 12(1) A AA + | AA* | a (2) S ABA aBa | B bAb | (3) S D; B | BD d | B B; a | a| (4) S D; B |

24、 BD d | B B; a | a| (5) S (SR | aR . SR | )(6) S UTa | TbT S | Sc | dU US | e5.15 命题演算的文法 G5.22B B B and B | B or B | not B | (B) | true | false | b是二义性文法。(1)为句子 b and b or true 构造两个不同的最右推导,以此说明该文法是二义的。(2)为它写一个等价的非二义性文法。(3)给出无二义性规则,构造出 LR(0)分析表,并 给出句子 b and b or true 的分析过程。编译原理与技术练习题 13练习 66.1 符号表的作

25、用有哪些?6.2 符号表的表项通常包括哪些属性,主要描述的内容是什么?6.3 符号表组织的数据结构有哪些种?每种组织结构选取的主要依据是什么?6.4 程序块是程序语言的主要构造元素,它允 许以嵌套的方式确定局部声明。大多数语言规定,程序块结构的声明作用域使最近嵌套规则,请按照这个规则写出下列声明的作用域。main() /* 开始块 B0 */int a = 0;int b =0; /* 开始块 B1 */int b = 1; /* 开始块 B2 */int a = 2; /* 结束块 B2 */ /* 开始块 B3 */int b = 3; /* 结束块 B3*/ /* 结束块 B1*/6.5

26、 C 语言中规定变量标识 符可以定义为:extern、 ertern static、auto、local static 和 register,请对这 5种变量分别说明其作用域。6.6 设散列表为 HT13,哈希函数定义为 hash(key)=key%13(整数除法取余运算),用链地址法解决冲突对下列关键码 12,23,45,57,20,3,31,15,56,78 造表。编译原理与技术练习题 14练习 77.1 请考虑过程和活动记录的联系和区别。7.2 请解释下列概念:生存期,过程的活动,活动树,活动记录。 7.3 有哪些常见的参数传输方式, 请分析和比较它们各自的特点。7.4 对你熟悉的高级程

27、序语言(如 C、Pascal、C+、Java 或 C#),了解它 们的参数传输机制。7.5 执行下面 Pascal 程序的输出 a 结果分别是什么,如果参数的传递机制是:(1)引用调用方式;(2)值结果调用方式;program copyout (input, output);var a: integer;procedure unsafe (var x: integer);begin x := 2; a := 0 end;begina := 1; unsafe (a); writeln (a)end7.6 执行下面程序时打印的 a 分别是什么,若参数的传递机制是:(1)按值调用方式;(2)引用调

28、用方式;(3)值结果调用方式;(4)换名调用方式。procedure p(x, y, z);beginy := y +1;z := zx;end p;begina := 2;编译原理与技术练习题 15b := 3;p(a+b, a, a);print a;end;7.7 设计存储分配时要考虑哪些主要因素?常见的存储分配策略有哪些?简单说明在什么情况下使用哪种存储分配策略。7.8 C+语言中关于变量的存储类型符有 4 个:auto、 register、static 和 extern,请说明每个说明符所表示的存储方式。7.9 为下面 FORTRAN 程序的运行时环境构造出一个可能的组织结构,要保证

29、对 AVE 的调用时存在的一个存储器指针(参考 7.4 节)。REAL A(SIZE), AVEINTEGER N, I10 READ *, NIF (N .LE. 0 .OR. N .GT. SIZE) GOTO 99READ *, (A(I), I=1, N)PRINT *, AVE = , AVE(A, N)GOTO 1099 CONTINUEENDREAL FUNCTION AVE (B, N)INTEGER I, NREAL B(N), SUMSUM = 0.0DO 20 I=1, N20 SUM = SUM+B(I)AVE = SUM/NEND7.10 考虑 C 语言中的下列过程:

30、void f ( char c, char s10, double r) int * x;编译原理与技术练习题 16int y 5;(1)使用标准 C 参数传递约定,利用 7.5.1 所描述的活动记录结构判断以下的 fp 的偏移:c,s7和 y2(假设数据大小为:整型2 个字节,字符 1 个字节,双精度8 个字节,地址4 个字节)(2)假设所有的参数都是按值传递(包括数组),重做( 1);(3)假设所有的参数都是引用传递(包括数组),重做( 1)。7.11 为下面 C 程序的运行时环 境构造出一个可能的组织结构(参考 7.5.1 节)。(1) 在进入函数 f 中的块 A 之后;(2) 在进入函

31、数 g 中的块 B 之后。int a10;char *s = hello;int f ( int i, int b ) int j = 1;A: int i = j;char c = bi;return 0;void g (char *s) char c = s0;B: int a5; main () int x = 1;x = f (x, a);g (s);return 0;编译原理与技术练习题 177.12 使用访问链(参考 7.5.2 节)分别画出下面 Pascal 程序执行到(1( 第 1 次调用 r 之后的运行 时栈的内容;(2( 第 2 次调用 r 之后的运行 时栈的内容;prog

32、ram pascal1;procedure p;var x: integer;procedure q;procedure r;beginx := 2;if . then p;end; r beginr;end; q beginq;end; p begin pascal1 p;end.7.13 使用显示表 display 重做练习 7.12。7.14 对下面的 Pascal 程序,分别画出程序执行到点(1)和(2)时刻的运行时栈的内容。program pascal2 (input, output);var i: integer; d: integer;procedure a ( k: real

33、);var p: char;procedure b;var c: char;编译原理与技术练习题 18begin.(1).end: bprocedure c;var t: real;begin.(2).end: cbeginb;c;end; abegin pascal2 a (d);end. 7.15 使用显示表 display 重做练习 7.14。7.16 实现栈式动态存储管理的一个问题是,如何分配空 闲块 。请考虑有几种空闲块的分配策略,并比较每个策略的优缺点。7.17 了解面向对象语言(如面向对象 Pascal、C+、C#、Java)是如何实现垃圾搜集任务的。7.18 存储紧缩有时也称为

34、“单空间复制”,以区别双空间复制,请指出两者的相同之处和差异。7.19 为以下的 C+类画出对象的存储器框架和虚拟函数表(参考 7.6.3 节):class A public:int a;virtual void f();virtual void g(); 编译原理与技术练习题 19;class B: public A public:int b;virtual void f();void h();;class C: public B public:int c;virtual void g(); 编译原理与技术练习题 20练习 88.1 语义分析的基本任务是什么?请简单说明它们可以在编译的哪些阶

35、段或者由编译的哪些模块完成?8.2 考虑下列无符号数的简单语法:number digit number | digitdigit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9写出计算 number 整数值的属性规则。8.3 根据下列文法,给出求十 进制浮点数的值的语义规则 (提示:用属性 count 表示小数点后的数字数目):num num.numnum num digit | digitdigit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 98.4 考虑下面的简单的 Pascal 风格的声明:decl var-list:typeva

36、r-list var-list,id | idtype integer | real(1)为它设计一个计算变量类型的属性文法;(2)为每个产生式对应的属性文法划一个依赖图;(3)为声明 a, b, c: real 画出属性依 赖图。8.5 修改例 8.4 中的文法 G8.3,使之只用综合属性就可以计算 based-num 的值。8.6 考虑下列属性文法:文法规则 语义规则S ABC B.u := S.uA.u := B.v + C.vS.v := A.vA a A.v := 2*A.uB b B.vl := B.uC c C.v := 1编译原理与技术练习题 21(1) 构造出串 abc 的分

37、析树及其属性依赖图,并 给出计算这些属性的一个正确顺序;(2) 假设 S.u 在属性求值之前的 值是 3,那么 S.v 在属性求值之后的值是什么?(3) 如果语义规则修改如下,问题(2)的结果如何?文法规则 语义规则S ABC B.u := S.uC.u := A.vA.u := B.v + C.vS.v := A.vA a A.v := 2*A.uB b B.vl := B.uC c C.v := C.u 28.7 设计有向图的一个拓扑排序算法,并用高级程序语言 实现。8.8 一个包含了综合属性和继承属性的属性文法中,如果综合属性依赖于继承属性(以及其它综合属性),但是继承属性不依赖任何 综

38、合属性,那么,用一趟混合的后序遍 历和前序遍历就可以计算所有的属性值。请用高级语言或 伪代码设计这个算法。8.9 例 8.11 中的三个属性 isFloat、etype 和 val 的语义规则如表 8.8 所示,它们需要遍历分析树或语法树两次才能计算出来。第一遍后序遍 历计算出综合属性 isFloat 的值,第二遍用混合的前序遍历和后序遍历计算出继承属性 etype 与综合属性 val 的值 。(1)请用高级语言或伪代码设计这个算法;(2)描述 5/2/2.0 属性的计算过程。8.10 请按照例 8.14 中的语义规则,画出 float x, y 的带属性的分析树以及依赖关系图。8.11 考虑

39、文法S ( L ) | aL L, S | S(1)写一个打印括号对数的属性文法;(2)写一个翻译模式,它输出每个 a 的嵌套深度。例如,对于输入串(a, (a, a)的输出是 1,2,2。(3)写一个翻译模式,它打印出每个 a 在句子中的位置。例如,对于输入串(a, (a, a)的结果是2,5,7。8.12 下列文法由 S 符号开始产生一个二进制数,令 综合属性 val 给出该数的值:S L.L | L编译原理与技术练习题 22L LB | BL 0 | 1请设计求 S.val 的属性文法。其中 B 的唯一综合属性 c 给出由 B 产生的二进位的结果值。例如,输入101.101 时,S.va

40、l 是 5.625,其中第一个二进位的值是 4,最后一个二进位的值是 0.125。8.13 考虑下列类似于 C 语言包含 赋值语句的表达式的文法S EE E := E | E + E | (E) | id即 b := c 表示把 c 的值赋给 b 的赋值表达式,而 a:= ( b:= c)表示 c 的值赋给 b 后再赋给 a。试构造语义规则,检查表达式的左部是一个左 值。提示:同非 终结符 E 的继承属性 side 表示生成的表达式出现在赋值运算符的左边还是右边。8.14 请根据例 8.5 的属性文法,(1)把语义规则翻译成 LR 属性求 值器的栈操作代码(参考例 8.12);(2)建立对应的

41、翻译模式;(3)消除基础文法的左递归,对 新增的符号增加综合属性和 继承属性, 编写无左递归的翻译模式;(4)编写它的递归下降属性求值器。8.15 为下列类型写出类型表达式(1)指向实数的指针数组,下标 范围从 1 到 100;(2)二维数组,行的下标从 1 到 10,列的下 标从10 到 10;(3)一个函数,它的定义域是从整型到整型指 针的函数, 值 域是一个实型和字符组成的记录。8.16 对下面 C 语言的声明:typedef struct int a,b: CELL, *PCELL;CELL foo100;PCELL bar(x, y) int;CELL y;.试为类型 foo 和函数

42、 bar 写出 类型表达式。8.17 下列是一个包含文字串表的文法,其中符号的含义和 图 8.15 中的一样。只是增加了 类型 list,它表示一个元素表,表中类型由 of 后面的类型 T 确定。试设计一个翻译模式/ 语义规则,确定表达编译原理与技术练习题 23式(E)和 (L)的类 型。P D; ED D; D | id:T T list of T | char | integerE (L) | literal | num | idE E; L | E8.18 修改表 8.15 的语义规则,使之可以 处理(1)有值语句。赋值语句的值是 赋值号:= 右边表达式的值;条件语句和循环语句的值是语句

43、体的值;顺序语句的值是该序列中最后一个语句的值;(2)布尔表达式。增加逻辑运算符 and、or 和 not 以及关系运算符、和,并且增加相应的翻译规则,给出这些表达式的 类型。编译原理与技术练习题 24练习 99.1 把下列表达式变换成后缀式:(1)23ab(2)ab + 2cd(3)(x := x +3) 4(4)(x := y := 2) + 3(x := 4)9.2 把下列表达式变换成后缀式:(1)(not A and B) or (C or not D)(2)(A or B) and (C or not D and E)(3)if (x+y) z = 0 then (a+b) c el

44、se (ab) +b(4)aai = b j+29.3 请把 do S while E 和 for (V = E1; E2; E3) S 形式的循环语句写成后缀式。9.4 如果允许处理过程递归,还需要改变表 9.7 的翻译模式。在产生式 D proc id; N D1; S 的 S 之前,执行语义动作把 id 插入其直接外 围过程的符号表。 请通过引入非终结符 R 及其产生式,修改表 9.7的语义动作,使它能够处理递归过 程调用。9.5 请根据表 9.7 的语义动作, 补充图 9.4 中符号表的构造 过程,画出符号表以及 tblptr 和 offset:(1)当编译扫描完 quicksort

45、的局部变量说明 var k, v: integer;时;(2)当编译扫描完 partition 的声明、在局部变量说明 var i, j: integer;之前;(3)当编译扫描完 partition 的整个 过程时。9.6 把下列表达式翻译成三地址代码:(1)x := y*(- a + b)(2)i := (j+k)*(10+m)9.7 一般而言,程序设计语言都把算 术表达式中不同类型的运算数 进行转换,通常的 规则是把整数转换成实数,然后进行运算。为了区别不同类型的运算,可以在运算符前加上类型,如实数加法的符号是 real+,整数乘法的符号是 int*。(1)请利用单目转换符 inttor

46、eal 以及表示类型的运算符,修改表 9.9 文法中加法表达式翻译规则,插入必要的类型转换。 (提示:参考图 9.6 和表 7.16,使用 E 的属性 type 和 place)(2)把下列程序段的执行语句翻译成三地址代码:编译原理与技术练习题 25float x, y;int a, b;x := y + a*b9.8 用 9.3 节所给的翻译模式,把下列 赋值语句翻译成三地址代 码:(1)ai+j := ai+aj*10(2)Ai, j := Bi, j + CAk, 1 + Di+19.9 按照表 9.11 翻译模式把下列布尔表达式翻译成三地址码(假设语句起始标号是 10):(1)ac9.

47、10 按照表 9.12 翻译模式把 9.9 题目中的布尔表达式翻译成三地址码。9.11 利用回填技术把 9.9 题目中的布尔表达式翻译成四元式,假设语句起始标号是 10,真 值出口是100,假值出口是 200。9.12 根据 9.4.2 节的翻译规则,把下列 语句翻译成抽象的三地址代 码:(1)while a d doif a = 1 then c := c + 1 elsewhile a b and cd or e j goto L2a := u2L2: i := u3goto L110.4 对下列中间代码序列编译原理与技术练习题 28(1) T1 := B CT2 := AT1T3 := D + 1T4 := E FT5 := T3T4W := T2/T5W 是基本块出口的活跃变量(2) T1 := A + BT

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

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

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


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

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

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