编译原理第8章作业及习题参考答案

合集下载

编译原理习题及答案(整理后)

编译原理习题及答案(整理后)

编译原理习题及答案(整理后)第⼀章1、将编译程序分成若⼲个“遍”是为了。

b.使程序的结构更加清晰2、构造编译程序应掌握。

a.源程序b.⽬标语⾔c.编译⽅法3、变量应当。

c.既持有左值⼜持有右值4、编译程序绝⼤多数时间花在上。

d.管理表格5、不可能是⽬标代码。

d.中间代码6、使⽤可以定义⼀个程序的意义。

a.语义规则7、词法分析器的输⼊是。

b.源程序8、中间代码⽣成时所遵循的是- 。

c.语义规则9、编译程序是对。

d.⾼级语⾔的翻译10、语法分析应遵循。

c.构词规则⼆、多项选择题1、编译程序各阶段的⼯作都涉及到。

b.表格管理c.出错处理2、编译程序⼯作时,通常有阶段。

a.词法分析b.语法分析c.中间代码⽣成e.⽬标代码⽣成三、填空题1、解释程序和编译程序的区别在于是否⽣成⽬标程序。

2、编译过程通常可分为5个阶段,分别是词法分析、语法分析中间代码⽣成、代码优化和⽬标代码⽣成。

3、编译程序⼯作过程中,第⼀段输⼊是源程序,最后阶段的输出为标代码⽣成程序。

4、编译程序是指将源程序程序翻译成⽬标语⾔程序的程序。

⼀、单项选择题1、⽂法G:S→xSx|y所识别的语⾔是。

c. x n yx n(n≥0)d. x*yx*2、⽂法G描述的语⾔L(G)是指。

a. L(G)={α|S + ?α , α∈VT*} b. L(G)={α|S*?α, α∈VT*}c. L(G)={α|S *?α,α∈(VT∪V N*)} d. L(G)={α|S+ ?α, α∈(VT∪V N*)}3、有限状态⾃动机能识别。

a. 上下⽂⽆关⽂法b. 上下⽂有关⽂法c.正规⽂法d. 短语⽂法4、设G为算符优先⽂法,G的任意终结符对a、b有以下关系成⽴。

a. 若f(a)>g(b),则a>bb.若f(a)c. a~b都不⼀定成⽴d. a~b⼀定成⽴5、如果⽂法G是⽆⼆义的,则它的任何句⼦α。

a. 最左推导和最右推导对应的语法树必定相同b. 最左推导和最右推导对应的语法树可能不同c. 最左推导和最右推导必定相同d. 可能存在两个不同的最左推导,但它们对应的语法树相同6、由⽂法的开始符经0步或多步推导产⽣的⽂法符号序列是。

编译原理课后习题答案

编译原理课后习题答案

(a) 0 ( 0 | 1)* 0
由0和1组成且以0开始和结束的符号串全体. (b) ( ( | 0 ) 1* ) * 由0和1组成的符号串全体.
(c) ( 0 | 1 )* 0 ( 0 | 1) ( 0 | 1) 由0和1组成且以000,001,010或011结束的符号串全体. 长度大于等于3且倒数第3个字符为0的01符号串全体.
R R ‘|’ S | S S ST | T T U* | U U (R) | a | b
a
a
a
28
4.5 dangling-else文法: stmt if expr then stmt | matched-stmt matched-stmt if expr then matched-stmt else stmt | other 试说明此文法是二义性的。 句子 if e1 then if e2 then s1 else if e3 then s2 else s3 if e1 then if e2 then s1 else if e3 then s2 else s3
0|1 B 1 D E 0 ABDE ABDE ABCDE ABDE 1 ABCDE ABCDE
start
A
1
C
NFA 0
start A' 1
0
B'
0
1
start
A'
1
最小化DFA
24
DFA
3.8 给定右线性文法G: S 0S | 1S | 1A | 0B A 1C |1 B 0C | 1 C 0C | 1C | 0 | 1 试求一个等价的左线性文法G’.
20
3.6 给出接受下列在字母表{0,1}上的DFA。 (a)所有以00结束的符号串的集合; (1|0)*00

编译原理一些习题答案

编译原理一些习题答案

第2章形式语言基础2.2 设有文法G[N]: N -> D | NDD -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9(1)G[N]定义的语言是什么?(2)给出句子0123和268的最左推导和最右推导。

解答:(1)L(G[N])={(0|1|2|3|4|5|6|7|8|9)+} 或L(G[N])={α| α为可带前导0的正整数}(2)0123的最左推导:N ⇒ ND ⇒ NDD ⇒ NDDD ⇒ DDDD ⇒ 0DDD ⇒ 01DD ⇒ 012D ⇒ 0123 0123的最右推导:N ⇒ ND ⇒ N3 ⇒ ND3 ⇒ N23 ⇒ ND23 ⇒ N123 ⇒ D123 ⇒ 0123268的最左推导:N ⇒ ND ⇒ NDD ⇒ DDD ⇒ 2DDD ⇒ 26D ⇒ 268268的最右推导:N ⇒ ND ⇒ N8 ⇒ ND8 ⇒ N68 ⇒ D68 ⇒ 2682.4 写一个文法,使其语言是奇数的集合,且每个奇数不以0开头。

解答:首先分析题意,本题是希望构造一个文法,由它产生的句子是奇数,并且不以0开头,也就是说它的每个句子都是以1、3、5、7、9中的某个数结尾。

如果数字只有一位,则1、3、5、7、9就满足要求,如果有多位,则要求第1位不能是0,而中间有多少位,每位是什么数字(必须是数字)则没什么要求,因此,我们可以把这个文法分3部分来完成。

分别用3个非终结符来产生句子的第1位、中间部分和最后一位。

引入几个非终结符,其中,一个用作产生句子的开头,可以是1-9之间的数,不包括0,一个用来产生句子的结尾,为奇数,另一个则用来产生以非0整数开头后面跟任意多个数字的数字串,进行分解之后,这个文法就很好写了。

N -> 1 | 3 | 5 | 7 | 9 | BNB -> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | B02.7 下面文法生成的语言是什么?G1:S->ABA->aA| εB->bc|bBc G2:S->aA|a A->aS解答:B ⇒ bcB ⇒ bBc⇒ bbccB ⇒ bBc⇒ bbBcc ⇒ bbbccc……A ⇒εA ⇒ aA ⇒ aA ⇒ aA ⇒ aaA ⇒ aa……∴S ⇒ AB ⇒ a m b n c n , 其中m≥0,n≥1即L(G1)={ a m b n c n | m≥0,n≥1} S ⇒ aS ⇒ aA ⇒ aaS ⇒ aaaS ⇒ aA ⇒ aaS ⇒ aaaA ⇒aaaaS ⇒ aaaaa ……∴S ⇒ a2n+1 , 其中n≥0即L(G2)={ a2n+1 | n≥0}2.11 已知文法G[S]: S->(AS)|(b)A->(SaA)|(a)请找出符号串(a)和(A((SaA)(b)))的短语、简单短语和句柄。

第八章课后作业答案

第八章课后作业答案
E.falselist:=makelist(nextquad+1);
emit(‘j’relop.op‘,’id 1.place‘,’id 2.place‘,’‘0’);
emit(‘j,-,-,0’) }
E→E1 and M E2
{ backpatch(E1.truelist, M.quad);
E.truelist:=E2.truelist;
E.falselist:=merge(E1.falselist,E2.falselist) }
M→{ M.quad:=nextquad }
if语句
Sif E then M S1
{backpatch(E.truelist, M.quad)
S.nextlist:=merge(E.falselist, S1.nextlist)}
a := a + b – 1
用到的翻译模式如下:
布尔表达式
E→id1 relop id2 { E.truelist:=makelist(nextquad);
E.falselist:=makelist(nextquad+1);
emit(‘j’relop.op‘,’id 1.place‘,’id 2.place‘,’‘0’);
emit(p‘:=’E.place)
else error }
E→E1opE2 { E.place:=newtemp;
emit(E.place‘:=’E1.place‘op’E2.place)}
101
j,_,_,111
102
j=,b,100, 104
103
j,_,_,100
104
J<,a,20,106
M→{ M.quad:=nextquad }

编译原理清华大学出版社第8章习题重点题解答

编译原理清华大学出版社第8章习题重点题解答

1、已知文法:A → aAd|aAb|ξ判断该文法是否是SLR(1)文法,若是构造相应分析表,并对输入串 #ab# 给出分析过程。

解:(0) A’→ A(1)A → aAd(2) A → aAb(3) A →ξ构造该文法的活前缀DFA:由上图可知该文法是SLR(1)文法。

构造SLR(1)的分析表:3、考虑文法:S →AS|b A→SA|aFollow(A) = first(S) = {b}+first(A)= {a,b}(1)列出这个文法的所有LR(0)项目(2)按(1)列出的项目构造识别这个文法活前缀的NFA,把这个NFA确定化为DFA,说明这个DFA的所有状态全体构成这个文法的LR(0)规范族。

(3)这个文法是SLR的吗?若是,构造出它的SLR分析表。

(4)这个文法是LALR或LR(1)的吗?解:(0)S’→S (1)S→AS (2)S→b (3)A→SA (4)A→a(1)列出所有LR(0)项目:S’→·S S→·b A→·a S’→ S· S→b· A→a·S →·AS A→·SAS →A·S A→S·AS →AS· A→SA·(3)构造该文法的活前缀NFA:由上可知:I1 I3 I5 中存在着移进和归约冲突在I1中含项目:S’→ S·归约项 Follow(S’)={#}A →·a 移进项 Follow(S’)∩{a}=∮S →·b 移进项 Follow(S’)∩{b}=∮在I3中含项目:A →SA·归约项 Follow(A)={a,b}S →·b 移进项 Follow(A) ∩ {b}≠∮A →·a 移进项 Follow(A) ∩ {a}≠∮在I5中含项目:S →AS·归约项 Follow(S)={#,a,b}A →·a 移进项 Follow(S) ∩ {a}≠∮S →·b 移进项 Follow(S) ∩ {b }≠∮由此可知,I3、I5的移进与归约冲突不能解决,所以这个文法不是SLR (1)文法。

胡元义版编译原理课后习题答案

胡元义版编译原理课后习题答案
(3) S→a (4) L→S (5) L→S;L
则文法G[S′]的LR(0)项目集示范族为 I0:S′→·S I4:S→a· I10:L→S;·L I5 : S→while e· do s I6 : S→begin L·end I7 : L→S· S→·while e do S L→·S S→·begin L end L→·S;L S→·a S→·while e do S
所有外层分程序的符号表都无法找到此标识符,则表
明程序中使用了一个未经说明 ( 定义 )的标识符,此时 可按语法错误予以处理。
8.4 对下列程序,当编译程序编译到箭头所指位 置时,画出其层次表(分程序索引表)和符号表: program stack(output); var m, n:integer; r:real;
w h ile L S ; I4 I7 a s I1 0 I6 b eg in en d I9 w h ile L I1 2 a
图8-2 习题8.5中文法G[S′]的DFA
在 LR(0) 项 目 集 规 范 族 中 , 只 有 I7 含 有 “ 移 进”/“归约”冲突,且该冲突可用SLR(1)方法解决。
图8-1 分程序索引表和符号表示意图
8.5 已知文法G[S]: S→while (e) S S→{L}
S→a
L→S;L L→S
/*a代表赋值句*/
构造该文法的LR型的错误校正分析程序。
【解答】 首先将文法G[S]拓广为G[S′]:(0) S′→S (1) S→while e do S
(2) S→begin L end
号的处理,这就需要用到语法符号的相关属性。为了在需
要时能找到这些语法成分及其相关属性,就必须使用一些 表格来保存这些语法成分及其属性,这些表格就是符号表。

编译原理作业题答案编译原理课后题答案

编译原理作业题答案编译原理课后题答案

第二章高级语言的语法描述6、令文法G 6为:N →D|ND D → 0|1|2|3|4|5|6|7|8|9(1)G 6 的语言L (G 6)是什么?(2)给出句子01270127、、34和568的最左推导和最右推导。

解答:思路:由N N →→ D|ND 可得出如下推导N =>=>ND ND ND=>=>=>NDD NDD NDD=>…=>=>…=>=>…=>D D n(n >=1=1))可以看出,N 最终可以推导出1个或多个(也可以是无穷)D ,而D D →→ 0|1|2|3|4|5|6|7|8|9可知,每个D 为0~9中的任一个数字,所以,中的任一个数字,所以,N N N 最终推导出的就是由最终推导出的就是由0~9这10个数字组成的字符串。

(1)G 6 的语言L (G 6)是由0~9这10个数字组成的字符串个数字组成的字符串,,或{0{0,,1,1,……,9}+。

(2)(2)句子句子01270127、、34和568的最左推导分别为的最左推导分别为: : N =>=>ND ND ND=>=>=>NDD NDD NDD=>=>=>NDDD NDDD NDDD=>=>=>DDDD DDDD DDDD=>=>=>0DDD 0DDD 0DDD=>=>=>01DD 01DD 01DD=>=>=>012D 012D 012D=>=>=>0127 0127 N =>=>ND ND ND=>=>=>DD DD DD=>=>=>3D 3D 3D=>=>=>34 34N =>=>ND ND ND=>=>=>NDD NDD NDD=>=>=>DDD DDD DDD=>=>=>5DD 5DD 5DD=>=>=>56D 56D 56D=>=>=>568 568 句子01270127、、34和568的最右推导分别为的最右推导分别为: :N =>=>ND ND ND=>=>=>N7N7N7=>=>=>ND7ND7ND7=>=>=>N27N27N27=>=>=>ND27ND27ND27=>=>=>N127N127N127=>=>=>D127D127D127=>=>=>0127 0127 N =>=>ND ND ND=>=>=>N4N4N4=>=>=>D4D4D4=>=>=>34 34N =>=>ND ND ND=>=>=>N8N8N8=>=>=>ND8ND8ND8=>=>=>N68N68N68=>=>=>D68D68D68=>=>=>568 5687、写一个文法,使其语言是奇数集,且每个基数不以0开头。

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

编译原理课后习题答案+清华大学出版社第二版
错误处理程序:处理和校正源程序中存在的词法、语法和语义错误。当编译程序发现源 程序中的错误时,错误处理程序负责报告出错的位置和错误性质等信息,同时对发现的错误 进行适当的校正(修复),目的是使编译程序能够继续向下进行分析和处理。
注意:如果问编译程序有哪些主要构成成分,只要回答六部分就可以。如果搞不清楚, 就回答八部分。
第 2题
若 PL/0 编译程序运行时的存储分配策略采用栈式动态分配,并用动态链和静态链的方
式分别解决递归调用和非局部变量的引用问题,试写出下列程序执行到赋值语句 b∶=10
时运行栈的布局示意图。 var x,y; procedure p; var a; procedure q; var b;
begin (q)
答案:
PL/0 编译程序所产生的目标代码中有 3 条非常重要的特殊指令,这 3 条指令在 code 中的位置和功能以及所完成的操作说明如下:
INT 0 A 在过程目标程序的入口处,开辟 A 个单元的数据段。A 为局部变量的个数+3。 OPR 0 0
3
《编译原理》课后习题答案第二章
在过程目标程序的出口处,释放数据段(退栈),恢复调用该过程前正在运行的过程的数 据段基址寄存器 B 和栈顶寄存器 T 的值,并将返回地址送到指令地址寄存器 P 中,以使调 用前的程序从断点开始继续执行。
3
《编译原理》课后习题答案第一章
第6题
计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?
答案:计算机执行用高级语言编写的程序主要途径有两种,即解释与编译。 像 Basic 之类的语言,属于解释型的高级语言。它们的特点是计算机并不事先对高级语
言进行全盘翻译,将其变为机器代码,而是每读入一条高级语句,就用解释器将其翻译为一 条机器代码,予以执行,然后再读入下一条高级语句,翻译为机器代码,再执行,如此反 复。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第八章 语法制导翻译和中间代码生成
1.给出下面表达式的逆波兰表示(后缀式): (1) a*(-b+c)
(4) (A ∧B) ∨(⌝C ∨ D)
(7) if(x+y)*z=0 then s ∶=(a+b)*c else s ∶=a*b*c
解(1) ab-c+*
(4) AB ∧C ⌝D ∨∨
(7) xy+z*0=sab+c*:=sab*c*:=¥(注:¥表示if-then-else 运算)
2. 请将表达式-(a+b)*(c+d)-(a+b+c)分别表示成三元式、间接三元式和四元式序列。

答案:三元式
(1) (+ a, b) (2) (+ c, d)
(3) (* (1), (2)) (4) (- (3), /) (5) (+ a, b)
(6) (+,(5),c) (7) (- (4), (6)) 间接三元式
间接三元式序列 间接码表 (1) (+ a, b) (1) (2) (+ c, d) (2) (3) (* (1), (2)) (3) (4) (- (3), /) (4)

= :=
*
:=
+ x
y
z
s +
c
x
a b
s
* c
*
a b
(5) (- (4), (1)) (1)
(6) (- (4), (5)) (5)
(6)
四元式
(1) (+, a, b, t1) (2) (+, c, d, t2) (3) (*, t1, t2, t3) (4) (-, t3, /, t4)
(5) (+, a, b, t5) (6) (+, t5, c, t6) (6) (-, t4, t6, t7)
3. 采用语法制导翻译思想,表达式E 的"值"的描述如下: 产生式 语义动作
(0) S ′→E {print E.VAL}
(1) E →E1+E2 {E.VAL ∶=E1.VAL+E2.VAL} (2) E →E1*E2 {E.VAL ∶=E1.VAL*E2.VAL} (3) E →(E1) {E.VAL ∶=E1.VAL} (4) E →n {E.VAL ∶=n.LEXVAL}
如果采用LR 分析法,给出表达式(5 * 4 + 8) * 2的语法树并在各结点注明语义值VAL 。

4. 假如习题3中表达式E 的“值”有两种类型:整型和实型。

语义处理增加"类型匹配检查",请给出相应的语义描述。

S ’
*
E1 E2
E0
E3
2
E5.V AL=5 8 5 *
E5 E6
+
E4
4 E6.V AL=4
E4.V AL=8
E3.V AL=20 E1.V AL=28
E2.V AL=2
E0.V AL=56
Print(56)
解:
(0) S′→E { if error≠1 then print E.VAL}
(1) E→E1+E2 { if E1.TYPE=int AND E2.TYPE=int then
begin
E.VAL:=E1.VAL + E2.VAL;
E.YTPE:=int;
end
else if E1.TYPE=real AND E2.TYPE=real then
begin
E.VAL:=E1.VAL + E2.VAL;
E.YTPE:=real;
end
else error=1
}
(2) E→E1*E2 { if E1.TYPE=int AND E2.TYPE=int then
begin
E.VAL:=E1.VAL * E2.VAL;;
E.YTPE:=int;
end
else if E1.TYPE=real AND E2.TYPE=real then
begin
E.VAL:=E1.VAL * E2.VAL;;
E.YTPE:=real;
end
else error=1
}
(3) E→(E1) { E.VAL:=E1.VAL;
E.TYPE:=E1.TYPE }
(4) E→n { E.VAL:=n.LEXVAL;
E.TYPE:=n.LEXTYPE }
5. 令综合属性 val 给出在下面的文法中的 S 产生的二进制数的值 ( 如,对于输入101.101 ,则S.val=5.625)。

S -> L.L | L
L -> LB | B
B -> 0 | 1
S ->L 1.L2
S->L S.val:=L.val
L -> L1B L.val:=L1.val*2+B.val
L.length:=L1.length+1
L -> B L.val:=B.val
L.length:=1
B -> 0 B.val:=0
B -> 1 B.val:=1

产生式语义规则
S
-> L
S.val:=L.val;
S
-> L
1.L
2
S.val:=L
1
.val+L
2
.val*L
2
.p;
L
-> B
L.val:=B.val; L.p:=2-1;
S
.
L
L B L B
B
L
B
L
L B
B。

相关文档
最新文档