编译原理 龙书答案

合集下载

《编译原理》课后习题答案第三章第3章文法和语言第1

《编译原理》课后习题答案第三章第3章文法和语言第1

《编译原理》课后习题答案第三章第3 章文法和语言第1 题文法G=({A,B,S},{a,b,c},P,S)其中P 为:S→Ac|aBA→abB→bc写出L(G[S])的全部元素。

答案:L(G[S])={abc}第2 题文法G[N]为:N→D|NDD→0|1|2|3|4|5|6|7|8|9G[N]的语言是什么?答案:G[N]的语言是V+。

V={0,1,2,3,4,5,6,7,8,9}N=>ND=>NDD.... =>NDDDD...D=>D......D或者:允许0 开头的非负整数?第3题为只包含数字、加号和减号的表达式,例如9-2+5,3-1,7等构造一个文法。

答案:G[S]:S->S+D|S-D|DD->0|1|2|3|4|5|6|7|8|9第4 题已知文法G[Z]:Z→aZb|ab写出L(G[Z])的全部元素。

盛威网()专业的计算机学习网站 1《编译原理》课后习题答案第三章答案:Z=>aZb=>aaZbb=>aaa..Z...bbb=> aaa..ab...bbbL(G[Z])={anbn|n>=1}第5 题写一文法,使其语言是偶正整数的集合。

要求:(1) 允许0 打头;(2)不允许0 打头。

答案:(1)允许0 开头的偶正整数集合的文法E→NT|DT→NT|DN→D|1|3|5|7|9D→0|2|4|6|8(2)不允许0 开头的偶正整数集合的文法E→NT|DT→FT|GN→D|1|3|5|7|9D→2|4|6|8F→N|0G→D|0第6 题已知文法G:<表达式>::=<项>|<表达式>+<项><项>::=<因子>|<项>*<因子><因子>::=(<表达式>)|i试给出下述表达式的推导及语法树。

(5)i+(i+i)(6)i+i*i盛威网()专业的计算机学习网站 2 《编译原理》课后习题答案第三章答案:<表达式><表达式> + <项><因子><表达式><表达式> + <项><因子>i<项><因子>i<项><因子>i( )(5) <表达式>=><表达式>+<项>=><表达式>+<因子>=><表达式>+(<表达式>)=><表达式>+(<表达式>+<项>)=><表达式>+(<表达式>+<因子>)=><表达式>+(<表达式>+i)=><表达式>+(<项>+i)=><表达式>+(<因子>+i)=><表达式>+(i+i)=><项>+(i+i)=><因子>+(i+i)=>i+(i+i)<表达式><表达式> + <项><项> * <因子><因子> i<项><因子>ii(6) <表达式>=><表达式>+<项>=><表达式>+<项>*<因子>=><表达式>+<项>*i=><表达式>+<因子>*i=><表达式>+i*i=><项>+i*i=><因子>+i*i=>i+i*i盛威网()专业的计算机学习网站 3《编译原理》课后习题答案第三章第7 题证明下述文法G[〈表达式〉]是二义的。

编译原理课后习题答案+清华大学出版社第二版

编译原理课后习题答案+清华大学出版社第二版
也称基地址。 SL: 静态链,指向定义该过程的直接外过程(或主程序)运行时最新数据段的基地址,
用以引用非局部(包围它的过程)变量时,寻找该变量的地址。 DL: 动态链,指向调用该过程前正在运行过程的数据段基地址,用以过程执行结束释放
数据空间时,恢复调用该过程前运行栈的状态。 RA: 返回地址,记录调用该过程时目标程序的断点,即调用过程指令的下一条指令的地
编译程序大致有哪几种开发技术?
答案:
(1)自编译:用某一高级语言书写其本身的编译程序。 (2)交叉编译:A 机器上的编译程序能产生 B 机器上的目标代码。 (3)自展:首先确定一个非常简单的核心语言 L0,用机器语言或汇编语言书写出它的编
译程序 T0,再把语言 L0 扩充到 L1,此时 L0⊂ L1 ,并用 L0 编写 L1 的编译程序 T1,再把语 言 L1 扩充为 L2,有 L1 ⊂ L2 ,并用 L1 编写 L2 的编译程序 T2,……,如此逐步扩展下 去, 好似滚雪球一样,直到我们所要求的编译程序。 (4)移植:将 A 机器上的某高级语言的编译程序搬到 B 机器上运行。
(main).
答案: 程序执行到赋值语句 b∶=10 时运行栈的布局示意图为:
1
《编译原理》课后习题答案第二章
第 3题 写出题 2 中当程序编译到 r 的过程体时的名字表 table 的内 容。
name
kind
level/val
adr
size
答案:
题 2 中当程序编译到 r 的过程体时的名字表 table 的内容为:
盛威网()专业的计算机学习网站
2
《编译原理》课后习题答案第一章
合实现方案,即先把源程序翻译成较容易解释执行的某种中间代码程序,然后集中解释执行 中间代码程序,最后得到运行结果。

编译原理(龙书)答案

编译原理(龙书)答案

计算机系统结构习题课一
2013-4-8
处理机4:零地址指令系统(堆栈型处理) 1 PUSH A 2 PUSH B 3 ADD 4 PUSH C 5 MUL 6 PUSH D 7 PUSH E 8 MULL 9 ADD 10 PUSH F 11 PUSH G 12 SUB 13 DIV 14 POP X
计算机系统结构习题课一
2013-4-8
处理机3:一地址指令系统 1 LOAD F ;叏f到累加器中 2 SUB G 3 STORE X 4 LOAD D 5 MUL E 6 STORE Y 7 LOAD A 8 ADD B 9 MUL C 10 ADD Y 11 DIV X 12 STORE X 指令次数:12 访存次数=12(叏指令)+12=24 程序存储量=12P+12A=36B 执行速度=12P+12A+12D=84B
计算机系统结构 习题课一
郭义凡 2013.4.8
• • • •
透明性 规格化浮点数 地址码的优化表示 延时转移/指令叏消技术
计算机系统结构习题课一
2013-4-8
1 透明性
迚程 虚拟存储器 文件 主存 I/O设备 硬件 软件
指令集结构
处理器 虚拟机
操作系统(系统程序员) 应用程序(应用程序员)
操作系统提供的抽象表示 和 计算机系统的分层表示
2 21
2[log
rm ]1
* 2 p2 2 4 1 * 2 6*4 2 21
p----尾数长度 p2---二迚制尾数长度 尾数的基 r >2时,p
m


p2
2013-4-8
计算机系统结构习题课一
3 地址码的优化表示

编译原理 龙书答案

编译原理 龙书答案

第四章部分习题解答Aho:《编译原理技术与工具》书中习题(Aho)4.1 考虑文法S → ( L ) | aL → L, S | Sa)列出终结符、非终结符和开始符号解:终结符:(、)、a、,非终结符:S、L开始符号:Sb)给出下列句子的语法树i)(a, a)ii)(a, (a, a))iii)(a, ((a, a), (a, a)))c)构造b)中句子的最左推导i)S(L)(L, S) (S, S) (a, S) (a, a)ii)S(L)(L, S) (S, S) (a, S) (a, (L)) (a, (L, S)) (a, (S, S)) (a, (a, S) (a, (a, a))iii)S(L)(L, S) (S, S) (a, S) (a, (L)) (a, (L, S)) (a, (S, S)) (a, ((L), S)) (a, ((L, S), S)) (a, ((S, S), S)) (a, ((a, S), S))(a, ((a, a), S)) (a, ((a, a), (L))) (a, ((a, a), (L, S))) (a, ((a, a), (S, S))) (a, ((a, a), (a, S))) (a, ((a, a), (a, a)))d)构造b)中句子的最右推导i)S(L)(L, S) (L, a) (S, a) (a, a)ii)S(L)(L, S) (L, (L)) (L, (L, S)) (L, (L, a)) (L, (S, a)) (L, (a, a)) (S, (a, a)) (a, (a, a))iii)S(L)(L, S) (L, (L)) (L, (L, S)) (L, (L, (L))) (L, (L, (L, S))) (L, (L, (L, a))) (L, (L, (S, a))) (L, (L, (a, a))) (L, (S,(a, a))) (L, ((L), (a, a))) (L, ((L, S), (a, a))) (L, ((L, a), (a,a))) (L, ((S, a), (a, a))) (L, ((a, a), (S, S))) (S, ((a, a), (a,a))) (a, ((a, a), (a, a)))e)该文法产生的语言是什么解:设该文法产生语言(符号串集合)L,则L = { (A1, A2, …, A n) | n是任意正整数,A i=a,或A i∈L,i是1~n之间的整数}(Aho)4.2考虑文法S→aSbS | bSaS |a)为句子构造两个不同的最左推导,以证明它是二义性的S aSbS abS abaSbS ababS ababS aSbS abSaSbS abaSbS ababS ababb)构造abab对应的最右推导S aSbS aSbaSbS aSbaSb aSbab ababS aSbS aSb abSaSb abSab ababc)构造abab对应语法树d)该文法产生什么样的语言?解:生成的语言:a、b个数相等的a、b串的集合(Aho)4.3 考虑文法bexpr→bexpr or bterm | btermbterm→bterm and bfactor | bfactorbfactor→not bfactor | ( bexpr ) | true | falsea)试为句子not ( true or false)构造分析树解:b)试证明该文法产生所有布尔表达式证明:一、首先证明文法产生的所有符号串都是布尔表达式变换命题形式——以bexpr、bterm、bfactor开始的推导得到的所有符号串都是布尔表达式最短的推导过程得到true、false,显然成立假定对步数小于n的推导命题都成立考虑步数等于n 的推导,其开始推导步骤必为以下情况之一bexpr bexpr or btermbexpr btermbterm bterm and bfactorbexpr bfactorbfactor not bfactorbfactor ( bexpr )而后继推导的步数显然<n,因此由归纳假设,第二步句型中的NT推导出的串均为布尔表达式,这些布尔表达式经过or、and、not运算或加括号,得到的仍是布尔表达式因此命题一得证。

编译原理(龙书)课后习题解答(详细)

编译原理(龙书)课后习题解答(详细)

编译原理(龙书)课后习题解答(详细)编译原理(龙书)课后题解答第一章1.1.1 :翻译和编译的区别?答:翻译通常指自然语言的翻译,将一种自然语言的表述翻译成另一种自然语言的表述,而编译指的是将一种高级语言翻译为机器语言(或汇编语言)的过程。

1.1.2 :简述编译器的工作过程?答:编译器的工作过程包括以下三个阶段:(1) 词法分析:将输入的字符流分解成一个个的单词符号,构成一个单词符号序列;(2) 语法分析:根据语法规则分析单词符号序列中各个单词之间的关系,确定它们的语法结构,并生成抽象语法树;(3) 代码生成:根据抽象语法树生成目标程序(机器语言或汇编语言),并输出执行文件。

1.2.1 :解释器和编译器的区别?答:解释器和编译器的主要区别在于执行方式。

编译器将源程序编译成机器语言或汇编语言等,在运行时无需重新编译,程序会一次性运行完毕;而解释器则是边翻译边执行,每次执行都需要进行一次翻译,一次只执行一部分。

1.2.2 :Java语言采用的是解释执行还是编译执行?答:Java一般是编译成字节码的形式,然后由Java虚拟机(JVM)进行解释执行。

但是,Java也有JIT(即时编译器)的存在,当某一段代码被多次执行时,JIT会将其编译成机器语言,提升代码的执行效率。

第二章2.1.1 :使用BNF范式定义简单的加法表达式和乘法表达式答:<加法表达式> ::= <加法表达式> "+" <乘法表达式> | <乘法表达式><乘法表达式> ::= <乘法表达式> "*" <单项式> | <单项式><单项式> ::= <数字> | "(" <加法表达式> ")"2.2.3 :什么是自下而上分析?答:自下而上分析是指从输入字符串出发,自底向上构造推导过程,直到推导出起始符号。

编译原理

编译原理

《编译原理》课后习题答案第 1 章引论第 1 题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。

(2)源程序:源语言编写的程序称为源程序。

(3)目标程序:目标语言书写的程序称为目标程序。

(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。

通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。

(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。

(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。

第 2 题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。

一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。

其各部分的主要功能简述如下。

词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。

语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。

语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。

中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。

中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。

目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。

表格管理程序:负责建立、填写和查找等一系列表格工作。

表格的作用是记录源程序的各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。

编译原理 龙书 第二版 第5、6章

编译原理 龙书 第二版 第5、6章
elseE.type=float
2)E->T
E.type=T.type
3)T->num
T.type=integer
4)T->num.num
T.type=float
(2)
产生式
语义规则
1)E->E1+T
If E1.type ==T.type then E.type=E1.type
Else begin
E.type=float
105: goto–
6)按照产生式B->B1 || M B2进行归约
7)按照产生式B->(B1)进行归约
8)按照产生式B->B1 && M B2进行归约
9)各子表达式的truelist和falselist在上图中已标出
3)三元式序列
4)间接三元式序列
答:(1)抽象语法树
(2) 四元式序列
t1=b+c
t2=minus t1
t3=a+t2
op
Arg1

result
0
+
b
c
T1
1
minus
T1
T2
2
+
a
T2
T3
(3)三元式序列
op
Arg1
Arg2
0
+
b
c
1
minus
(0)
2
+
a
(1)
(4)间接三元式序列
10
(0)
E.type=T.type; E.val=T.val
3)T->num
T.type=integer; T.val=num

编译原理课后答案

编译原理课后答案

<表达式>AVV ------ *第二早1、 L(G[S])={ abc }2、 L(G[N])={ n 位整数或空字符串| n>0}3、 G[E] : E —>E+D | E-D | DD —>0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 94、 L(G[Z])={ a n b n | n>0 }5、(1)考虑不包括“ 0”的情况G[S]: S — >0S | ABC | 2 | 4| 6 | 8A —>1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9B —>AB | 0B | &C —>0 | 2 | 4 | 6 | 8考虑包括“ 0”的情况: G[S]: S — >AB | CB —>AB | CA —>0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 C —>0 | 2 | 4 | 6 | 8(2)方法1:G[S]: S — > ABC | 2 | 4 | 6 | 8A —>1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9B —>AB | 0B | &C —>0 | 2 | 4 | 6 | 8方法2:G[S]: S — >AB | CB —> AB | 0B |C | 0A —> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 C —>2 | 4 | 6 | 8&设<表达式 >为E , <项>为T , <因子〉为F ,注:推导过程不能省略,以下均为最 左推导(1) E => T => F => i(4) E => E+T => T+T => T*F+T => F*F+T => i*F+T => i*i+T => i*i+F => i*i+i (6) E => E+T => T+T => F+T => i+T => i+T*F => i+F*F => i+i*F => i+i*I8、 是有二义性的,因为句子abc 有两棵语法树(或称有两个最左推导或有两个最右 推导)ii<表达式>最左推导1: S => Ac => abc最左推导2:S => aB => abc9、⑴a a(2) 该文法描述了变量a和运算符+、*组成的逆波兰表达式10、(1)该文法描述了各种成对圆括号的语法结构(2)是有二义性的,因为该文法的句子()()存在两种不同的最左推导:最左推导1:S => S(S)S => (S)S => ()S => ()S(S)S => ()(S)S => ()()S => ()() 最左推导2:S => S(S)S => S(S)S(S)S => (S)S(S)S=> ()S(S)S => ()(S)S => ()()S => ()()11、⑴因为从文法的开始符E出发可推导出E+T*F,推导过程如下:E => E+T =>E+T*F,所以E+T*F 是句型。

习题参考答案-编译原理及实践教程(第3版)-黄贤英-清华大学出版社

习题参考答案-编译原理及实践教程(第3版)-黄贤英-清华大学出版社

附录部分习题参考答案第1章习题1. 解释下列术语。

翻译程序,编译程序,解释程序,源程序,目标程序,遍,前端,后端解答:略!2. 高级语言程序有哪两种执行方式?阐述其主要异同点。

描述编译方式执行程序的过程。

解答:略!3. 在你所使用的C语言编译器中,观察程序1.1经过预处理、编译、汇编、链接四个过程生成的中间结果。

解答:略!4. 编译程序有哪些主要构成成分?各自的主要功能是什么?解答:略!5. 编译程序的构造需要掌握哪些原理和技术?编译程序构造工具的作用是什么?解答:略!6. 复习C语言,其字母表中有哪些符号?有哪些关键字、运算符和界符?标识符、整数和实数的构成规则是怎样的?各种语句和表达式的结构是什么样的?解答:略!7.编译技术可应用在哪些领域?解答:略!8. 你能解释在Java编译器中,输入某个符号后会提示一些单词、某些单词会变为不同的颜色是如何实现的吗?你能解释在Code Blocks中在输入{后,会自动添加},输入do 会自动添加while()是为什么吗?解答:略!第2章习题1. 判断题,对下面的陈述,正确的在陈述后的括号内画√,否则画×。

(1) 有穷自动机识别的语言是正规语言。

()(2) 若r1和r2是Σ上的正则表达式,则r1|r2也是。

()(3) 设M是一个NFA,并且L(M)={x,y,z},则M的状态数至少为4个。

()(4) 令Σ={a,b},则所有以b开头的字构成的正规集的正则表达式为b*(a|b)*。

()(5) 对任何一个NFA M,都存在一个DFA M',使得L(M')=L(M)。

()1解答:略!2.从供选择的答案中,选出应填入下面叙述中?内的最确切的解答。

有穷自动机可用五元组(Q,V T,δ,q0,Q f)来描述,设有一有穷自动机M定义如下:V T={0,1},Q={q0,q1,q2},Q f={q2},δ的定义为:δ (q0,0)=q1δ (q1,0)=q2δ (q2,1)=q2δ (q2,0)=q2M是一个 A 有穷状态自动机,它所对应的状态转换图为 B ,它所能接受的语言可以用正则表达式表示为 C 。

编译原理 龙书 第二版 第5、6章

编译原理 龙书 第二版 第5、6章
L.syn=L’.syn
4)L’->BL1’
L1’.m=L’.m*L’.m;L1’.side=L’.side
L1’.inh=L’.inh*L’.side+B*L1’.m
L’.syn=L1’.syn
5)L’->ε
L’.syn=L’.inh
6)B->0
B.val=0
7)B->1
B.val=1
练习5.3.1:下面是涉及运算符+和整数或浮点运算分量的表达式文法。区分浮点数的方法是看它有无小数点。
E-〉E+T|T T-〉num.num|num
1)给出一个SDD来确定每个项T和表达式E的类型
2)扩展(1)中得到的SDD,使得它可以把表达式转换成为后缀表达式。使用一个单目运算符intToFloat把一个整数转换为相等的浮点数
答:
(1)
产生式
语义规则
1)E->E1+T
If E1.type ==T.type then E.type=E1.type
2)四元式序列
3)三元式序列
4)间接三元式序列
答:(1)抽象语法树
(2) 四元式序列
t1=b+c
t2=minus t1
t3=a+t2
op
Arg1
Arg2
result
0
+
b
c
T1
1
minus
T1
T2
2
+
a
T2
T3
(3)三元式序列
op
Arg1
Arg2
0
+
b
c
1
minus
(0)

编译原理龙书第二版课后答案

编译原理龙书第二版课后答案

编译原理龙书第二版课后答案【篇一:编译原理习题答案,1-8 章龙书第二版7.8 章】6 :c 语言函数 f 的定义如下:int f(int x, *py, **ppz){**ppz +=1 ; *py +=2 ;x +=3; return x+*py+**ppz;}变量 a 是一个指向 b 的指针;变量 b 是一个指向 c 的指针,而 c 是一个当前值为 4 的整数变量。

如果我们调用 f(c,b,a), 返回值是什么?答: x 是传值 ,而 b 和 c 是传地址方式;由函数定义可以得到: b=c,a=b, 而**a=**a+1=c+1=5 = c=5; *b=*b+2=c+2=7 =c=7,**a=7;c=c+3=4+3=7所以调用 f(c,b,a) 返回值是 7+7+ 7=21练习7.3.2 :假设我们使用显示表来实现下图中的函数。

请给出对fib0 (1)的第一次调用即将返回时的显示表。

同时指明那时在栈中的各种活动记录中保存的显示表条目答:结果如下第八章练习 8.2.1 :假设所有的变量都存放在内存中,为下面的三地址语句生成代码:5)下面的两个语句序列x=b*cy=a+x答:生成的代码如下练习 8.5.1 :为下面的基本块构造构造dagd=b*ce=a+bb=b*ca=e-d答: dag 如下练习 8.6.1 :为下面的每个 c 语言赋值语句生成三地址代码1)x=a+b*c答:生成的三地址代码如下【篇二:编译原理龙书第二版第4章】.1:考虑上下文无关文法: s-s s +|s s *|a 以及串 aa + a* (1) 给出这个串的一个最左推导 s - s s * - s s + s * - a s + s * - a a + s * - aa+a*(3)给出这个串的一棵语法分析树习题 4.3.1 :下面是一个只包含符号 a 和 b 的正则表达式的文法。

它使用 +替代表示并运算的符号 |,以避免和文法中作为元符号使用的竖线相混淆: rexpr? rexpr + rterm | rterm rterm?rterm rfactor |rfactor rfactor? rfactor * | rprimary rprimary?a | b 1)对这个文法提取公因子2)提取公因子的变换使这个文法适用于自顶向下的语法分析技术吗?3)提取公因子之后,原文法中消除左递归 4) 得到的文法适用于自顶向下的语法分析吗?解1)提取左公因子之后的文法变为rexpr? rexpr + rterm | rterm rterm?rterm rfactor |rfactor rfactor? rfactor * | rprimary rprimary?a | b2)不可以,文法中存在左递归,而自顶向下技术不适合左递归文法3)消除左递归后的文法rexpr - rterm rexpr’rexpr rterm ’-+ rterm rexpr’|? rterm- rfactor rterm’ rterm-rfactor’’ |? rfactor- rprimay rfactor’ rfactor-*rfactor’’ |? rprimary- a| b4)该文法无左递归,适合于自顶向下的语法分析习题 4.4.1 :为下面的每一个文法设计一个预测分析器,并给出预测分析表。

编译原理教程课后习题答案

编译原理教程课后习题答案

编译原理教程课后习题答案【篇一:编译原理教程课后习题答案——第一章】完成下列选择题:(1) 构造编译程序应掌握a. 源程序b. 目标语言c. 编译方法d. 以上三项都是(2) 编译程序绝大多数时间花在上。

a. 出错处理b. 词法分析c. 目标代码生成d. 表格管理(3) 编译程序是对。

a. 汇编程序的翻译b. 高级语言程序的解释执行c. 机器语言的执行d. 高级语言的翻译【解答】(1) d (2) d(3) d1.2 计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?【解答】计算机执行用高级语言编写的程序主要有两种途径:解释和编译。

在解释方式下,翻译程序事先并不采用将高级语言程序全部翻译成机器代码程序,然后执行这个机器代码程序的方法,而是每读入一条源程序的语句,就将其解释(翻译)成对应其功能的机器代码语句串并执行,而所翻译的机器代码语句串在该语句执行后并不保留,最后再读入下一条源程序语句,并解释执行。

这种方法是按源程序中语句的动态执行顺序逐句解释(翻译)执行的,如果一语句处于一循环体中,则每次循环执行到该语句时,都要将其翻译成机器代码后再执行。

在编译方式下,高级语言程序的执行是分两步进行的:第一步首先将高级语言程序全部翻译成机器代码程序,第二步才是执行这个机器代码程序。

因此,编译对源程序的处理是先翻译,后执行。

从执行速度上看,编译型的高级语言比解释型的高级语言要快,但解释方式下的人机界面比编译型好,便于程序调试。

这两种途径的主要区别在于:解释方式下不生成目标代码程序,而编译方式下生成目标代码程序。

1.3 请画出编译程序的总框图。

如果你是一个编译程序的总设计师,设计编译程序时应当考虑哪些问题?【解答】编译程序总框图如图1-1所示。

作为一个编译程序的总设计师,首先要深刻理解被编译的源语言其语法及语义;其次,要充分掌握目标指令的功能及特点,如果目标语言是机器指令,还要搞清楚机器的硬件结构以及操作系统的功能;第三,对编译的方法及使用的软件工具也必须准确化。

(完整版)编译原理课后习题答案

(完整版)编译原理课后习题答案

(完整版)编译原理课后习题答案第一章1.典型的编译程序在逻辑功能上由哪几部分组成?答:编译程序主要由以下几个部分组成:词法分析、语法分析、语义分析、中间代码生成、中间代码优化、目标代码生成、错误处理、表格管理。

2. 实现编译程序的主要方法有哪些?答:主要有:转换法、移植法、自展法、自动生成法。

3. 将用户使用高级语言编写的程序翻译为可直接执行的机器语言程序有哪几种主要的方式?答:编译法、解释法。

4. 编译方式和解释方式的根本区别是什么?答:编译方式:是将源程序经编译得到可执行文件后,就可脱离源程序和编译程序单独执行,所以编译方式的效率高,执行速度快;解释方式:在执行时,必须源程序和解释程序同时参与才能运行,其不产生可执行程序文件,效率低,执行速度慢。

第二章1.乔姆斯基文法体系中将文法分为哪几类?文法的分类同程序设计语言的设计与实现关系如何?答:1)0型文法、1型文法、2型文法、3型文法。

2)2. 写一个文法,使其语言是偶整数的集合,每个偶整数不以0为前导。

答:Z→SME | BS→1|2|3|4|5|6|7|8|9M→ε | D | MDD→0|SB→2|4|6|8E→0|B3. 设文法G为:N→ D|NDD→ 0|1|2|3|4|5|6|7|8|9请给出句子123、301和75431的最右推导和最左推导。

答:N?ND?N3?ND3?N23?D23?123N?ND?NDD?DDD?1DD?12D?123N?ND?N1?ND1?N01?D01?301N?ND?NDD?DDD?3DD?30D?301N?ND?N1?ND1?N31?ND31?N431?ND431?N5431?D5431?7 5431N?ND?NDD?NDDD?NDDDD?DDDDD?7DDDD?75DDD?754 DD?7543D?75431 4. 证明文法S→iSeS|iS| i是二义性文法。

答:对于句型iiSeS存在两个不同的最左推导:S?iSeS?iiSesS?iS?iiSeS所以该文法是二义性文法。

编译原理 龙书答案

编译原理 龙书答案

第四章部分习题解答Aho:《编译原理技术与工具》书中习题(Aho)4.1 考虑文法S →( L ) | aL →L, S | Sa)列出终结符、非终结符和开始符号解:终结符:(、)、a、,非终结符:S、L开始符号:Sb)给出下列句子的语法树i)(a, a)ii)(a, (a, a))iii)(a, ((a, a), (a, a)))c)构造b)中句子的最左推导i)S⇒(L)⇒(L, S) ⇒(S, S) ⇒(a, S) ⇒(a, a)ii)S⇒(L)⇒(L, S) ⇒(S, S) ⇒(a, S) ⇒(a, (L)) ⇒(a, (L, S)) ⇒(a, (S, S)) ⇒(a, (a, S) ⇒(a, (a, a))iii)S⇒(L)⇒(L, S) ⇒(S, S) ⇒(a, S) ⇒(a, (L)) ⇒(a, (L, S)) ⇒(a, (S, S)) ⇒(a, ((L), S)) ⇒(a, ((L, S), S)) ⇒(a, ((S, S), S)) ⇒(a, ((a, S), S)) ⇒(a, ((a, a), S)) ⇒(a, ((a, a), (L)))⇒(a, ((a, a), (L, S))) ⇒(a, ((a, a), (S, S))) ⇒(a, ((a, a), (a, S))) ⇒(a, ((a, a), (a, a))) d)构造b)中句子的最右推导i)S⇒(L)⇒(L, S) ⇒(L, a) ⇒(S, a) ⇒(a, a)ii)S⇒(L)⇒(L, S) ⇒ (L, (L)) ⇒(L, (L, S)) ⇒(L, (L, a)) ⇒(L, (S, a)) ⇒(L, (a, a)) ⇒(S, (a, a)) ⇒(a, (a, a))iii)S⇒(L)⇒(L, S) ⇒(L, (L)) ⇒(L, (L, S)) ⇒(L, (L, (L))) ⇒(L, (L, (L, S))) ⇒(L, (L, (L,a))) ⇒(L, (L, (S, a))) ⇒(L, (L, (a, a))) ⇒(L, (S, (a, a))) ⇒(L, ((L), (a, a))) ⇒(L, ((L,S), (a, a))) ⇒(L, ((L, a), (a, a))) ⇒(L, ((S, a), (a, a))) ⇒(L, ((a, a), (S, S))) ⇒(S, ((a,a), (a, a))) ⇒(a, ((a, a), (a, a)))e)该文法产生的语言是什么解:设该文法产生语言(符号串集合)L,则L = { (A1, A2, …, A n) | n是任意正整数,A i=a,或A i∈L,i是1~n之间的整数}(Aho)4.2考虑文法S→aSbS | bSaS | εa)为句子构造两个不同的最左推导,以证明它是二义性的S⇒aSbS⇒abS⇒abaSbS⇒ababS⇒ababS⇒aSbS⇒abSaSbS⇒abaSbS⇒ababS⇒ababb)构造abab对应的最右推导S⇒aSbS⇒aSbaSbS⇒aSbaSb⇒aSbab⇒ababS⇒aSbS⇒aSb⇒abSaSb⇒abSab⇒ababc)构造abab对应语法树d)该文法产生什么样的语言?解:生成的语言:a、b个数相等的a、b串的集合(Aho)4.3 考虑文法bexpr→bexpr or bterm | btermbterm→bterm and bfactor | bfactorbfactor→not bfactor | ( bexpr ) | true | falsea)试为句子not ( true or false)构造分析树解:b)试证明该文法产生所有布尔表达式证明:一、首先证明文法产生的所有符号串都是布尔表达式变换命题形式——以bexpr、bterm、bfactor开始的推导得到的所有符号串都是布尔表达式最短的推导过程得到true、false,显然成立假定对步数小于n的推导命题都成立考虑步数等于n 的推导,其开始推导步骤必为以下情况之一bexpr⇒bexpr or btermbexpr⇒btermbterm⇒bterm and bfactorbexpr⇒bfactorbfactor⇒not bfactorbfactor⇒ ( bexpr )而后继推导的步数显然<n,因此由归纳假设,第二步句型中的NT推导出的串均为布尔表达式,这些布尔表达式经过or、and、not运算或加括号,得到的仍是布尔表达式因此命题一得证。

编译原理课后习题解答(2)

编译原理课后习题解答(2)

2/7
西北大学 Gong Xq
龙书本科教学版习题解答
仅供教学参考
解答:文法 3) 、4) 、5)有二义性。 证明:3)对文法的句子()(),存在两棵不同的语法分析树如下:
S S
S
(
S ε
)
S ε
S ε
( ε
S
)
S
S ε
(
S ε
)
S ε
S ε
(
S ε
)
S ε
所以文法是二义的。 4)对文法的句子 abab,存在两棵不同的语法分析树如下:
5/7
西北大学 Gong Xq
龙书本科教学版习题解答
仅供教学参考
2.3 节 语法制导翻译
产生式
翻译方案 { E.pre = '+' || E1.pre || T.pre } { E.pre = '-' || E1.pre || T.pre } { E.pre = T.pre } { T.pre = '*' || T1.pre || F.pre } { T.pre = '/' || T1.pre || F.pre } { T.pre = F.pre } {F.pre = id.lexeme} {F.pre = num.value} {F.pre = E.pre} E pre =-9* 52
1)证明:对语法分析树的结点数目使用数学归纳法。 ①归纳基础:当语法分析树有两个结点时,形如
num 11
num 1001
生成的串分别为 11 和 1001,表示的值为 3 和 9,能被 3 整除。 ②归纳步骤: 假设语法分析树的结点数目少于 n 时生成的二进制串的值能被 3 整除, 那么当 结点数目等于 n 时,语法分析树的根有下面两种可能的形式:

编译原理课后习题解答(2)

编译原理课后习题解答(2)

1/7
西北大学 Gong Xq
龙书本科教学版习题解答
仅供教学参考
解答: 1)L={0n1n | n>=1} 证明:①考虑,推导 1 步时,有 S 01 推导 2 步时, S 0S1 0011 以此类推,推导 n 步时,S 0S1 00S11 ... 0...0S1...1 0...01...1 可以得到 n 个 0 和 n 个 1 ②对任意串 0n1n 都存在一个推导 S ... 0...01...1
1)证明:对语法分析树的结点数目使用数学归纳法。 ①归纳基础:当语法分析树有两个结点时,形如
num
num
11
1001
生成的串分别为 11 和 1001,表示的值为 3 和 9,能被 3 整除。 ②归纳步骤:假设语法分析树的结点数目少于 n 时生成的二进制串的值能被 3 整除,那么当 结点数目等于 n 时,语法分析树的根有下面两种可能的形式:
3/7
西北大学 Gong Xq
龙书本科教学版习题解答
仅供教学参考
解答: 1)S → SS+ | SS* | SS- | SS/ | id | num 2)list → list, id | id 3)list → id, list | id 4)E → E + T | E – T | T
T→T*F|T/F|F F → id | num | (E) 5)E → E + T | E – T | T T→T*F|T/F|F F → -E | +E | id | num | (E)
2)文法生成以 a 为基本运算分量的+和-运算的前缀表达式。证明略。
3)文法生成具有对称括号对的串。证明略。
4)文法生成 a 和 b 的个数相等的串。 证明:用关于 a 和 b 个数的归纳法证明。 ①归纳基础:一步推导时,S ϵ,其中 a 和 b 的个数都为 0。 ②归纳步骤:设 S 经过少于 n 步推导得到的串 α 中 a 和 b 的个数相等; 则>=n 步的推导形如 S aSbS … x 或 S bSaS … y aSbS 和 bSaS 中的 S 经过少于 n 步能推出终结符号串,且其中 a 和 b 的个数都相等; 所以经过 aSbS 和 bSaS 推导出的 x 和 y 中的 a 和 b 个数也相等。证毕。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第五章部分习题解答Aho:《编译原理技术与工具》书中习题(Aho)5.3 为下面表达式构造有向无环图,标出结点(子表达式)编号,+是左结合的a + a + (a + a + a + (a + a + a + a))解:(Aho)5.5 设计语法制导定义,实现多项式(包含+和*,如x*(3*x+x*x))的求导,结果无需化简,如3*x直接翻译为3*1+0*x即可。

(思路:(xy)‟=x‟y+y‟x,(x+y)‟=x‟+y‟)解:综合属性diff为求导后的表示形式,val为原多项式表示形式E→E1 + T { E.val = E1.val || “+” || E.val; E.diff = E1.diff || “+” || E.diff; } | T { E.val = T.val; E.diff = T.diff; }T→T1 * F { T.val = T1.val || “*” || F.val;T.diff = “(” || T1.diff || “*” || F.val || “+” || T1.val || “*” || F.diff || “)”; } | F { T.val = F.val; T.diff = F.diff; }F→( E ) { F.val = “(” || E.val || “)”; F.diff = “(” || E.diff || “)”; } | num { F.val = num.val; F.diff = 0; }| x { F.val = “x”; F.diff = 1; }此题和后面两题均可编写Lex&Yacc程序进行验证。

(Aho)5.4 设计翻译模式,实现将中缀表达式翻译为无多余括号形式解:所谓“多余括号”,可以理解为:本该是表达式E,写成了(E)的形式,本该是项T,写成了(T)的形式,本该是因式F,写成了(F)的形式,因此,可写出文法和翻译模式:E→( E1 ) { E.s = E1.s; }| E1 + T { E.s = E1.s || …+‟ || T.s; }| T { E.s = T.s; }T→( T1 ) { T.s = T1.s; }| T1 + F { T.s = T1.s || …*‟ || F.s; }| F { T.s = F.s; }F→( F1 ) { F.s = F1.s; }| ( E ) { F.s = …(… || E.s || …)‟; }| num { F.s = num.lexeme; }| id { F.s = id.lexeme; }显然,这是一个二义性文法,存在移进-归约冲突和归约-归约冲突,但通过分析语法含义,可解决冲突。

我们将E→( E1 )、T→( T1 )、F→( F1 )称为“多余括号产生式”。

显然,“多余括号表达式”存在多个语法树,可通过“多余括号产生式”推导而得,也可仅通过“正常产生式”推导而来,这也是二义性的根源。

而“无多余括号表达式”是不可能通过“多余括号产生式”推导而来的。

因此,对于冲突的情况,我们可以优先选择“多余括号产生式”,确定移进/归约。

在Parser Generator 2工具中,移进/归约冲突总是选择移进,归约/归约冲突选择顺序靠前的产生式。

如上的产生式顺序即可保证每个冲突情况都选择“多余括号产生式”。

(Aho)5.8 令综合属性val给出下列文法S产生的二进制数的值,例如,输入101.101时,S.val=5.625S→L , L | LL→L B | BB→0 | 1设计语法制导定义,实现对S.val的求值,B的综合属性只允许有一个:c,表示B产生的位对最终值的贡献。

S→L1 , L2 {S.val = L1.val + L2.val / L2.f; }| L { S.val = L.val; }L→L1 B { L.val = L1.val * 2 + B.c; L.f = L1.f * 2; }| B { L.val = B.c; L.f = 2; }B→0 { B.c = 0; }| 1 { B.c = 1; }(Aho)5.9 重写例5.3中语法制导定义的基础文法,使得类型信息只需用综合属性来传播解:改写后文法和语法制导定义为L→T id{ L.type = T.type; addtype(id.entry, L.type); }L→L1, id{ L.type = L1.type; addtype(id.entry, L.type); }T→int{ T.type = integer; }T→real{ T.type = real; }(Aho)5.10 当下列文法产生的语句翻译为抽象机器代码时,break语句翻译为一个跳转指令,它跳转到最近的while循环。

终结符expr表示表达式,other表示其他类型语句,这两个终结符都有综合属性code,表示翻译后的代码。

S→while expr do begin S end| S ; S| break| other试给出一个语法制导定义,将语句翻译为抽象堆栈机代码,保证break的正确翻译解:语法制导定义如下,其中begin和next为继承属性,分别表示语句的开始和结束(下一条语句开始)S→while expr do begin S1end{ S.begin = newlabel();S1.next = S.begin;S.code = 'label' S.begin || expr.code || 'gotofalse' S.next ||S1.code || 'goto' S.begin || 'label' S.next; } | S1 ; S2{ S1.begin = S.begin; S1.next = S2.begin = newlabel();S2.next = S.next; S.code = S1.code || S2.code; } | break { S.code = 'goto' S.next; }| other { S.code = other.code; }(Aho)5.12 下列文法产生包含赋值操作的表达式S →EE →E := E | E + E | ( E ) | ida)试构造一个语法制导定义,检查赋值表达式的左部是否为左值。

用E的继承属性side来指明E应该出现在赋值号左部还是右部解:语法制导定义如下S →E { E.side = right; }E →E1 := E2{ if (E.side == left) error;else { E1.side = left; E2.side = right; }}E →E1 + E2{ if (E.side == left) error;else { E1.side = E2.side = right; }}E →( E1 ) { if (E.side == left) error;else { E1.side = right; }}E →idb)扩充a)中语法制导定义,使得在检查同时将表达式翻译为抽象堆栈机代码解:语法制导定义如下,其中,valcode表示取表达式右值的代码S →E { E.side = right; S.code = E.code; }E →E1 := E2{ if (E.side == left) error;else { E1.side = left; E2.side = right; }E.code = E1.code || E2.code || ':=' || E1.valcode; }E →E1 + E2{ if (E.side == left) error;else { E1.side = E2.side = right; }E.code = E1.code || E2.code || '+'; }E →( E1 ) { if (E.side == left) error;else { E1.side = right; }E.code = E1.code; }E →id { E.code = 'lvalue' id.lexeme; E.valcode = 'rvalue' id.lexeme; }(Aho)5.16 下面文法是书中图5-22文法的无二义性版本,其中{}只是用来为盒子分组,在翻译过程中无实际意义。

S →LL →L B | BB →B sub F | FF →{ L } | texta)试改写图5-22的语法制导定义,以适用于上面改写后的文法解:语法制导定义如下,其中,ps为继承属性,ht为综合属性S →L { L.ps = 10; S.ht = L.ht; }L →L1 B { L1.ps = L.ps; B.ps = L.ps; L.ht = max(L1.ht, B.ht); }L →B { B.ps = L.ps; L.ht = max(L1.ht, B.ht); }B →B1 sub F { B1.ps = B.ps; F.ps = shrink(B.ps); B.ht = disp(B1.ht, F.ht); }B →F { F.ps = B.ps; B.ht = F.ht; }F →{ L } { L.ps = F.ps; F.ht = L.ht; }F →text { F.ht = text.h * F.ps; }b)将a)的结果转换为翻译模式解:翻译模式如下S →{ L.ps = 10; }L { S.ht = L.ht; }L →{ L1.ps = L.ps; }L1{ B.ps = L.ps; }B { L.ht = max(L1.ht, B.ht); }L →{ B.ps = L.ps; }B { L.ht = max(L1.ht, B.ht); }B →{ B1.ps = B.ps; }B1 sub { F.ps = shrink(B.ps); }F { B.ht = disp(B1.ht, F.ht); }B →{ F.ps = B.ps; }F { B.ht = F.ht; }F →{ L.ps = F.ps; }{ L } { F.ht = L.ht; }F →text { F.ht = text.h * F.ps; }(Aho)5.17 扩充5.5节中消除左递归的变换方法,使之允许(5-2)中的非终结符A具有:a)由复制规则定义的继承属性解:具有复制规则定义的继承属性的左递归文法的翻译模式为A →{ A1.in = A.in; } A1 Y { A.a = g(A1.a, Y.y, A.in); }A →X { A.a = f(X.x, A.in); }消除左递归后变为,其中R.r为继承属性,R.s为综合属性A →X { R.r = f(X.x, A.in); R.in = A.in; } R { A.a = R.s; }R →Y { R1.r = g(R.r, Y.y, R.in); R1.in = R.in; } R1 { R.s = R1.s; }R →ε { R.s = R.r; }b)继承属性解:具继承属性的左递归文法的翻译模式为A →{ A1.in = h(A.in); } A1 Y { A.a = g(A1.a, Y.y, A.in); }A →X { A.a = f(X.x, A.in); }消除左递归后变为,其中R.r为继承属性,R.s为综合属性A →X { R.r = f(X.x, A.in); R.in = h(A.in); } R { A.a = R.s; }R →Y { R1.r = g(R.r, Y.y, R.in); R1.in = h(R.in); } R1 { R.s = R1.s; } R →ε { R.s = R.r; }(Aho)5.18 将5.16(b)的结果消除左递归解:消除左递归后如下S →{ L.ps = 10; }L { S.ht = L.ht; }L →{ B.ps = L.ps; }B { L'.in = B.ht; L'.ps = L.ps; }L' { L.ht = L'.ht; }L' →{ B.ps = L.ps; }B { L'1.in = max(L.in, B.ht); L'1.ps = L'.ps; }L'1{ L'.ht = L'1.ht; }L' →ε{ L'.ht = L'.in; }B →{ F.ps = B.ps; }F { B'.in = F.ht; B'.ps = B.ps; }B' { B.ht = B'.ht; }B' →{ F.ps = shrink(B.ps); }sub F { B'1.in = disp(B.in, F.ht); B'1.ps = F.ps; }B'1{ B'.ht = B'1.ht; }B' →ε{ B'.ht = B'.in; }F →{ L.ps = F.ps; }{ L } { F.ht = L.ht; }F →text { F.ht = text.h * F.ps; }。

相关文档
最新文档