文档库 最新最全的文档下载
当前位置:文档库 › 编译原理作业参考答案

编译原理作业参考答案

编译原理作业参考答案
编译原理作业参考答案

第1章引言

1、解释下列各词

源语言:编写源程序的语言(基本符号,关键字),各种程序设计语言都可以作为源语言。

源程序: 用接近自然语言(数学语言)的源语言(基本符号,关键字)编写的程序,它是翻译程序处理的对象。

目标程序: 目标程序是源程序经过翻译程序加工最后得到的程序。目标程序

(结果程序)一般可由计算机直接执行。

低级语言:机器语言和汇编语言。

高级语言:是人们根据描述实际问题的需要而设计的一个记号系统。如同自然语言(接近数学语言和工程语言)一样,语言的基本单位是语句,由符号组和一组用来组织它们成为有确定意义的组合规则。

翻译程序: 能够把某一种语言程序(源语言程序)改变成另一种语言程序(目标语言程序),后者与前者在逻辑上是等价的。其中包括:编译程序,解释程序,汇编程序。

编译程序: 把输入的源程序翻译成等价的目标程序(汇编语言或机器语言),

然后再执行目标程序(先编译后执行),执行翻译工作的程序称为编译程序。

解释程序: 以该语言写的源程序作为输入,但不产生目标程序。按源程序中语句动态顺序逐句的边解释边执行的过程,完成翻译工作的程序称为解释程序。

2、什么叫“遍”?

指对源程序或源程序的中间形式(如单词,中间代码)从头到尾扫描一次,并作相应的加工处理,称为一遍。

3、简述编译程序的基本过程的任务。

编译程序的工作是指从输入源程序开始到输出目标程序为止的整个过程,整个过程可以划分5个阶段。

词法分析:输入源程序,进行词法分析,输出单词符号。

语法分析:在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位,并判断输入串是否构成语法正确的“程序”。

中间代码生成:按照语义规则把语法分析器归约(或推导)出的语法单位翻译成一定形式的中间代码。

优化:对中间代码进行优化处理。

目标代码生成:把中间代码翻译成目标语言程序。

4、编译程序与解释程序的区别?

编译程序生成目标程序后,再执行目标程序;然而解释程序不生成目标程序,边解释边执行。

5、有人认为编译程序的五个组成部分缺一不可,这种看法正确吗?

编译程序的5个阶段中,词法分析,语法分析,语义分析和代码生成生成是必须完成的。而中间代码生成和代码优化并不是必不可少的。优化的目的是为了提高目标程序的质量,没有这一部分工作,仍然能够得到目标代码。

6、编译程序的分类

目前基本分为:诊断编译程序,优化编译程序,交叉编译程序,可变目标编译程序。

第2章高级语言及其语法描述

1(P36)令文法为

N → D∣ND

D → 0∣1∣2∣?∣9

(1)文法描述的语言L(G)是什么?

(2)给出句子34,568的最左推导和最右推导。

答:(1)

L(G)={α∣α为可带前导0的正整数}

或L(G)={(0∣1∣2∣?∣9)+ }

或 L(G)={α∣α为数字串}

(2)

最左推导:N?ND?DD?3D?34

N?ND?NDD?DDD?5DD?56D?568

最右推导:N?ND?N4?D4?34

N?ND?N8?ND8?N68?D68?568

2*.写出一个文法,使其语言是奇数集,且每个奇数是不以0开头。

答:

S → CAB|B (考虑了正负号)

A → 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | AA | A0 | ε

B → 1|3|5|7|9

C → +|-|ε

或:(未考虑正负号)

S → B | AB

B → 1 | 3 | 5 | 7 | 9

A → AD | N

N → 2 | 4 | 6 | 8 | B

D → 0 | N

或:(未考虑正负号)

S → C | ABC

C → 1 | 3 | 5 | 7 | 9

A → 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

B → BA | B0 |ε

2.(P36, 8)令文法为

E → T∣E+T∣E-T

T → F∣T*F∣T/F

F →(E)∣i

(1)给出该文法的V N、V T和S。

(2)给出i+i*i,i*(i+i)的最左推导和最右推导。

(3)给出i+i+i,i+i*i的语法树。

答:(1)

V N = { E, T, F }

V T = { +, -, *, /, (, ), i }

S = E

(2)

最左推导E?E+T?T+T?F+T?i+T?i+T*F?i+F*F?i+i*F?i+i*i

E?T?T*F?F*F?i*F?i*(E)?i*(E+T)?i*(T+T)?i*(F+T)?i*(i+T)

?i*(i+F)?i*(i+i)

最右推导E?E+T?E+T*F?E+T*i?E+F*i?E+i*i?T+i*i?F+i*i?i+i*i

E?T?T*F?T*(E)?T*(E+T)?T*(E+F)?T*(E+i)?T*(T+i)?T*(F+i)

?T*(i+i)?F*(i+i)?i*(i+i)

⑵构造语法树

E 最左推导构造语法树

E + T

E + T i

T i

i

3.(P36, 9)证明下面的文法是二义的:

S → iSeS | iS ∣ i

答:对于句子iiiei有两棵不同的语法树。因此该文法是二义的。

S ? iSeS ? iiSeS ? iiieS ? iiiei

S ? iS ? iiSeS ? iiieS ? iiiei

第3章词法分析

1.设M=({x,y},{a,b},δ,x,{y})为一个非确定有限自动机NFA M,其中δ定义如下:

δ(x,a)={x,y}

δ(x,b)={y}

δ(y,a)=φ

δ(y,b)={x,y}

试构造其相应的最小化的确定有限自动机DFA M’。

答:由δ定义可知δ(x,a),δ(y,b)均为多值函数,所以是一个非确定有限自动机。(1)根据δ函数值,先构造NFA M

(2)确定化:

①构造DFA M’的转换矩阵:

②确定DFA M’的初始状态和终态:

(a)转换矩阵中I列的第一个状态①为DFA M’的初始状态结点。

(b)含有y状态的子集均为DFA M’的终态结点(②、③为终态结点)。

③根据DFA M’的转换矩阵画出对应的状态转换图:

(3)最小化:

①首先将其划分成终态集{2,3}和非终态集{1}

②{2,3}a={2}? {2,3}, {2,3}b={2}? {2,3}

因此{2,3}已是不可再区分的,所以该DFA M’已是最小化的。

2. (P64,7(1))构造正规式1(0∣1)*101相应的DFA M。

答:(1)构造NFA M。

(2

(3)由转换矩阵构造DFA M

3.(P64,12(a))将下图所示的NFA M转换为等价的DFA M’,并将该DFA’最小化。

答:

该有限自动机状态0输入同一字符a时到达两个不同的结点,所以是NFA。

(3

①将DFA M的状态划分为非终态集{3}和终态集{1,2}

②对每一个子集及每一个a∈∑进行考察;

{1,2}a = {2} ? {1,2}

{1,2}b = {3} ? {3}

因此{1,2}是不可区分的,所以最终状态为: {1,2},{3}

构造最小化的DFA M:

4. (P64,12(b))将下图所示的NFA M转换为等价的DFA M’,并进行最小化。

答:从图上可知该图已经是DFA M,先只需将其最小化。

首先划分为两个集合:{0,1}和{2,3,4,5}

{2,3,4,5}a = {1,3,0,5},划分为:{2,4}和{3,5}

{2,4}a = {1,0},{2,4}b = {3,5},无需划分

{3,5}a = {3,5},{3,5}b = {2,4},无需划分

{0,1}a = {1},{0,1}b = {2,4},无需划分

因此,最终的划分为:{0,1}、{2,4}和{3,5},化简后的结果:

5.(P65,14)构造一个DFA M,它接受∑={0,1}上所有满足如下条件的字符串:每个1都有0直接跟在右边。

答:

(1)根据题意,得到正规式:(0|10)*

(2)构造对应的NFA M:

(3

(4)将DFA M最小化:

①将DFA M的状态划分为非终态集{3}和终态集{1, 2}

②对每一个子集进行考察;

{1, 2}0 = {2} ?{1, 2}

{1, 2}1 = {3,3} ?{3}

因此{0, 1}是不可划分的。

因此最终划分结果为:{1, 2}和{3}

最小化后的DFA M:

第4章语法分析-自上而下

1.(P81,1)考虑下面文法G

S→ a∣^∣(T)

T→T,S∣S

(1)消除文法的左递归。

(2)经改写后的文法是否是LL(1)的?给出它的预测分析表。

答:

(1)消除左递归:

S → a∣^∣(T)

T → ST’

T’→ ,ST’| ε

(2)证明改写后的文法是否是LL(1)的。

FIRST(S) = { a, ^, ( } FOLLOW(S) = {,, ), # }

FIRST(T) = { a, ^, ( } FOLLOW(T) = { ) }

FIRST(T’) = { , , ε } FOLLOW(T’) = { ) }

①证明S→ a∣^∣(T)各侯选式的FIRST是否两两相交。

FIRST(a)? FIRST(^)= φ

FIRST(a)? FIRST(()= φ

FIRST(^)? FIRST(()= φ

②证明T’→,ST’∣ε的FIRST(T’)和FOLLOW(T’)是否相交。

FIRST(T’)? FOLLOW(T’)={,,ε}?{ ) }= φ

∴该文法是LL(1)的。

所以,改造后的文法是LL(1)文法

2.利用P76表4.1的LL(1)分析表写出表达式 (i+i)*i 的预测分析过程。

步骤符号栈输入串所用的产生式

0 #E (i+i)*i#

1 #E’T (i+i)*i# E→TE’

2 #E’T’F (i+i)*i# T→FT’

3 #E’T’)E((i+i)*i# F→(E)

4 #E’T’)E i+i)*i#

5 #E’T’)E`T i+i)*i# E→TE’

6 #E’T’)E’T’F i+i)*i# T→FT’

7 #E’T’)E’T’i i+i)*i# F→i

8 #E’T’)E’T’ +i)*i#

9 #E’T’)E’ +i)*i# T’→ε

10 #E’T’)E’T+ +i)*i# E’→+TE’

11 #E’T’)E’T i)*i#

12 #E’T’)E’T’F i)*i# T→FT’

13 #E’T’)E’T’i i)*i# F→i

14 #E’T’)E’T’)*i#

15 #E’T’)E’)*i# T’→ε

16 #E’T’))*i# E’→ε

18 #E’T’ *i#

19 #E’T’F* *i# T’→*FT’

20 #E’T’F i#

21 #E’T’i i# F→i

22 #E’T’ #

23 #E’ # T’→ε

24 # # E’→ε

3. (P81,2)对下面的文法G

E → TE’

E’→ +E∣ε

T → FT’

T’→ T∣ε

F → PF’

F’→ *F’∣ε

P → (E)∣^∣a∣b

(1)计算这个文法的每个非终结符的FIRST和FOLLOW。

(2)证明这个文法是LL(1)的。

(3)构造它的预测分析表。

答:(1)计算每个非终结符的FIRST和FOLLOW。

FIRST(E)={(, a, b, ^ } FIRST(E’)={ +, ε }

FIRST(T)={(, a, b, ^ } FIRST(T’)={(, a, b, ^ , ε } FIRST(F)={(, a, b, ^ } FIRST(F’)={ * , ε }

FIRST(P)={(, a, b, ^ }

FOLLOW(E)={ ) ,# } FOLLOW(E’)={ ), # }

FOLLOW(T)={ +, ), # } FOLLOW(T’)={ +, ), # }

FOLLOW(F)={ +,(, a, b, ^, ), # }

FOLLOW(F’)={ +,(, a, b, ^, ), # }

FOLLOW(P)={ *,+,(, a, b, ^, ), # }

(求解过程:

因为E`→+E∣ε,所以FIRST(E`)={+,ε}

因为F`→*F`∣ε,所以FIRST(F`)={*,ε}

因为P→(E)∣^∣a∣b,所以FIRST(P)={(, ^, a, b }

因为F→PF`,所以FIRST(F)= FIRST(P)

因为T→FT`,所以FIRST(T)={FIRST(F)

因为E→ TE`,所以FIRST(E)= FIRST(T)

因为T`→T∣ε,所以FIRST(T`)= FIRST(T)?{ ε}

={(, ^, a, b ,ε}

求非终结符的FOLLOW:

因为E→ TE`的E是文法的开始符号,FOLLOW(E)={#},又因为P→(E),所以FOLLOW(E)={#}?FIRST())\{ε}={#,)}

因为E→ TE`,所以FOLLOW(E`)=FOLLOW(E)

因为E→TE`,并且E`≠ε,所以FOLLOW(T)=FIRST(E`)\{ε},又因为E`→ε,所以FOLLOW(T)={+}? FOLLOW(E)={+}? {#,}}={+,#,) }.

因为T→FT`,所以FOLLOW(T`)=FOLLOW(T)={+,#,) }.

因为T→FT`,并且T`≠ε,所以FOLLOW(F)=FIRST(T`)\{ε},又因为T`→ε,所以FOLLOW(F)={(,^,a,b }? FOLLOW(T)={(,^,a,b }?{+,#,) }

={(,^,a,b ,+,#,)}

因为F→PF`,所以FOLLOW(F`)=FOLLOW(F)={(,^,a,b ,+,#,)}.

因为F→PF`,并且F`≠ε,所以FOLLOW(P)=FIRST(F`)\{ε},又因为F`→ε,所以FOLLOW(P)={*}? FOLLOW(F)={*}?{(,^,a,b,+,),# }

={*,(,^,a,b ,+,),# }

(2)证明这个文法是LL(1)的

该文法没有左递归,只需考察:

E’→ +E∣ε

T’→ T∣ε

F’→ *F’∣ε

P → (E)∣^∣a∣b

由于:

E’→ +E∣ε:FIRST(E’)={+, ε } ∩ FOLLOW(E’)={#,}} =Ф

T’→ T∣ε: FIRST(T’)={(, a, b,^ ,ε} ∩ FOLLOW(T’)={+, ),#} =Ф

F’→ * F’∣ε:FIRST(F’)={*, ε} ∩ FOLLOW(F’)={+,(, a, b,^,),#} =Ф

P → (E)∣^∣a∣b:候选式终结符首字符集两两不相交

所以该文法为LL(1)文法。

第5章语法分析-自上而下分析

1.(P133,1)令文法G1为:

E→E+T|T

T→T*F|F

F→(E)|i

证明E+T*F是它的一个句型,指出这个句型的所有短语,直接短语和句柄。答:因为有:E ? E+T ? E+T*F,所以E+T*F是文法的一个句型。

短语:E+T*F, T*F 直接短语:T*F 句柄:T*F

2. (P133,3)考虑文法G2

S → a ∣∧ | (T)

T → T;S ∣ S

(1)计算文法G2每个非终结符的FIRSTVT和LASTVT。

(2)构造文法G2的优先关系表,该文法是算符优先文法吗?

(3)给出输入串(a;(a;a))的算符优先分析过程。

解:

(1)FIRSTVT和LASTVT

FIRSTVT(S) = {a, ∧, ( }

FIRSTVT(T) = {;,a,∧,( }

LASTVT(S) = { a, ∧, ) }

LASTVG(T) = {;,a,∧, ) }

(2)

是算符优先分析文法,因为优先关系表中没有冲突的关系。

3. (P134,5)考虑文法

S→AS∣b

A→SA∣a

(1)构造这个文法的LR(0)项目规范族及识别活前缀的DFA。

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

解:构造拓广文法:

(0) S’→S (1) S→AS (2) S→b (3) A→SA (4) A→a

(1)构造这个文法的LR(0)项目规范族及识别活前缀的DFA。

(2)证明文法是否是SLR(1)文法?

为了验证这个文法是否是SLR(1)文法,必须对LR(0)项目集规范族的各个项目集I,验证其是否存在“移进-归约”、“归约-归约”冲突。该项目规范族中的I1,I5,I7存在“移进-归约”,只需证明存在集合的?a,b?,FOLLOW(S’),FOLLOW(S),FOLLOW(A)两两不相交。对此求出FOLLOW(S’)=?#?,FOLLOW(S)=?#,a,b?,FOLLOW(A)=?a,b?。

验证如下:

对状态I1有

FOLLOW(S’) = ?#?;A→·a;S→·b。

因此FOLLOW(S’) ??a,b? = ?#???a,b? = φ,所以不存在“移进-归约”冲突。

对状态I5有

FOLLOW(A) = ?a,b?;A→·a;S→·b。

因此FOLLOW(A) ??a,b? = ?a,b???a,b?≠φ,所以存在“移进-归约”冲突。

对状态I7也同样存在这种冲突,即:

FOLLOW(S) ??a,b? = ?#,a,b???a,b?≠φ

因此,该文法不是SLR(1)文法。

4.(P135 7)证明下面文法是SLR(1)文法,但不是LR(0)文法.

S→A

A→Ab|bBa

B→aAc|a|aAb

证明:该文法的项目集规范族有:

I0 = { S→?A,A→?Ab,A→?bBa }

I1 = GO(I0,A) = { S→A?,A→A?b }

I2 = GO(I0,b) = { A→b?Ba,B→?aAc,B→?a,B→?aAb }

I3 = GO(I1,b) = { A→Ab? }

I4 = GO(I2,B) = { A→bB?a }

I5 = GO(I2,a) = { B→a?Ac,B→a?,B→a?Ab,A→?Ab,A→?bBa }

I6 = GO(I4,a) = { A→bBa? }

I7 = GO(I5,A) = { B→aA?c,B→aA?b,A→A?b }

I8 = GO(I5,b) = I2

I9 = GO(I7,b) = { B→aAb?,A→Ab? }

因为项目集I9中有A→Ab?和B→aAb?,存在“归约-归约”冲突,所以不是LR(0)文法。

又因为FOLLOW(A) ={ b,c,# },FOLLOW(B) ={ a }

使得FOLLOW(A) ∩ FOLLOW(B) =φ,因此构造SLR(1)分析表时不会出现冲突,所以该文法是SLR(1)的。

5.有文法:

0.S’→ E

1.E → aA

2.E → bB

3.A → cA

4.A → d

5.B → cB

6.B → d

答:

第6章语义分析和中间代码生成

1.根据给出的语义规则,写出下列布尔表达式的翻译过程(假设第1条四元式地址为100)及最终产生的四元式序列:

A<10 or(B and not(C or D))

解:语法树:

翻译过程:

(1)E1→id1 relop id2 (A<10)

E1.truelist:=makelist(nextquad)=100

E1.falselist:=makelist(nextquad+1)=101

100(j<, A, 10, 0 )

101(j, _, _, 0)→(j, _, _,102) 步骤13回填结果

(2)M1→ε : M1.quad:=102

(3)E4→id (B)

E4.truelist:=makelist(nextquad)=102

E4.falselist:=makelist(nextquad+1)=103

102(jnz, B , _, 0)→ (jnz, B , _,104) 步骤11回填结果

103(j, _, _, 0)

(4) M2→ε : M2.quad:=104

(5)E8→id (C)

E8.truelist:=makelist(nextquad)=104

E8.falselist:=makelist(nextquad+1)=105

104(jnz, C , _, 0)

105(j, _, _, 0) → (j, _, _, 106) 步骤8回填结果

(6) M3→ε : M3.quad:=106

(7)E9→id (D)

E9.truelist:=makelist(nextquad)=106

E9.falselist:=makelist(nextquad+1)=107

106(jnz, D , _, 0)→ (jnz,D , _,104)步骤8的拉链

→ (jnz,D , _,103)步骤11的拉链

107(j, _, _, 0) → (j, _, _,100 ) 步骤13的拉链

(8)E7→E8 or M3 E9

backpatch (E8.falselist, M3.quad )=(105,106)

E7.truelist := merge(E8.truelist, E9.truelist)

=merge(104,106)=106

E7.falselist := E9.falselist= 107

(9)E6→(E7)

E6.truelist := E7.truelist=106

E6.falselist := E7.falselist = 107

(10)E5→not E6

E5.truelist := E6.falselist = 107

E5.falselist := E6.truelist = 106

(11)E3→E4 and M2 E5

backpatch(E4.truelist, M2.quad )=(102, 104)

E3.falselist:= merge(E4.falselist, E5.falselist)

= merge(103,106)=106

E3.truelist := E5.truelist = 107

(12)E2→(E3)

E2.truelist := E3.truelist=107

E2.falselist := E3.falselist=106

(13)E→E1 or M1 E2

backpatch (E1.falselist, M1.quad )=(101,102)

E.truelist := merge(E1.truelist, E2.truelist)

= merge(100,107) = 107

E.falselist := E2.falselist=106

最终结果:A<10 or(B and not(C or D))

100(j<, A, 10, 0 )

101(j, _, _,102) 无条件转

102(jnz, B , _,104) 条件转

103(j, _, _, 0)

104(jnz, C , _, 0)

105(j, _, _, 106) 无条件转

106(jnz,D , _,103)106和103是一条链

107(j, _, _,100) 107和100是一条链

2.根据给出的语义规则,把下面的语句翻译成四元式序列(设第1条四元式地址为100):

While a

解: 语法树:

(1)M1→ε

M1.quad:=nextquad=100

(2)E1→E1 reLop E2(a

E1.trulist:=makelist(nextquad)=100

E1.falelist:=makelist(nextquad+1)=101

100(j<, a, c, 0) →(j<, a, c, 102),步骤(5)回填

101(j , _ , _ , 0)

(3)M3→ε

M2.quad:=nextquad=102

(4)E2→E1 reLop E2(b

{E2.trulist:=makelist(nextquad)=102

E2.falelist:=makelist(nextquad+1)=103

102(j<, b, d, 0) → (j<, b, d, 104),步骤18回填

103(j , _ , _ , 0) →( j , _ , _ , 101),步骤(5)拉链

(5)E → E1 and M3 E2

backpatch ( E1. truelist, M3.quad)=backpatch(100, 102) ,用102回填100

E.truelist := E2.truelist=102

E.falselist :=merge( E1.falselist, E2.falselist )=merge(101, 103)=103,103指向101

(6)M2→ε

M2.quad:=nextquad=104

(7)E3→E1 reLop E2 (a=1)

E3.trulist:=makelist(nextquad)=104

E3.falelist:=makelist(nextquad+1)=105

104(j=, a, 1, 0) → (j=, a, 1,106),步骤17回填

105(j , _ , _ , 0) → (j , _ , _ ,109) ,步骤17回填

(8)M4→ε

M4.quad:=nextquad=106

(9)E4→E1 * E2 (c*2)

E4.place:=newtemp=T1

106(*,c, 2, T1)

(10)A1→id:=E (c=c*2)

107(:=, T1, _, c)

(11)S2→A1

S2.nextlist :=makelist( )=NULL

(12)N1→ε

N1.nextlist:=makelist(nextquad)=108

108(j,_ , _,0) (j,_ , _,100),步骤18回填

(13)M5→ε

M5.quad:=nextquad=109

(14)E5→E1 + E2(a+x)

E5.place:=newtemp=T2

109(+,c, x, T2)

(15)A2→id:=E (a=a+x)

110(:=, T2, _, a)

(16)S3→A2

S3.nextlist :=makelist( )=NULL

(17)S1→if E3 then M4 S2 N1 else M5 S3

backpatch(E3.truelist,M4.quad)=backpatch(104,106),用106回填104 backpatch(E3.falselist,M4.quad)=(105,109) ,用109回填105 S1.nextlist:=merge(S2.nextlist,N1.nextlist,S3.nextlist)

=merge(NULL,108,NULL)=108

(18)S→While M1 E do M2 S1

backpatch (S1.nextlist,M1.quad)=backpatch(108,100) ,用100回填108 backpatch (E.truelist,M2.quad)=packpatch(102,104),用104回填102 S.nextlist:=E.falselist=103

111(j, _ , _ ,100)

(19)L→S

L.nextlist:= S.nextlist =103

While a

最终四元式序列:

100 (j<, a, c, 102)

101(j , _ , _ , 0)

102 (j<, b, d, 104)

103 ( j , _ , _ , 101)

104 (j=, a, 1,106)

105 (j , _ , _ ,109)

106(*,c, 2, T1)

107(:=, T1, _, c)

108 (j,_ , _,100)

109(+,c, x, T2)

110(:=, T2, _, a)

111(j, _ , _ ,100)

第8章 运行时存储空间组织

1.设有如下所示代码段,试写出在过程S 中调用过程Q 后的栈式存储空间分配情况。(右边所示为动态存储分配采用的活动记录结构,假设存储空间分配从地址0开始)

解答:

活动记录结构

编译原理作业答案

编译原理作业答案 Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】

《编译原理》第一次作业参考答案 一、下列正则表达式定义了什么语言(用尽可能简短的自然语言描述) 1.b*(ab*ab*)* 所有含有偶数个a的由a和b组成的字符串. 2.c*a(a|c)*b(a|b|c)* | c*b(b|c)*a(a|b|c)* 答案一:所有至少含有1个a和1个b的由a,b和c组成的字符串. 答案二:所有含有子序列ab或子序列ba的由a,b和c组成的字符串. 说明:答案一要比答案二更好,因为用自然语言描述是为了便于和非专业的人员交 流,而非专业人员很可能不知道什么是“子序列”,所以相比较而言,答案一要更 “自然”. 二、设字母表∑={a,b},用正则表达式(只使用a,b,?,|,*,+,)描述下列语言: 1.不包含子串ab的所有字符串. b*a* 2.不包含子串abb的所有字符串. b*(ab)* 3.不包含子序列abb的所有字符串. b*a*ba* 注意:关于子串(substring)和子序列(subsequence)的区别可以参考课本第119页方框中的内容. ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ 《编译原理》第二次作业参考答案

一、考虑以下NFA: 1.这一NFA接受什么语言(用自然语言描述) 所有只含有字母a和b,并且a出现偶数次或b出现偶数次的字符串. 2.构造接受同一语言的DFA. 答案一(直接构造通常得到这一答案): 答案二(由NFA构造DFA得到这一答案): 二、正则语言补运算

编译原理56章作业答案

第五章 练习5.1.1: 对于图5-1中的SDD,给出下列表达式对应的注释语法分析树: 1)(3+4)*(5+6)n 练习5.2.4: 这个文法生成了含“小数点”的二进制数: S->L.L|L L->LB|B B->0|1 设计一个L属性的SDD来计算S.val,即输入串的十进制数值。比如,串101.101应该被翻译为十进制的5.625。提示:使用一个继承属性L.side来指明一个二进制位在小数点的哪一边。 答: 元文法消除左递归后可得到文法: S->L.L|L L->BL’ L’->BL’|ε B->0|1 使用继承属性L.side指明一个二进制位数在小数点的哪一边,2表示左边,1表示右边 使用继承属性m记录B的幂次 非终结符号L和L’具有继承属性inh、side、m和综合属性syn

练习5.3.1:下面是涉及运算符+和整数或浮点运算分量的表达式文法。区分浮点数的方法是看它有无小数点。 E-〉E+T|T T-〉num.num|num 1)给出一个SDD来确定每个项T和表达式E的类型 2)扩展(1)中得到的SDD,使得它可以把表达式转换成为后缀表达式。使用一个单目运算符intToFloat把一个整数转换为相等的浮点数 答: 练习5.4.4:为下面的产生式写出一个和例5.10类似的L属性SDD。这里的每个产生式表

示一个常见的C语言中的那样的控制流结构。你可能需要生成一个三地址语句来跳转到某个标号L,此时你可以生成语句goto L 1)S->if (C) S1 else S2 2)S->do S1 while (C) 3)S->’{’ L ‘}’; L -> LS|ε 请注意,列表中的任何语句都可以包含一条从它的内部跳转到下一个语句的跳转指令,因此简单地为各个语句按序生成代码是不够的。 第六章 练习6.1.1:为下面的表达式构造DAG ((x+y)-((x+y)*(x-y)))+((x+y)*(x-y)) 答:DAG如下

编译原理课后习题答案(第三版)

精品文档 第二章 P36-6 (1) L G ()1是0~9组成的数字串 (2) 最左推导: N ND NDD NDDD DDDD DDD DD D N ND DD D N ND NDD DDD DD D ??????????????????0010120127334 556568 最右推导: N ND N ND N ND N D N ND N D N ND N ND N D ??????????????????77272712712701274434 886868568 P36-7 G(S) O N O D N S O AO A AD N →→→→→1357924680||||||||||| P36-8 文法: E T E T E T T F T F T F F E i →+-→→|||*|/()| 最左推导: E E T T T F T i T i T F i F F i i F i i i E T T F F F i F i E i E T i T T i F T i i T i i F i i i ?+?+?+?+?+?+?+?+??????+?+?+?+?+?+********()*()*()*()*()*()*() 最右推导: E E T E T F E T i E F i E i i T i i F i i i i i E T F T F F F E F E T F E F F E i F T i F F i F i i i i i ?+?+?+?+?+?+?+?+?????+?+?+?+?+?+?+**********()*()*()*()*()*()*()*() 语法树:/********************************

编译原理作业答案

《编译原理》第一次作业参考答案 一、下列正则表达式定义了什么语言(用尽可能简短的自然语言描述)? 1.b*(ab*ab*)* 所有含有偶数个a的由a和b组成的字符串. 2.c*a(a|c)*b(a|b|c)* | c*b(b|c)*a(a|b|c)* 答案一:所有至少含有1个a和1个b的由a,b和c组成的字符串. 答案二:所有含有子序列ab或子序列ba的由a,b和c组成的字符串. 说明:答案一要比答案二更好,因为用自然语言描述是为了便于和非专业的人员交流,而非专业人员很可能不知道什么是“子序列”,所以相比较而言,答案一要更“自然”. 二、设字母表∑={a,b},用正则表达式(只使用a,b, ,|,*,+,?)描述下列语言: 1.不包含子串ab的所有字符串. b*a* 2.不包含子串abb的所有字符串. b*(ab?)* 3.不包含子序列abb的所有字符串. b*a*b?a* 注意:关于子串(substring)和子序列(subsequence)的区别可以参考课本第119页方框中的内容. ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ 《编译原理》第二次作业参考答案 一、考虑以下NFA: 1.这一NFA接受什么语言(用自然语言描述)? 所有只含有字母a和b,并且a出现偶数次或b出现偶数次的字符串. 2.构造接受同一语言的DFA. 答案一(直接构造通常得到这一答案):

答案二(由NFA构造DFA得到这一答案): 二、正则语言补运算 3.画出一个DFA,该DFA恰好识别所有不含011子串的所有二进制串. 1.画出一个DFA,该DFA恰好识别所有不含011子串的所有二进制串.

编译原理第4章作业答案

编译原理第4章作业 答案 本页仅作为文档封面,使用时可以删除 This document is for reference only-rar21year.March

第四章 习题4.2.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 | b 2)不可以,文法中存在左递归,而自顶向下技术不适合左递归文法 3)消除左递归后的文法

rexpr -> rterm rexpr’ rexpr’-> + rterm rexpr’|ε rterm-> rfactor rterm’ rterm’-> rfactor rterm’|ε rfactor-> rprimay rfactor’ rfactor’-> *rfactor’|ε rprimary-> a | b 4)该文法无左递归,适合于自顶向下的语法分析 习题4.4.1:为下面的每一个文法设计一个预测分析器,并给出预测分析表。可能要先对文法进行提取左公因子或消除左递归 (3)S->S(S)S|ε (5)S->(L)|a L->L,S|S 解 (3) ①消除该文法的左递归后得到文法 S->S’ S’->(S)SS’|ε ②计算FIRST和FOLLOW集合 FIRST(S)={(,ε} FOLLOW(S)={),$} FIRST(S’)={(,ε} FOLLOW(S’)={),$} ③构建预测分析表

编译原理作业

编译原理作业 P7:1.1;1.2自编2.1;2.2自编2.3;2.4自编2.5自编3.1 自编3.2自编3.3;3.4P100.4.1;4.2自编4.3;4.4自编5.1 自编5.2自编7.1;7.2 自编8.1 P7:1.1 P7;1.2 自编2.1 文法G[S]:S→xSx│y所识别的语言是。 a. xyx b. (xyx)* c. x n yx n(n≥0) d. x*yx* 【解答】 自编2.2 令文法G[N]为 G[N]: N→D∣ND D→0∣1∣2∣3∣4∣5∣6∣7∣8∣9 (1) G[N]的语言L(G)是什么? (2) 给出句子0127、34和568的最左推导和最右推导。 【解答】 自编2.3 对于文法G[S]: S→(L)∣aS∣a L→L, S∣S (1) 画出句型(S,(a))的语法树; (2) 写出上述句型的所有短语、直接短语、句柄。 【解答】 自编2.4 已知文法G[S]为S→SaS∣ε,试证明文法G[S]为二义文法。 【解答】 自编2.5 按指定类型,给出语言的文法。 (1) L={a i b j│j>i≥1}的上下文无关文法; (2) 字母表∑={a,b}上的同时只有奇数个a和奇数个b的所有串的集合的正规文法;

自编3.1 什么是扫描器?扫描器的功能是什么? 自编3.2 结合自动机证明:正规式(ab)*a与正规式a(ba)*是否等价?给出分析过程。 自编3.3 已知自动机DFA如图3-4所示 图3-4 DFA 写出其对应的语言,分别用正规文法和自然语言描述。 【解答】 自编3.4 设有L(G)={a2n+1b2m a2p+1| n≥0,p≥0,m≥1}。 (1) 给出描述该语言的正规表达式; (2) 构造识别该语言的确定有限自动机(可直接用状态图形式给出)。【解答】 P100:4.1 P100;4.2 自编4.3 在算符优先分析法中,为什么要在找到最左素短语的尾时才返回来确定其对应的头,能否按扫描顺序先找到头后再找到对应的尾,为什么? 【解答】 自编4.4 设有文法G[S]: S→a|b|(A) A→SdA|S (1) 构造算符优先关系表;

蒋立源 编译原理第三版第二章 习题与答案(修改后)

第2章习题 2-1 设有字母表A1 ={a,b,c,…,z},A2 ={0,1,…,9},试回答下列问题: (1) 字母表A1上长度为2的符号串有多少个? (2) 集合A1A2含有多少个元素? (3) 列出集合A1(A1∪A2)*中的全部长度不大于3的符号串。 2-2 试分别构造产生下列语言的文法: (1){a n b n|n≥0}; (2){a n b m c p|n,m,p≥0}; (3){a n#b n|n≥0}∪{c n#d n|n≥0}; (4){w#w r# | w∈{0,1}*,w r是w的逆序排列 }; (5)任何不是以0打头的所有奇整数所组成的集合; (6)所有由偶数个0和偶数个1所组成的符号串的集合。 2-3 试描述由下列文法所产生的语言的特点: (1)S→10S0S→aA A→bA A→a (2)S→SS S→1A0A→1A0A→ε (3)S→1A S→B0A→1A A→C B→B0B→C C→1C0C→ε (4)S→aSS S→a 2-4 试证明文法 S→AB|DC A→aA|a B→bBc|bc C→cC|c D→aDb|ab 为二义性文法。 2-5 对于下列的文法 S→AB|c A→bA|a B→aSb|c 试给出句子bbaacb的最右推导,并指出各步直接推导所得句型的句柄;指出句子的全部短语。

2-6 化简下列各个文法 (1) S→aABS|bCACd A→bAB|cSA|cCC B→bAB|cSB C→cS|c (2) S→aAB|E A→dDA|e B→bE|f C→c AB|dSD|a D→eA E→fA|g (3) S→ac|bA A→c BC B→SA C→bC|d 2-7 消除下列文法中的ε-产生式 (1) S→aAS|b A→cS|ε (2) S→aAA A→bAc|dAe|ε 2-8 消除下列文法中的无用产生式和单产生式 (1) S→aB|BC A→aA|c|aDb B→DB|C C→b D→B (2) S→SA|SB|A A→B|(S)|( ) B→[S]|[ ] (3) E→E+T|T T→T*F|F F→P↑F|P P→(E)|i 第2章习题答案 2-1 答: (1) 26*26=676 (2) 26*10=260 (3) {a,b,c,...,z, a0,a1,...,a9, aa,...,az,...,zz, a00,a01,...,zzz},共有26+26*36+26*36*36=34658个 2-2 解: (1) 对应文法为G(S)=({S},{a,b},{ S→ε| aSb },S) (2) 对应文法为G(S)=({S,X,Y},{a,b,c},{S→aS|X,X→bX|Y,Y→cY|ε },S) (3)对应文法为G(S)=({S,X,Y},{a,b,c,d,#}, {S→X,S→Y,X→aXb|#, Y→cYd|# },S)

编译原理作业参考答案

第1章引言 1、解释下列各词 源语言:编写源程序的语言(基本符号,关键字),各种程序设计语言都可以作为源语言。 源程序: 用接近自然语言(数学语言)的源语言(基本符号,关键字)编写的程序,它是翻译程序处理的对象。 目标程序: 目标程序是源程序经过翻译程序加工最后得到的程序。目标程序 (结果程序)一般可由计算机直接执行。 低级语言:机器语言和汇编语言。 高级语言:是人们根据描述实际问题的需要而设计的一个记号系统。如同自然语言(接近数学语言和工程语言)一样,语言的基本单位是语句,由符号组和一组用来组织它们成为有确定意义的组合规则。 翻译程序: 能够把某一种语言程序(源语言程序)改变成另一种语言程序(目 标语言程序),后者与前者在逻辑上是等价的。其中包括:编译程序,解释程序,汇编程序。 编译程序: 把输入的源程序翻译成等价的目标程序(汇编语言或机器语言), 然后再执行目标程序(先编译后执行),执行翻译工作的程序称为编译程序。 解释程序: 以该语言写的源程序作为输入,但不产生目标程序。按源程序中语句动态顺序逐句的边解释边执行的过程,完成翻译工作的程序称为解释程序。 2、什么叫“遍” 指对源程序或源程序的中间形式(如单词,中间代码)从头到尾扫描一次,并作相应的加工处理,称为一遍。

3、简述编译程序的基本过程的任务。 编译程序的工作是指从输入源程序开始到输出目标程序为止的整个过程,整个过程可以划分5个阶段。 词法分析:输入源程序,进行词法分析,输出单词符号。 语法分析:在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位,并判断输入串是否构成语法正确的“程序”。 中间代码生成:按照语义规则把语法分析器归约(或推导)出的语法单位翻译成一定形式的中间代码。 优化:对中间代码进行优化处理。 目标代码生成:把中间代码翻译成目标语言程序。 4、编译程序与解释程序的区别 编译程序生成目标程序后,再执行目标程序;然而解释程序不生成目标程序,边解释边执行。 5、有人认为编译程序的五个组成部分缺一不可,这种看法正确吗 编译程序的5个阶段中,词法分析,语法分析,语义分析和代码生成生成是必须完成的。而中间代码生成和代码优化并不是必不可少的。优化的目的是为了提高目标程序的质量,没有这一部分工作,仍然能够得到目标代码。 6、编译程序的分类 目前基本分为:诊断编译程序,优化编译程序,交叉编译程序,可变目标编译程序。

编译原理_第三版_课后答案

编译 原理 课后题答案 第二章 P36-6 (1) L G ()1是0~9组成的数字串 (2) 最左推导: N ND NDD NDDD DDDD DDD DD D N ND DD D N ND NDD DDD DD D ??????????????????0010120127334 556568 最右推导: N ND N ND N ND N D N ND N D N ND N ND N D ??????????????????77272712712701274434 886868568 P36-7 G(S) O N O D N S O AO A AD N →→→→→1357924680||||||||||| P36-8 文法: E T E T E T T F T F T F F E i →+-→→|||*|/()| 最左推导: E E T T T F T i T i T F i F F i i F i i i E T T F F F i F i E i E T i T T i F T i i T i i F i i i ?+?+?+?+?+?+?+?+??????+?+?+?+?+?+********()*()*()*()*()*()*() 最右推导:

E E T E T F E T i E F i E i i T i i F i i i i i E T F T F F F E F E T F E F F E i F T i F F i F i i i i i ?+?+?+?+?+?+?+?+?????+?+?+?+?+?+?+**********()*()*()*()*()*()*()*() 语法树:/******************************** E E F T E + T F F T +i i i E E F T E -T F F T -i i i E E F T +T F F T i i i *i+i+i i-i-i i+i*i *****************/ P36-9 句子iiiei 有两个语法树: S iSeS iSei iiSei iiiei S iS iiSeS iiSei iiiei ???????? P36-10 /************** ) (|)(|S T T TS S →→ ***************/ P36-11 /*************** L1: ε ||cC C ab aAb A AC S →→→ L2:

哈工大编译原理习题及答案

1.1何谓源程序、目标程序、翻译程序、编译程序和解释程序?它们之间可能有何种关系? 1.2一个典型的编译系统通常由哪些部分组成?各部分的主要功能是什么? 1.3选择一种你所熟悉的程序设计语言,试列出此语言中的全部关键字,并通过上机使用该语言以判明这些关键字是否为保留字。 1.4选取一种你所熟悉的语言,试对它进行分析,以找出此语言中的括号、关键字END以及逗号有多少种不同的用途。 1.5试用你常用的一种高级语言编写一短小的程序,上机进行编译和运行,记录下操作步骤和输出信息,如果可能,请卸出中间代码和目标代码。 第一章习题解答 1.解:源程序是指以某种程序设计语言所编写的程序。目标程序是指编译程序(或解释程序)将 源程序处理加工而得的另一种语言(目标语言)的程序。翻译程序是将某种语言翻译成另一种语言的程序的统称。编译程序与解释程序均为翻译程序,但二者工作方法不同。解释程序的特点是并不先将高级语言程序全部翻译成机器代码,而是每读入一条高级语言程序语句,就用解释程序将其翻译成一段机器指令并执行之,然后再读入下一条语句继续进行解释、执行,如此反复。即边解释边执行,翻译所得的指令序列并不保存。编译程序的特点是先将高级语言程序翻译成机器语言程序,将其保存到指定的空间中,在用户需要时再执行之。即先翻译、后执行。 2.解:一般说来,编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间代码生成 程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组成。 3.解:C语言的关键字有:auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while。上述关键字在C语言中均为保留字。 4.解:C语言中括号有三种:{},[],()。其中,{}用于语句括号;[]用于数组;()用于函数(定 义与调用)及表达式运算(改变运算顺序)。C语言中无END关键字。逗号在C语言中被视为分隔符和运算符,作为优先级最低的运算符,运算结果为逗号表达式最右侧子表达式的值(如:(a,b,c,d)的值为d)。 5.略 第二章前后文无关文法和语言 21设有字母表A1={a,b,…,z},A2={0,1,…,9},试回答下列问题: (1) 字母表A1上长度为2的符号串有多少个? (2) 集合A1A2含有多少个元素? (3) 列出集合A1 (A1∪A2)*中的全部长度不大于3的符号串。

编译原理作业集-第七章

第七章语义分析和中间代码产生 本章要点 1. 中间语言,各种常见中间语言形式; 2. 说明语句、赋值语句、布尔表达式、控制语句等的翻译; 3. 过程调用的处理; 4. 类型检查; 本章目标 掌握和理解中间语言,各种常见中间语言形式;各种语句到中间语言的翻译;以及类型检查等内容。 本章重点 1.中间代码的几种形式,它们之间的相互转换:四元式、三元式、逆波兰表示; 3.赋值语句、算术表达式、布尔表达式的翻译及其中间代码格式; 4.各种控制流语句的翻译及其中间代码格式; 5.过程调用的中间代码格式; 6.类型检查; 本章难点 1. 各种语句的翻译; 2. 类型系统和类型检查; 作业题 一、单项选择题: 1. 布尔表达式计算时可以采用某种优化措施,比如A and B用if-then-else可解释为_______。 a. if A then true else B; b. if A then B else false; c. if A then false else true; d. if A then true else false; 2. 为了便于优化处理,三地址代码可以表示成________。 a. 三元式 b. 四元式 c. 后缀式 d. 间接三元式 3. 使用三元式是为了________:

a. 便于代码优化处理 b. 避免把临时变量填入符号表 c. 节省存储代码的空间 d. 提高访问代码的速度 4. 表达式-a+b*(-c+d)的逆波兰式是________。 a. ab+-cd+-*; b. a-b+c-d+*; c. a-b+c-d+*; d. a-bc-d+*+; 5. 赋值语句x:=-(a+b)/(c-d)-(a+b*c)的逆波兰式表示是_______。 a. xab+cd-/-bc*a+-:=;a. xab+/cd-bc*a+--:=;a. xab+-cd-/abc*+-:=;a. xab+cd-/abc*+--:=; 6. 在一棵语法树中结点的继承属性和综合属性之间的相互依赖关系可以由________来描述。 a. 抽象语法树; b. 语法规则; c. 依赖图; d. 三地址代码; 7. 按照教材中的约定,三地址语句if x relop y then L表示成四元式为。 a. (relop,x,y,L); b. (relop,L,x,y); c. (relop,x,L,y); d. (L,x,y,relop); 8. 在编译程序中,不是常见的中间语言形式。 a.波兰式; b. 三元式; c. 四元式; d. 抽象语法树; 9. 在编译程序中安排中间代码生成的目的是________。 a. 便于提高编译效率; b. 便于提高分析的正确性; c. 便于代码优化和目标程序的移植; d.便于提高编译速度; 10. 按照教材中的约定,下面不是类型表达式: a. boolean; b. type-error; c. real; d. DAG; 11. 一个Pascal函数 function f ( a, b:char ) :↑integer; …… 其作用域类型是: a. char×integer; b. char×char; c. char×pointer(integer); d. integer×integer; 12. 因为标识符可用于多种情况,比如常量标识符、变量标识符、过程标识符等等。因此,在符号表中为了给出各个符号的标志,常给标识符引入一个属性kind,然后在相应产生式的语义动作中添加给kind属性赋值的语句。比如,在在产生式D id:T的语义动作中添加赋值语句id.kind= 。 a. V AR; b. CONSTANT; c. PROC; d. FUNC; 13. 下面情况下,编译器需要创建一张新的符号表。 a. 过程调用语句; b. 标号说明语句; c. 数组说明语句; d.记录说明语句; 14. 函数function f(a,b:char):↑integer;… 所以f函数的类型表达式为: a. char×char→pointer(integer); b. char×char→pointer; c. char×char→integer; d. char×char→integer (pointer) 15. 如果一个语言的编译器能保证编译通过的程序,在运行时不会出现类型错误,则称该语言是。 a. 静态的; b. 强类型的; c. 动态的; d. 良类型的; 一.答案:1. b;2. d;3. b;4. d;5. c;6. c.;7. a;8. a;9. c;10. d;11. b;12. a;13. d; 14. a;15. b;

编译原理习题答案

《编译原理》习题答案: 第一次: P14 2、何谓源程序、目标程序、翻译程序、汇编程序、编译程序和解释程序?它们之间可能有何种关系? 答:被翻译的程序称为源程序; 翻译出来的程序称为目标程序或目标代码; 将汇编语言和高级语言编写的程序翻译成等价的机器语言,实现此功能的程序称为翻译程序; 把汇编语言写的源程序翻译成机器语言的目标程序称为汇编程序; 解释程序不是直接将高级语言的源程序翻译成目标程序后再执行,而是一个个语句读入源程序,即边解释边执行; 编译程序是将高级语言写的源程序翻译成目标语言的程序。 关系:汇编程序、解释程序和编译程序都是翻译程序,具体见P4 图 1.3。 P14 3、编译程序是由哪些部分组成?试述各部分的功能? 答:编译程序主要由8个部分组成:(1)词法分析程序;(2)语法分析程序;(3)语义分析程序;(4)中间代码生成;(5)代码优化程序;(6)目标代码生成程序;(7)错误检查和处理程序;(8)信息表管理程序。具体功能见P7-9。 P14 4、语法分析和语义分析有什么不同?试举例说明。 答:语法分析是将单词流分析如何组成句子而句子又如何组成程序,看句子乃至程序是否符合语法规则,例如:对变量 x:= y 符合语法规则就通过。语义分析是对语句意义进行检查,如赋值语句中x与y类型要一致,否则语法分析正确,语义分析则错误。 P15 5、编译程序分遍由哪些因素决定? 答:计算机存储容量大小;编译程序功能强弱;源语言繁简;目标程序优化程度;设计和实现编译程序时使用工具的先进程度以及参加人员多少和素质等等。 补充: 1、为什么要对单词进行内部编码?其原则是什么?对标识符是如何进行内部编码的? 答:内部编码从“源字符串”中识别单词并确定单词的类型和值;原则:长度统一,即刻画了单词本身,也刻画了它所具有的属性,以供其它部分分析使用。对于标识符编码,先判断出该单词是标识符,然后在类别编码中写入相关信息,以表示为标识符,再根据具体标识符的含义编码该单词的值。 补充: 2、赋值语句: A:= 5 * C的语法和语义指的是什么? 答:语法分析将检查该语句是否符合赋值语句规则,语义是指将 5 * C 的结果赋值为 A 。

编译原理课程作业

编译原理课程作业 一、单选题 1. (4分)文法G所描述的语言是______的集合。 A. 文法G的字符表V中所有符号组成的符号串 B. 文法G的字符表V的闭包V*中的所有符号串 C. 由文法的识别符号推出的所有符号串 D. 由文法的识别符号推出的所有终结符号串 得分:0 知识点:第六章 收起解析 答案 D 解析 第六章属性文法 2. (4分)在LR 分析法中,分析栈中存放的状态是识别规范句型_____的DFA 状态。 A. 句柄 B. 前缀 C. 活前缀 D. LR(0) 项目 得分:0 知识点:第五章 收起解析 答案 C 解析 第五章LR分析法 3. (4分)下面关于解释程序的描述正确的是____. (1) 解释程序的特点是处理程序时不产生目标代码(2) 解释程序适用于COBOL 和FORTRAN 语言(3) 解释程序是为打开编译程序技术的僵局而开发的 A. (1)(2) B. (1) C. (1)(2)(3) D. (2)(3) 得分:0 知识点:第一章 收起解析 答案 B 解析 第一章绪论

4. (4分)动态存储分配可采用的分配方案是()。 A. 队式存储分配 B. 栈式存储分配 C. 线性存储分配 D. 链式存储分配 得分:0 知识点:第八章 收起解析 答案 B 解析 第八章存储空间组织 5. (4分)正规式M 1 和M 2 等价是指_____。 A. M1和M2的状态数相等 B. M1和M2的有向边条数相等 C. M1和M2所识别的语言集相等 D. M1和M2状态数和有向边条数相等 得分:0 知识点:第三章 收起解析 答案 C 解析 第三章正规文法 6. (4分)编写一个计算机高级语言的源程序后,到正式上机运行一般要经过____这几步. (1) 编辑(2) 编译(3) 连接(4) 运行 A. (1)(2)(3)(4) B. (1)(2)(3) C. (1)(3) D. (1)(4) 得分:0 知识点:第一章 收起解析 答案 B 解析 第一章绪论 7. (4分)文法G 产生的()的全体是该文法描述的语言。 A. 句型 B. 终结符集

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

第 1 章引论 第1 题 解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 答案: (1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。 (2)源程序:源语言编写的程序称为源程序。 (3)目标程序:目标语言书写的程序称为目标程序。 (4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶 段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符 号表管理等工作。 (5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。 (6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。 第2 题 一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。 答案: 一个典型的编译程序通常包含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所识别的语言是。 a. xyx b. (xyx)* c. x n yx n(n≥0) d. x*yx* 2、文法G描述的语言L(G)是指。 a. L(G)={α|S+?α , α∈V T*} b. L(G)={α|S*?α, α∈V T*} c. L(G)={α|S*?α,α∈(V T∪V N*)} d. L(G)={α|S+?α, α∈(V T∪V N*)} 3、有限状态自动机能识别。 a. 上下文无关文法 b. 上下文有关文法 c.正规文法 d. 短语文法 4、设G为算符优先文法,G的任意终结符对a、b有以下关系成立。 a. 若f(a)>g(b),则a>b b.若f(a)

编译原理作业答案最终版

第一次作业答案: 3.12 词法单元描述 3.3.5 b)a*b*……z* c) /\*([^*”]|\*[^/]|\”([^”]*)\”)*\*/ h)b*(a|ab)* 3.7.3d

F转G错误,F跳转后的状态子集应包含9

第二次作业答案: 4.2.2 最左推导 S->SS S->S*S S->(S)*S S->(S+S)*S S->(a+S)*S S->(a+a)*S S->(a+a)*a Parse tree: 最右推导: S->SS S->S*a S->(S)*a

S->(S+S)*a S->(S+a)*a S->(a+a)*a 无二义性,只能画出一棵语法树。 4.3.2 提取左公因子: S->SS’|(S)|a S’->+S|S|* 消除左递归: S->(S)A|aA , A->BA|?B->S|+S|* FIRST(S) = { a , ( } FIRST(A) = {* , a , ( , + , ?} FIRST(B) = {* , a , ( , +} FOLLOW(S) = { ( , ) , a , * , + , $} LL1 parse table: 转换表如下: match stack input action S$ (a+a)*a$ (S)A$ (a+a)*a$ S->(S)A

( S)A$ a+a)*a$ match( ( aA)A$ a+a)*a$ S->aA (a A)A$ +a)*a$ match a (a BA)A$ +a)*a$ A->BA (a +SA)A$ +a)*a$ B->+S (a+ SA)A$ a)*a$ match + (a+ aAA)A$ a)*a$ S->aA (a+a AA)A$ )*a$ match a (a+a A)A$ )*a$ A->? (a+a )A$ )*a$ A->? (a+a) A$ *a$ match ) (a+a) BA$ *a$ A->BA (a+a) *A$ *a$ B->* (a+a)* A$ a$ match * (a+a)* BA$ a$ A->BA (a+a)* SA$ a$ B- >S (a+a)* aAA$ a$ S->aA (a+a)*a AA$ $ match a (a+a)*a $ $ A->?

编译原理课后答案

第二章 2.3叙述由下列正规式描述的语言 (a) 0(0|1)*0 在字母表{0, 1}上,以0开头和结尾的长度至少是2的01 串 (b) ((ε|0)1*)* 在字母表{0, 1}上,所有的01串,包括空串 (c) (0|1)*0(0|1)(0|1) 在字母表{0, 1}上,倒数第三位是0的01串 (d) 0*10*10*10* 在字母表{0, 1}上,含有3个1的01串 (e) (00|11)*((01|10)(00|11)*(01|10)(00|11)*)* 在字母表{0, 1}上,含有偶数个0和偶数个1的01串 2.4为下列语言写正规定义 C语言的注释,即以 /* 开始和以 */ 结束的任意字符串,但它的任何前缀(本身除外)不以 */ 结尾。 [解答] other → a | b | … other指除了*以外C语言中的其它字符 other1 → a | b | … other1指除了*和/以外C语言中的其它字符 comment → /* other* (* ** other1 other*)* ** */ (f) 由偶数个0和偶数个1构成的所有0和1的串。 [解答]由题目分析可知,一个符号串由0和1组成,则0和1的个数只能有四种情况: x 偶数个0和偶数个1(用状态0表示); x 偶数个0和奇数个1(用状态1表示); x 奇数个0和偶数个1(用状态2表示); x 奇数个0和奇数个1(用状态3表示);所以, x 状态0(偶数个0和偶数个1)读入1,则0和1的数目变为:偶数个0和奇数个1(状态1) x 状态0(偶数个0和偶数个1)读入0,则0和1的数目变为:奇数个0和偶数个1(状态2) x 状态1(偶数个0和奇数个1)读入1,则0和1的数目变为:偶数个0和偶数个1(状态0) x 状态1(偶数个0和奇数个1)读入0,则0和1的数目变为:奇数个0和奇数个1(状态3) x 状态2(奇数个0和偶数个1)读入1,则0和1的数目变为:奇数个0和奇数个1(状态3) x 状态2(奇数个0和偶数个1)读入0,则0和1的数目变为:偶数个0和偶数个1(状态0) x 状态3(奇数个0和奇数个1)读入1,则0和1的数目变为:奇数个0和偶数个1(状态2) x 状态3(奇数个0和奇数个1)读入0,则0和1的数目变为:偶数个0和奇数个1(状态1) 因为,所求为由偶数个0和偶数个1构成的所有0和1的串,故状态0既为初始状态又为终结状态,其状态转换图: 由此可以写出其正规文法为: S0 → 1S1 | 0S2 | ε S1 → 1S0 | 0S3 | 1 S2 → 1S3 | 0S0 | 0 S3 → 1S2 | 0S1 在不考虑S0 →ε产生式的情况下,可以将文法变形为: S0 = 1S1 + 0S2 S1 = 1S0 + 0S3 + 1 S2 = 1S3 + 0S0 + 0 S3 = 1S2 + 0S1 所以: S0 = (00|11) S0 + (01|10) S3 + 11 + 00 (1) S3 = (00|11) S3 + (01|10) S0 + 01 + 10 (2) 解(2)式得: S3 = (00|11)* ((01|10) S0 + (01|10)) 代入(1)式得: S0 = (00|11) S0 + (01|10) (00|11)*((01|10) S0 + (01|10)) + (00|11) => S0 = ((00|11) + (01|10) (00| 11)*(01|10))S0 + (01|10) (00|11)*(01|10) + (00|11) => S0 = ((00|11)|(01|10) (00|11)*(01|10))*((00|1

编译原理第二版课后习答案

《编译原理》课后习题答案第一章 第 1 章引论 第 1 题 解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 答案: (1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。 (2)源程序:源语言编写的程序称为源程序。 (3)目标程序:目标语言书写的程序称为目标程序。 (4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶 段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符 号表管理等工作。 (5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。 (6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。 第 2 题 一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程 序的总体结构图。 答案: 一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。其各部分的主要功能简述如下。 词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机表达形式。 语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。 语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。 中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式 的中间语言代码,如三元式或四元式。 中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。 目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。 表格管理程序:负责建立、填写和查找等一系列表格工作。表格的作用是记录源程序的 各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。可以说整个编译过程就是造表、查表的工作过程。需要指出的是,这里的“表格管理程序”并不意味着它就是一个独立的表格管理模块,而是指编译程序具有的表格管理功能。 错误处理程序:处理和校正源程序中存在的词法、语法和语义错误。当编译程序发现源

相关文档