当前位置:文档之家› 编译原理作业标准答案

编译原理作业标准答案

编译原理作业标准答案
编译原理作业标准答案

第一章引言

一、解释下列各词

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

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

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

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

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

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

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

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

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

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

二、什么叫“遍”?

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

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

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

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

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

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

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

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

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

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

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

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

六、编译程序的分类

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

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

一、P36

6、令文法为

N → D∣ND

D → 0∣1∣2∣?∣9

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

⑵给出句子34,568的最左推导和最右推导。

解:⑴

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

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

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

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

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

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

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

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

解:N → C∣AC∣ABC

C → 1∣3∣5∣7∣9

A → 1∣2∣?∣9

B → B`∣BB`

B` → 0∣A

8、令文法为

E → T∣E+T∣E-T

T → F∣T*F∣T/F

F →(E)∣i

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

⑵给出i+i+i,i+i*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?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

10、把下列文法改写为无二义的:

S → SS∣(S)∣()

解:改写后的文法

S → SA∣(S)∣()

A →(S)∣()

第三章词法分析

一、P64

7、构造下列正规式相应的DFA M

⑴构造相应的NFA M

⑵构造转换矩阵表(用子集法)

I I0 I1 S 0 1

{X} {1,2,3} 0 1 {1,2,3} {2,3} {2,3,4} 1 2 3

{2,3} {2,3} {2,3,4} 2 2 3

2,3,4} {2,3,5} {2,3,4} 3 4 3 {2,3,5} {2,3} {2,3,4,Y} 4 2 5 {2,3,4,Y} {2,3,5} {2,3,4} 5 4 3

⑷将DFA M最小化

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

π={0,1,2,3,4},{5}

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

{0,1,2,3,4}1={1,3,3,3,5}?{0,1,2,3,4}

对于输入1是可区别的,将{0,1,2,3,4}分为 {0,1,2,3} 和 {4}。

πnew = {0,1,2,3},{4},{5}

③对πnew 进行考察;

{0,1,2,3}0={-,2,2,4}?{0,1,2,3}

由于0结点不能接受输入的数字“0”,并不属于任何状态集,所以先将{0}结点区别出来,又由于3结点输入的数字“0”到达4结点,所以将3结点也区别出来{3}。将{0,1,2,3} 分为 {0} ,{1,2}和 {3}

πnew = {0},{1,2},{3},{4},{5}

④对πnew 进行考察;

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

则{1,2}不可划分合为一个状态,最终的结果是;

πnew = {0},{1,2},{3},{4},{5}。

⑸根据最小化的结果构造矩阵表

旧名 {0} {1,2} {3} {4} {5}

新名 0 1 2 3 4

S 0 1

0 1

1 1 2

2 3 2

3 1 4

4 3 2

⑹构造最小化的DFA M

0 0

12将下图的有限自动机确定化和最小化

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

⑵构造转换矩阵表(用子集法)

I I a I b S a b

{0} {0,1} {1} 0 1 2

{0,1} {0,1} {1} 1 1 2

{1} {0} 2 0

⑶由转换矩阵构造DFA M

⑷将DFA M 最小化

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

π={2},{0,1}

②对每一个子集及每一个a ∈∑

进行考察;

{0,1}A ={1}

?{0,1}

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

{2} 对于输入a 和b 均是不可区别的,所以

πnew = {0,1},{2}

⑸根据最小化的结果构造矩阵表

旧名 {0,1} {2} S a b

新名 0 1 0 0 1

1 0

⑹构造最小化的DFA M

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

⑴写出正规集的正规式的表示形式

(0∣10)*

⑵构造相应的NFA M

⑶构造转换矩阵表(用子集法)

I I0 I1 S 0 1

{X,1,Y} {!,Y} {2} 0 1 2

{1,Y} {1,Y} {2} 1 1 2

{2} {1,Y} 2 1

⑷由转换矩阵构造DFA M

⑸将DFA M最小化

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

π={2},{0,1}

②对每一个子集及每一个0,1∈∑进行考察;

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

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

对于输入a和b均是不可区别的,所以

πnew = {0,1},{2}

⑸根据最小化的结果构造矩阵表

旧名 {0,1} {2} S 0 1

新名 0 1 0 0 1

1 0

⑹构造最小化的DFA M

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

一、用P76的文法写出表达式 (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`→ε

二、P81

一、考虑下面文法G

S→ a∣^∣(T)

T→T,S∣S

⑴消除文法的左递归。

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

解:

⑴经考察该文法S→ a∣^∣(T)的各侯选式的首字符都是终结符号,所以只有T→T,S∣S是直接左递归。根据改写算法,改写后的文法是:

S→ a∣^∣(T)

T→ST`

T`→,ST`∣ε

⑵证明改写后的文法是否是LL(1)的.

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

FIRST(a)?FIRST(^)=φ

FIRST(a)?FIRST(()=φ

FIRST(^)?FIRST(()=φ

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

求FIRST(T`)={,,ε}

FOLLOW(T`)={ ) }

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

该文法是LL(1)的。

⑶构造预测分析表

a , ^ () #

S S→ a S→^ S→(T)

T T→ST` T→ST` T→ST` T` T`→,ST` T`→ε

2、下面的文法G

E→ TE`

E`→+E∣ε

T→FT`

T`→T∣ε

F→PF`

F`→*F`∣ε

P→(E)∣^∣a∣b

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

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

⑶构造它的预测分析表。

解:

⑴求非终结符的FIRST和FOLLOW。

求非终结符的FIRST:

因为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 ,+,),# }.

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

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

FIRST((E))?FIRST(^)=φ

FIRST((E))?FIRST(a)=φ

FIRST((E))?FIRST(b)=φ

FIRST(^)?FIRST(a)=φ

FIRST(^)?FIRST(b)=φ

FIRST(a)?FIRST(b)=φ

②证明E`→+E∣ε,T`→T∣ε,F`→*F`∣ε非终结符号的FIRST和FOLLOW是否相交。

FIRST(E`)? FOLLOW(E`)={+,ε}?{#, ) }=φ

FIRST(T`)? FOLLOW(T`)={(, ^, a, b ,ε}?{+,#,) }=φ

FIRST(F`)? FOLLOW(F`)={*,ε}?{(,^,a,b ,+,#,)}=φ

该文法是LL(1)的。

⑶构造预测分析表

+ * ( ) a b ^ #

E TE` TE` TE` TE`

E` +E` εε

T FT` FT` FT` FT`

T` ε T ε T T T ε

F PF` PF` PF` PF`

F` ε *F` εεεεεε

P (E) a b ^

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

二、P133

一、 令文法为

E →E+T ∣T

T →T*F ∣F

F →(E )∣i

证明E+T*F 是它的一个句型,指出这个句型的所有短语,直接短语和句柄。

证明输入串E+T*F 是文法的一个句型,建立一个最右推导:

E ?E+T ?E+T*

F ,E+T*F 是该文法的句型。 E * =>E 且 E + =>E+T*F

所以,E+T*F 是句型E+T*F+i 对于E 的一个短语。 因为 E * =>E+T 且 T ?T*F

所以,T*F 是句型E+T*F 对于T →T*F 的一个直接短语。

句型E+T*F 的短语为E+T*F ,直接短语为T*F ,由于直接短语是唯一的,因此T*F 为句柄。

三、P134

5考虑文法

S →AS ∣b

A →SA ∣a

⑴列出这个文法的所有LR (0)项目。

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

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

解:

⑴构造拓广文法,并列出文法的所有项目

S`→S S`→·S S`→S·

S→AS S→·AS S→A·S S→AS·

S→b S→·b S→b·

A→SA A→·SA A→S·A A→SA·

A→a A→·a A→a·

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

⑶证明文法是SLR(1)的吗?

为了验证这个文法是否是SLR(1)文法,必须对LR(0)项目规范族的各个项目集I,验证其是否存在“移进-归约”、“归约-归约”冲突。该项目规范族中的I1,I4,I5存在“移进-归约”,只需证明存在集合的?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?=φ,所以不存在“移进-归约”冲突。

对状态I4有

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

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

对状态I5也同样存在这种冲突,即FOLLOW(S)??a,b?

=?#,a,b???a,b?≠φ,因此,该文法不是SLR(1)文法。

四、P135

7、证明下面文法是SLR(1)担不是LR(0)的

S→A

A→Ab∣bBa

B→aAc∣a∣aAb

证明:

因为项目A→Ab·和B→aAb·出现在一个项目集中,造成“归约-归”约冲突,所以不是LR(0)文法。又因为FOLLOW(A)={b,c,#},FOLLOW(B)={a}使得FOLLOW(A)∩FOLLOW (B)=φ,构造SLR(1)分析表时不会出现冲突,所以该文法是SLR(1)的。

五、对给定文法G,构造分析表,并利用此分析表判定符号串accd是否文法的句子?

(0)S→E ⑴E →aA ⑵E →bB ⑶A →cA ⑷A→d ⑸B →cB ⑹B →d

解:该文法在P110,分析表在P109,

①构造LR(0)的项目在P105(略)。

②构造LR(0)识别活前缀的DFA在P106(略)

③构造LR(0)分析表在P109(略)。

④利用LR

第六章属性文法和语法制导翻译

思考题

P164 1

第七章语义分析和中间代码产生

一、P218

5、把下列赋值语句翻译为三地址代码序列,语义规则在P181:

A[i,j]:=B[i,j]+C[A[K,i]+D[i+j]]

解:

求A[i,j]

L→id (i)

{L.place:=id.place; L.offset:=null}

E→L

{if L.offset=null then E.place:=L.place

else begin

E.place:=newtemp;

emit(E.place := L.place[L.offset])

end}

Elist→id[E (i)

{Elist.place:=E.place; Elist.ndim:=1; Elist.array:=id.place} L→id (j)

{L.place:=id.place; L.offset:=null}

E→L

{if L.offset=null then E.place:=L.place

else begin

E.place:=newtemp;

emit(E.place:=L.place[L.offset])

end}

Elist→Elist,E (j)

{t:=newtemp; m:=Elist.ndim+1;

emit(t := Elist.place * limit(Elist1.array,m)

emit(t := t + E.place)

Elist.array:=Elist1.array; Elist.place:=t; Elist.ndim:=m;} L→Elist ]

{ L.place:=newtemp;

emit(L.place ‘:=’ Elist.arry ‘- ‘c )

L.offset:=newtemp;

emit(L.offset ‘:=’ w ‘*’Elist.place)}

求B[i,j]的处理同A[i,j](省略中间过成)

Elist→id[E (i)

{Elist.place:=E.place; Elist.ndim:=1; Elist.array:=id.place} Elist→Elist,E (j)

{t:=newtemp; m:=Elist.ndim+1;

emit(t := Elist.place * limit(Elist1.array,m)

emit(t := t + E.place)

Elist.array:=Elist1.array; Elist.place:=t; Elist.ndim:=m;} L→Elist ]

{ L.place:=newtemp;

emit(L.place ‘:=’ Elist.arry ‘- ‘c )

L.offset:=newtemp;

emit(L.offset ‘:=’ w ‘*’Elist.place)}

E→L

{if L.offset=null then E.place:=L.place

else begin

E.place:=newtemp;

emit(E.place:=L.place[L.offset])

end}

求A[K,i]

Elist→id[E (k)

{Elist.place:=E.place; Elist.ndim:=1; Elist.array:=id.place} Elist→Elist,E (i)

{t:=newtemp; m:=Elist.ndim+1;

emit(t := Elist.place * limit(Elist1.array,m)

emit(t := t + E.place)

Elist.array:=Elist1.array; Elist.place:=t; Elist.ndim:=m;} L→Elist]

{ L.place:=newtemp;

emit(L.place ‘:=’ Elist.arry ‘- ‘c )

L.offset:=newtemp;

emit(L.offset ‘:=’ w ‘*’Elist.place)}

E→L

{if L.offset=null then E.place:=L.place

else begin

E.place:=newtemp;

emit(E.place:=L.place[L.offset])

end}

求D[i+j]

E→E+E

{E.place:=newtemp;

emit(E.place := E1.place + E2.place)}

Elist→id[E (i+j)

{Elist.place:=E.place; Elist.ndim:=1; Elist.array:=id.place}

L→Elist]

{ L.place:=newtemp;

emit(L.place ‘:=’ Elist.arry ‘- ‘c )

L.offset:=newtemp;

emit(L.offset ‘:=’ w ‘*’Elist.place)}

E→L

{if L.offset=null then E.place:=L.place

else begin

E.place:=newtemp;

emit(E.place:=L.place[L.offset])

end}

求C[A[K,i]+D[i+j]]

E→E+E

{E.place:=newtemp;

emit(E.place := E1.place + E2.place)}

Elist→id[E

{Elist.place:=E.place; Elist.ndim:=1; Elist.array:=id.place}

L→Elist]

{ L.place:=newtemp;

emit(L.place ‘:=’ Elist.arry ‘- ‘c )

L.offset:=newtemp;

emit(L.offset ‘:=’ w ‘*’Elist.place)}

E→L

{if L.offset=null then E.place:=L.place

else begin

E.place:=newtemp;

emit(E.place:=L.place[L.offset])

end}

求B[i,j]+C[A[K,i]+D[i+j]]

E→E+E

{E.place:=newtemp;

emit(E.place := E1.place + E2.place)}

求A[i,j]:=B[i,j]+C[A[K,i]+D[i+j]]

S→L:=E

{if L.offset=null then emit(L.place:=E.place)

else emit(L.place[L.offset]:=E.place)}

三地址代码序列:

100 (T1:= i * n2)

101 (T1:= T1 + j)

102 (T2:= A - CA)

103 (T3:= T1 * 4)

104 (T4:= i * n2)

105 (T4:= T1 + j)

106 (T5:= B - CB)

107 (T6:= T4 * 4)

108 (T7:= T5[T6]) T7存放B[i,j]的值

109 (T8:= i * n2)

110 (T8:= T1 + j)

112 (T9:= A - CA)

113 (T10:= T8 * 4)

114 (T11:= T9[T10]) T11存放A[K,i]的值

115 (T12:= i + j)

116 (T13:= D - CD)

117 (T14:= T12 * 4)

118 (T15:= T13[T14]) T15存放D[i+j]的值

119 (T16:=T11+T15) T16存放A[k,i]+ D[i+j]的值

120 (T17:= C - CC)

121 (T18:= T16 * 4)

122 (T19:= T17[T18]) T19存放C[A[K,i]+D[i+j]]的值

123 (T20:=T7+T19) T20存放B[i,j]+C[A[K,i]+D[i+j]]的值

124 (T2[T1]:=T20)

6、写出下列布尔表达式的翻译过程(第一条四元式地址为100),语义规则在P190。

A or(

B and not(

C or D)

A or M1(

B and M2 not(

C or M3 D)

解:

E→id (A)

{E.truelist:=makelist(nextqutd)(100);

E.falselist:=makelist(nextquad+1)(101);

emit(jnz, A.piace, , 0)

emit(j, , , , 0)

M1→ε

{M1.quad:=nextquad}(102)

E→id (B)

{E.truelist:=makelist(nextqutd)(102);

E.falselist:=makelist(nextquad+1)(103);

emit(jnz, B.piace, , 0)

emit(j, , , , 0)

M2→ε

{M2.quad:=nextquad}(104)

E→id (C)

{E.truelist:=makelist(nextqutd)(104);

E.falselist:=makelist(nextquad+1)(105);

emit(jnz, B.piace, , 0)

emit(j, , , , 0)

M3→ε

{M3.quad:=nextquad}(106)

E→id (D)

{E.truelist:=makelist(nextqutd)(106);

E.falselist:=makelist(nextquad+1)(107);

emit(jnz, B.piace, , 0)

emit(j, , , , 0)

E→E1 or M3 E2

{backpatch(E1.falselist,M3.quad);

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

E.falselist:=E2.falselist}

E→not E

{ E.truelist:=E1.falselist; E.falselist:=E2.truelist} E→E1 and M2 E2

{backpatch(E1.turelist,M2.quad);

E.falselist:=merge(E1.falselist,E2.falselist);

E.truelist:=E2.truelist}

E→E1 or M1 E2

{backpatch(E1.falselist,M1.quad);

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

E.falstlist:=E2.falselist}

四元式序列:

100 (jnz, A, ,0 )

101 (jmp, , ,102)

102 (jnz, B, ,104)

103 (jmp, , ,0 )

104 (jnz, C, ,103)

105 (jmp, , ,106)

106 (jnz, D, ,104)

107 (jmp, , ,100)

二、写出下列语句的翻译过程(第一条四元式地址为100), 语义规则在P196。

解:

求A

M1→ε

{M1.quad:=nextquad}100

E→E1 reLop E2 (A

{E.trulist:=makelist(nextquad);

E.falelist:=makelist(nextquad+1);

emit(jrelop, id1.place, id2.place, 0);

emit(jmp , _ , _ , 0)}

M2→ε

{M1.quad:=nextquad}102

E→E1 reLop E2 (B

{E.trulist:=makelist(nextquad);

E.falelist:=makelist(nextquad+1);

emit(jrelop, id1.place, id2.place, 0);

emit(jmp , _ , _ , 0)}

M3→ε

{M3.quad:=nextquad}104

求A=1

E→E1 reLop E2 (A=1)

{E.trulist:=makelist(nextquad);

E.falelist:=makelist(nextquad+1);

emit(jrelop, id1.place, id2.place, 0);

emit(jmp , _ , _ , 0)}

M4→ε

{M4.quad:=nextquad}106

求c:=c+1

E→E+E

{E.place:=newtemp;

emit(E.place := E1.place + E2.place)}

S→id:=E

{p:=lookup(https://www.doczj.com/doc/8b3155508.html,);if p≠null then emit(p:=E.place) else error } N→ε

{N.nextlist:=makelist(nextquad); emit(jmp, , ,0)} M5→ε

{M5.quad:=nextquad}108

求A:=A+Z

E→E+E

{E.place:=newtemp;

emit(E.place := E1.place + E2.place)}

S→id:=E

{p:=lookup(https://www.doczj.com/doc/8b3155508.html,);if p≠null then emit(p:=E.place) else error }

求if A=1 then c:=c+1 else A:=A+Z

S→if E then M1 S1 N else M2 S2

{backpatch(E.truelist,M1.quad);

backpatch(E.falselist,M2.quad);

S.nextlist:=merge(S1.nextlist,N.nextlist,S2.nextlist)} 求While A

S→While M1 E do M2 S1

{backpatch (S1.nextlist,M1 .quad);

backpatch (E.truelist,M2.quad);

S.nextlist:=E.falselist;

emit(‘j,_,_,’ M1..quad)}

L→S

{L.nextlist:= S.nextlist }

L S→S

{backpatch (L.nextlist, M.quad)

四元式序列:

100 (j<, A, C,102)

101 (jmp, , ,112)

102 (j<, B, D,104)

103 (jmp, , , 112)

104 (j=, A, 1,106)

105 (jmp, , ,109)

106 (+ , C, 1, T1)

107 (:=, T1, , C)

108 (jmp, , ,100)

109 (+ , A , Z,T2)

110 (:=, T2, , A)

111 (jmp, , ,100)

112

第十章优化

思考题

一、P306

1, 2, 3(B1)(按结点顺序写出优化后的四元式序列)

二、试画出如下中间代码序列的程序流图

a、求必经结点与必经结点集;

b、求回边;

c、由回边求循环

给定的中间代码序列为:

J := 0;

L1: I := 0;

If I<8 goto L3;

L2: A := B+C;

B :=D*C;

L3: IF B=0 goto L4;

Write B;

Goto L5;

L4: I := I+1;

IF I<8 Goto L2;

L5: J := J+1;

IF J <=3 goto L1;

HALT;

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

思考题

一、何谓静态分配,对程序语言有何要求? 何谓动态分配,对程序语言有何要求?编译时如何实现动态分配?

二、P269 4.

编译原理课程设计

<PL0编译器-PCompiler> 软件需求说明书 作者:刁诗云、麻汉华、潘彦荃、周津、李程完成日期:2009年6月7日 签收人: 签收日期: 修改情况记录:

目录 软件需求说明书 (1) 1 引言 (1) 1.1 编写目的 (1) 1.2 项目背景 (1) 2 项目概述 (2) 2.1 产品描述 (2) 2.2 产品功能 (2) 2.3 用户特点 (2) 3 具体需求 (3) 3.1 EBNF定义的PL/0文法 (3) 3.2 语法图 (4) 3.3 功能需求 (6) 3.4 系统概要设计 (15)

1 引言 1.1 编写目的 为了清楚表达客户提出的需求,便于用户理解和确认项目所包含的具体功能需求、性能需求以及非公能性需求,因此以文件化的形式,把系统整体及其部分的业务流程、系统功能进行了详细的说明。同时,此文也对开发人员起到引导的作用,请认真阅读。 1.2 项目背景 PL/0是由世界著名计算机科学家、PASCAL语言的创始人N.Wirth教授选择提供的。在选择PL/0语言的过程中,Wirth很费了一番脑筋。一方面他希望借助这个语言,能尽可能把程序设计语言和编译技术一些最重要的内容都讲到;但另一方面又不希望内容太多,太杂,而希望尽可能简单一些,以便与有限的课时和课程范围相适应。于是他精心选择提供了这个PL/0语言。事实证明,它非常适合于编译技术的教学,目前已被国内越来越多的编译教材所采用。 PL/0语言的语句类型比较丰富,能适应各种可能的程序结构。最进本的是赋值语句。组合结构语句有语句串、条件语句和循环语句。还有重要的子程序概念,是通过过程说明和过程调用两部分实现的。至于数据类型和数据结构,PL/0则特别简单,只有整数类型一种,没有数据结构,因此只允许有整常数和整数变量的说明以及相应的算术运算表达式。PL/0允许在一个过程范围内说明常数、变量和过程。这些常数、变量和过程只在它们被说明的过程范围内有效。PL/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得到这一答案): 二、正则语言补运算

编译原理作业答案

《编译原理》第一次作业参考答案 一、下列正则表达式定义了什么语言(用尽可能简短的自然语言描述)? 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子串的所有二进制串.

嵌入式Linux学习之规划篇

嵌入式Linux学习之规划篇 嵌入式Linux 课程目标是达到适应嵌入式应用软件开发、嵌入式系统开发或嵌入式驱动开发的基本素质。采用了目前应用最广泛的软硬件开发平台(Linux和Arm)。 学习步骤如下: 1、Linux 基础 安装Linux操作系统 Linux文件系统(windows的文件共享) Linux的基本命令及使用 Linux启动过程详解 熟悉Linux服务能够独立安装Linux操作系统 能够熟练使用Linux系统的基本命令 认识Linux系统的常用服务安装Linux操作系统 Linux基本命令实践 设置Linux环境变量 定制Linux的服务 Shell 编程基础使用vi编辑文件 使用Emacs编辑文件 使用其他编辑器 2、Shell 编程基础 Shell简介 认识后台程序 Bash编程熟悉Linux系统下的编辑环境 熟悉Linux下的各种Shell 熟练进行shell编程熟悉vi基本操作 熟悉Emacs的基本操作 比较不同shell的区别 编写一个测试服务器是否连通的shell脚本程序 编写一个查看进程是否存在的shell脚本程序 编写一个带有循环语句的shell脚本程序 3、Linux 下的 C 编程基础 linux C语言环境概述 Gcc使用方法 Gdb调试技术 Autoconf Automake Makefile 代码优化熟悉Linux系统下的开发环境 熟悉Gcc编译器 熟悉Makefile规则编写Hello,World程序 使用 make命令编译程序 编写带有一个循环的程序 调试一个有问题的程序

4、嵌入式系统开发基础 嵌入式系统概述 交叉编译 配置TFTP服务 配置NFS服务 下载Bootloader和内核 嵌入式Linux应用软件开发流程 熟悉嵌入式系统概念以及开发流程 建立嵌入式系统开发环境制作cross_gcc工具链 编译并下载U-boot 编译并下载Linux内核 编译并下载Linux应用程序 嵌入式系统移植 Linux内核代码 平台相关代码分析 ARM平台介绍 平台移植的关键技术 移植Linux内核到 ARM平台了解移植的概念 能够移植Linux内核移植Linux2.6内核到 ARM9开发板【1 配置编译Linux内核 1.1 Linux内核源代码结构 1.2 Linux内核编译选项解析 1.3 Linux内核编译链接 2.0 Linux启动过程源代码分析 3.0 Linux内核移植平台相关代码分析】 5、嵌入式 Linux 下串口通信 串行I/O的基本概念 嵌入式Linux应用软件开发流程 Linux系统的文件和设备 与文件相关的系统调用 配置超级终端和MiniCOM 能够熟悉进行串口通信 熟悉文件I/O 编写串口通信程序 编写多串口通信程序 6、嵌入式系统中多进程程序设计 Linux系统进程概述 嵌入式系统的进程特点 进程操作 守护进程 相关的系统调用了解Linux系统中进程的概念 能够编写多进程程序编写多进程程序 编写一个守护进程程序 sleep系统调用任务管理、同步与通信 Linux任务概述任务调度 管道

编译原理作业

编译原理作业 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) 构造算符优先关系表;

编译原理作业参考答案

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

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

编译原理大作业

《编译原理》实验报告 课程编译原理 实验名称编译原理综合实验 专业 班级 姓名 学号 完成日期2013/6/5

目录 实验一 (2) 实验目的和内容 (2) PL/0语言描述 (2) 内部码对照表 (3) 实验过程及方法 (4) 实验结果 (4) 总结 (5) 实验二 (5) 实验目的 (5) 实验内容及要求 (6) 实验算法 (7) 实验结果 (7) 总结 (8) 实验三 (8) 实验目的 (8) 实验内容 (9) 实现算法 (9) 实验结果 (9) 总结 (12) 实验一 实验目的和内容 1.实验目的:通过完成词法分析程序,了解词法分析的过程。 2.实验内容:用C/C++实现对Pascal的子集程序设计语言的词法识别程序。 3.实验要求:将该语言的源程序,也就是相应字符流转换成内码,并根据需要是否对于标识符填写相应的符号表供编译程序的以后各阶段使用。 PL/0语言描述 PL/0程序设计语言是一个较简单的语言,它以赋值语句为基础,包括顺序、条件和循环三种控制结构。PL/0有子程序(即函数)概念。PL/0中唯一的数据类型是整型,可以用来说明该类型的常量和变量。当然PL/0也具有通常的算术运算和关系运算。

具体的PL/0语法描述如下(采用扩充的BNF表示)。 <程序>→<程序首部> <分程序> {<分程序>}. <程序首部>→PROGRAM标识符; <分程序>→<过程首部> [<常量说明部分>] [<变量说明部分>] <复合语句> <常量说明部分>→CONST <常量定义> {,<常量定义> } ; <常量定义>→标识符= 无符号整数 <变量说明部分>→V AR <变量定义> {;<变量定义>}; <变量定义>→标识符{,标识符}:<类型> <类型>→INTEGER <过程首部>→PROCEDURE标识符;| PROCEDURE标识符(标识符:<类型>); <复合语句>→BEGIN<语句>{;<语句>}END <语句>→<赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句> |<读语句>|<写语句>|<复合语句>|ε <赋值语句>→标识符:=<表达式> <条件语句>→IF<条件>THEN<语句> <条件语句> → if<布尔表达式> then <语句>|if<布尔表达式> then <语句> else <语句> <布尔表达式> → <条件> | !<布尔表达式>| <布尔表达式> && <布尔表达式> <当型循环语句>→WHILE<条件>DO<语句> <过程调用语句>→CALL 标识符| CALL 标识符(<表达式>) <读语句>→READ(标识符{,标识符} ) <写语句>→WRITE(<表达式>{,<表达式>}) <条件>→<表达式><关系运算符><表达式> | ODD<表达式> <表达式>→<项>{<加型运算符><项>} <项>→<因子>{<乘型运算符><因子>} <因子>→标识符| 无符号整数| (<表达式>) <加型运算符>→+|- <乘型运算符>→* | / <关系运算符>→=|<>|<|<=|>|>= 内部码对照表 表1-1 内部码对照表 内码单词内码单词内码单词内码单词 1 PROGRAM 2 CONST 3 V AR 4 INTEGER 5 Call 6 PROCEDURE 7 IF 8 THEN

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

精品文档 第二章 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.一个上下文无关文法的开始符,可以是终结符或非终结符。 ( ) 2.一个句型的直接短语是唯一的。 ( ) 3.已经证明文法的二义性是可判定的。 ( ) 4.每个基本块可用一个DAG表示。 ( ) 5.每个过程的活动记录的体积在编译时可静态确定。 ( ) 6.2型文法一定是3 型文法。 ( ) 7.一个句型一定句子。 ( ) 8.算符优先分析法每次都是对句柄进行归约。 ( ) 9.采用三元式实现三地址代码时,不利于对中间代码进行优化。 ( ) 10.编译过程中,语法分析器的任务是分析单词是怎样构成的。 ( ) 11.一个优先表一定存在相应的优先函数。 ( ) 12.目标代码生成时,应考虑如何充分利用计算机的寄存器的问题。 ( ) 13.递归下降分析法是一种自下而上分析法。 ( ) 14.并不是每个文法都能改写成 LL(1)文法。 ( ) 15.每个基本块只有一个入口和一个出口。 ( ) 16.一个 LL(1)文法一定是无二义的。 ( ) 17.逆波兰法表示的表达试亦称前缀式。 ( ) 18.目标代码生成时,应考虑如何充分利用计算机的寄存器的问题。 ( ) 19.正规文法产生的语言都可以用上下文无关文法来描述。 ( ) 20.一个优先表一定存在相应的优先函数。 ( ) 21.3型文法一定是 2型文法。 ( ) 22.如果一个文法存在某个句子对应两棵不同的语法树,则文法是二义性的。 ( ) 二、填空题: 1.( )称为规范推导。 2.编译过程可分为(),(),(),()和()五个阶段。 3.如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是()。 4.从功能上说,程序语言的语句大体可分为()语句和()语句两大类。 5.语法分析器的输入是(),其输出是()。 6.扫描器的任务是从()中识别出一个个()。 7.符号表中的信息栏中登记了每个名字的有关的性质,如()等等。 8.一个过程相应的DISPLAY表的内容为()。 9.一个句型的最左直接短语称为句型的()。 10.常用的两种动态存贮分配办法是()动态分配和()动态分配。 11.一个名字的属性包括( )和( )。 12.常用的参数传递方式有(),()和()。 13.根据优化所涉及的程序范围,可将优化分成为(),()和()三个级别。 14.语法分析的方法大致可分为两类,一类是()分析法,另一类是()分析法。 15.预测分析程序是使用一张()和一个()进行联合控制的。 16.常用的参数传递方式有(),()和()。 17.一张转换图只包含有限个状态,其中有一个被认为是()态;而且实际上至少要有一个()态。 18.根据优化所涉及的程序范围,可将优化分成为(),()和()三个级别。 19.语法分析是依据语言的()规则进行。中间代码产生是依据语言的()规则进行的。 20.一个句型的最左直接短语称为句型的()。 21.一个文法G,若它的预测分析表M不含多重定义,则该文法是()文法。 22.对于数据空间的存贮分配, FORTRAN采用( )策略, PASCAL采用( )策略。

【北航保研辅导班】北航软件学院推免保研条件保研材料保研流程保研夏令营

【北航保研辅导班】北航软件学院推免保研条件保研材料保研流程保 研夏令营 2018年保研夏令营已陆续拉开帷幕,为了方便考生及时全面的了解985/211等名校保研信息,启道保研小编为大家整理了2018年名校各院系保研汇总信息,以供考生参考。一、北航软件学院保研资格条件(启道北航保研辅导班) 1.热爱祖国,拥护中国共产党的领导,具有高尚的爱国主义情操和集体主义精神,社会主义信念坚定,社会责任感强。 2.具有推荐免试资格的高校优秀应届本科毕业生,本科前三学年综合成绩在学院年级排名前25%。 3.有学术论文发表、获得专利、学科竞赛、科技活动等获奖者综合成绩排名可以适当放宽。 4.研究兴趣浓厚,有较强的专业基础、创新意识和创新能力。 5.诚实守信,品行端正,无任何考试作弊、学术不端以及其他违法违纪处分记录。 6.身体健康状况符合《北京航空航天大学招收学历研究生体检工作标准》的体检要求。 二、北航软件学院保研政策(启道北航保研辅导班) 一、招收项目: 本年度推荐免试研究生接受以下项目的申请: 1、085212专业硕士 2、083500学术型 二、申请材料: 1.《北京航空航天大学接收推荐免试攻读2018年研究生申请表》原件一份(须本人签字)。 2.有效居民身份证的复印件一份(正反面需复印在A4纸张的同一页面上)。 3.政审表纸质版一份,具体填写要求见其说明。 4.“思想政治与道德品格”情况的书面小结一份。 5.对申请有参考价值的本人自述(限500字以内)一份。 6.加盖所在学校教务处公章的本人本科阶段成绩单原件一份。 7.提交加盖所在学院(或者学校)公章的本人排名证明原件一份。

8.若本人发表过学术论文或出版物,提交复印件一份。 9.若本人在学期间,有学科竞赛、科技活动等各种获奖证明,提交复印件一份。 10.近一个月内由二级甲等以上(含二级甲等)医疗机构或北航校医院出具的体格检查表一份,体格检查表上的体检内容不得少于附件样表所列项目,并且注意须随体格检查表附各种检查的化验单。。 三、申请材料审核及复试资格确认 每一位申请推免的学生须提供完整有效的申请材料,材料不完整者取消推免资格。 申请者请到北航研究生招生信息网https://www.doczj.com/doc/8b3155508.html,/查阅相关说明及要求,下载申请表,按照软件学院要求的截止日期将全部申请材料(统一用A4纸)寄(或送)达软件学院的研究生教务办公室。软件学院接收材料的截止时间为2017年9月22日(以收到日期为准,如需快递,建议采用顺风快递)。 申请者需及时登录教育部的“推免服务系统”(https://www.doczj.com/doc/8b3155508.html,/tm),完成注册、填写个人基本信息、上传照片、网上支付、填写志愿等步骤,网报志愿须与纸质材料填写志愿一致。 四、复试形式 复试共分为四个环节,采取差额面试,考生的面试总时间不少于20分钟。各个环节的面试内容如下: 第一环节:思想政治与道德品格(100分) 个人陈述思想政治与道德品格的情况并接受面试提问和答题。 第二环节:英语(100分) 面试采用口语交流形式,考查英语能力。 第三环节:专业基础(150分) 主要考查软件工程、操作系统、编译原理、计算机网络、数据库基本概念的掌握程度。 第四环节:专业实践与综合能力(150分) 主要考查软件工程的专业实践能力和专业综合能力(考生可介绍课程大作业、专业实习与实践、科技创新创意创业实践、毕业设计等)。 第一、二、三、四环节为并行环节,考生总体上按照复试时间及名单的顺序,根据各个环节的面试情况,在助管老师的协调下,进入各个环节的面试; 整个面试过程全程录音、录像。

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

编译 原理 课后题答案 第二章 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. 中间语言,各种常见中间语言形式; 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;

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

第八章 语法制导翻译和中间代码生成 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)

编译原理作业

第四章 7.为什么要引入动态重定位?如何实现? 连续分配方式中,若想把大作业装入,将内存中所有作业移动作业进行移动,使他们全都相连接,但是经过紧凑后的用户程序在内存中内存位发生了变化。为了使程序能继续正常的运行,在每次紧凑后都必须对移动了的程序或数据进行重定位,这不仅是一件相当麻烦的事情,而且还大大地影响到系统的效率。 实现方式:在系统中增设了一个重定位寄存器,用它来存放程序(数据)在内存中的起始地址。程序在真正执行时,真正访问的内存地址是相对地址和重定位寄存器中的地址相加形成的。 18.什么是页面?什么是物理块?页面的大小应如何确定? 页面:分页存储管理将进程的逻辑地址空间分成若干个页,并为各页加以编号;物理块:把内存的物理地址空间分成若干个块,并为各块加以编号; 页面大小应选择适中且页面大小应该是2的幂,通常为1KB-8KB. 19.什么是页表?页表的作用? 页表是分页式存储管理使用的数据结构。一个进程分为多少页,它的页表就有多少行。每一行记录进程的一页和它存放的物理块的页号,块号对应关系 页表用于进行地址变换。 20.为实现分页存储系统管理,需要哪些硬件支持? 页表机制,地址变换机构的硬件支持 21.在分页系统中是如何实现地址变换的? 利用地址变换机构实现从逻辑地址到物理地址的转变换,通过页表实现从页号到物理号的变换,将逻辑地址中的页号转换为内存中的物理块号。 26.分页和分段存储管理有何区别? 页是信息的物理单位,分页是为了实现离散分配方式,以消减内存的外部零头,提高内存利用率。段则是信息的逻辑单位,它含有一组相对完整的信息。页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机械硬件实现的因而在系统中只能有一种大小的的页面而段的长度却不固定决定于用户所编写的程序 通常由编译程序在对原程序进行编译时根据信息的性质来划分分页的作业地址空间是一维的分段作业地址空间则是二维的

编译原理习题答案

《编译原理》习题答案: 第一次: 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. 终结符集

编译原理(清华大学 第2版)课后习题答案

第三章 N=>D=> {0,1,2,3,4,5,6,7,8,9} N=>ND=>NDD L={a |a(0|1|3..|9)n且 n>=1} (0|1|3..|9)n且 n>=1 {ab,} a n b n n>=1 第6题. (1) <表达式> => <项> => <因子> => i (2) <表达式> => <项> => <因子> => (<表达式>) => (<项>) => (<因子>)=>(i) (3) <表达式> => <项> => <项>*<因子> => <因子>*<因子> =i*i (4) <表达式> => <表达式> + <项> => <项>+<项> => <项>*<因子>+<项> => <因子>*<因子>+<项> => <因子>*<因子>+<因子> = i*i+i (5) <表达式> => <表达式>+<项>=><项>+<项> => <因子>+<项>=i+<项> => i+<因子> => i+(<表达式>) => i+(<表达式>+<项>) => i+(<因子>+<因子>) => i+(i+i) (6) <表达式> => <表达式>+<项> => <项>+<项> => <因子>+<项> => i+<项> => i+<项>*<因子> => i+<因子>*<因子> = i+i*i 第7题

第9题 语法树 s s s* s s+a a a 推导: S=>SS*=>SS+S*=>aa+a* 11. 推导:E=>E+T=>E+T*F 语法树: E +T * 短语: T*F E+T*F 直接短语: T*F 句柄: T*F 12.

短语: 直接短语: 句柄: 13.(1)最左推导:S => ABS => aBS =>aSBBS => aBBS => abBS => abbS => abbAa => abbaa 最右推导:S => ABS => ABAa => ABaa => ASBBaa => ASBbaa => ASbbaa => Abbaa => a1b1b2a2a3 (2) 文法:S → ABS S → Aa S →ε A → a B → b (3) 短语:a1 , b1 , b2, a2 , , bb , aa , abbaa, 直接短语: a1 , b1 , b2, a2 , , 句柄:a1 14 (1) S → AB A → aAb | ε B → aBb | ε (2) S → 1S0 S → A A → 0A1 |ε 第四章 1. 1. 构造下列正规式相应的DFA (1)1(0|1)*101 NFA (2) 1(1010*|1(010)*1)*0 NFA

相关主题
相关文档 最新文档