清华大学版编译原理答案

清华大学版编译原理答案
清华大学版编译原理答案

《编译原理》课后习题

第1 章引论

第1 题解释下列术语:

(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。

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

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

(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶

段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符

号表管理等工作。

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

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

第2 题

一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程

序的总体结构图。

答案:一个典型的编译程序通常包含8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。其各部分的主要功能简述如下。

词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。

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

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

的中间语言代码,如三元式或四元式。

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

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

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

各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。可以说整个编译过程就是造表、查表的工作过程。需要指出的是,这里的“表格管理程序”并不意味着它就是一个独立的表格管理模块,而是指编译程序具有的表格管理功能。

错误处理程序:处理和校正源程序中存在的词法、语法和语义错误。当编译程序发现源

程序中的错误时,错误处理程序负责报告出错的位置和错误性质等信息,同时对发现的错误进行适当的校正(修复),目的是使编译程序能够继续向下进行分析和处理。

第3 题何谓翻译程序、编译程序和解释程序?它们三者之间有何种关系?

答案:翻译程序是指将用某种语言编写的程序转换成另一种语言形式的程序的程序,如编译程序和汇编程序等。

编译程序是把用高级语言编写的源程序转换(加工)成与之等价的另一种用低级语言编

写的目标程序的翻译程序。

解释程序是解释、执行高级语言源程序的程序。解释方式一般分为两种:一种方式是,

源程序功能的实现完全由解释程序承担和完成,即每读出源程序的一条语句的第一个单词,则依据这个单词把控制转移到实现这条语句功能的程序部分,该部分负责完成这条语句的功

能的实现,完成后返回到解释程序的总控部分再读人下一条语句继续进行解释、执行,如此反复;另一种方式是,一边翻译一边执行,即每读出源程序的一条语句,解释程序就将其翻译成一段机器指令并执行之,然后再读人下一条语句继续进行解释、执行,如此反复。无论是哪种方式,其加工结果都是源程序的执行结果。目前很多解释程序采取上述两种方式的综合实现方案,即先把源程序翻译成较容易解释执行的某种中间代码程序,然后集中解释执行中间代码程序,最后得到运行结果。

广义上讲,编译程序和解释程序都属于翻译程序,但它们的翻译方式不同,解释程序是

边翻译(解释)边执行,不产生目标代码,输出源程序的运行结果。而编译程序只负责把源程序翻译成目标程序,输出与源程序等价的目标程序,而目标程序的执行任务由操作系统来完成,即只翻译不执行。

第4 题对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、代码生成)报告的。

(1)else 没有匹配的if

(2)数组下标越界

(3)使用的函数没有定义

(4)在数中出现非数字字符

答案:(1)语法分析

(2)语义分析

(3)语法分析

(4)词法分析

第3 章文法和语言

第1 题文法G=({A,B,S},{a,b,c},P,S)其中P 为:

S→Ac|aB

A→ab

B→bc

写出L(G[S])的全部元素。

答案:L(G[S])={abc}

第2 题文法G[N]为:

N→D|ND

D→0|1|2|3|4|5|6|7|8|9

G[N]的语言是什么?

答案:G[N]的语言是V+。V={0,1,2,3,4,5,6,7,8,9}

N=>ND=>NDD.... =>NDDDD...D=>D......D

第3题为只包含数字、加号和减号的表达式,例如9-2+5,3-1,7等构造一个文法。

答案:G[S]:

S->S+D|S-D|D

D->0|1|2|3|4|5|6|7|8|9

第4 题已知文法G[Z]:Z→aZb|ab 写出L(G[Z])的全部元素。

答案:Z=>aZb=>aaZbb=>aaa..Z...bbb=> aaa..ab...bbb

L(G[Z])={anbn|n>=1}

第5 题写一文法,使其语言是偶正整数的集合。要求:(1) 允许0 打头;(2)不允许0 打头。

答案:(1)允许0 开头的偶正整数集合的文法

E→NT|D

T→NT|D

N→D|1|3|5|7|9

D→0|2|4|6|8

(2)不允许0 开头的偶正整数集合的文法

E→NT|D

T→FT|G

N→D|1|3|5|7|9

D→2|4|6|8

F→N|0

G→D|0

第6 题已知文法G:

<表达式>::=<项>|<表达式>+<项>

<项>::=<因子>|<项>*<因子>

<因子>::=(<表达式>)|i

试给出下述表达式的推导及语法树。

(1)i(2)(i)(3)i*i (4)i*i +i (5)i+(i+i)(6)i+i*i

第7 题证明下述文法G[〈表达式〉]是二义的。

〈表达式〉∷=a|(〈表达式〉)|〈表达式〉〈运算符〉〈表达式〉

〈运算符〉∷=+|-|*|/

答案:可为句子a+a*a 构造两个不同的最右推导:

最右推导1 〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉

=>〈表达式〉〈运算符〉a

=>〈表达式〉* a

=>〈表达式〉〈运算符〉〈表达式〉* a

=>〈表达式〉〈运算符〉a * a

=>〈表达式〉+ a * a

=>a + a * a

最右推导2 〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉

=>〈表达式〉〈运算符〉〈表达式〉〈运算符〉〈表达式〉

=>〈表达式〉〈运算符〉〈表达式〉〈运算符〉a

=>〈表达式〉〈运算符〉〈表达式〉* a

=>〈表达式〉〈运算符〉a * a

=>〈表达式〉+ a * a

=>a + a * a

第8 题文法G[S]为:S→Ac|aB A→ab B→bc 该文法是否为二义的?为什么?

答案:对于串abc(1)S=>Ac=>abc (2)S=>aB=>abc

即存在两不同的最右推导。所以,该文法是二义的。

或者:对输入字符串abc,能构造两棵不同的语法树,所以它是二义的。

第9 题

考虑下面上下文无关文法:S→SS*|SS+|a

(1)表明通过此文法如何生成串aa+a*,并为该串构造语法树。(2)G[S]的语言是什么?

答案:(1)此文法生成串aa+a*的最右推导如下

S=>SS*=>SS*=>Sa*=>SS+a*=>Sa+a*=>aa+a*

(2)该文法生成的语言是:*和+的后缀表达式,即逆波兰式。

第10 题文法S→S(S)S|ε(1) 生成的语言是什么?(2) 该文法是二义的吗?说明理由。答案:(1)嵌套的括号

(2)是二义的,因为对于()()可以构造两棵不同的语法树。

第11 题令文法G[E]为:E→T|E+T|E-T T→F|T*F|T/F F→(E)|i

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

答案:此句型对应语法树如右,故为此文法一个句型。

或者:因为存在推导序列: E=>E+T=>E+T*F,所以E+T*F 句型

此句型相对于E 的短语有:E+T*F;相对于T 的短语有T*F

直接短语为:T*F 句柄为:T*F

第13 题一个上下文无关文法生成句子abbaa 的推导树如下:

(1)给出串abbaa 最左推导、最右推导。(2)该文法的产生式集合P 可能有哪些元素?(3)找出该句子的所有短语、直接短语、句柄。

答案:(1)串abbaa 最左推导:

S=>ABS=>aBS=>aSBBS=>aBBS=>abBS=>abbS=>abbAa=>abbaa

最右推导:S=>ABS=>ABAa=>ABaa=>ASBBaa=>ASBbaa=>ASbbaa=>Abbaa=>abbaa (2)产生式有:S→ABS |Aa|εA→a B→SBB|b

可能元素有:εaa ab abbaa aaabbaa ……

(3)该句子的短语有:

a 是相对A 的短语

ε是相对S 的短语

b 是相对B 的短语

εbb 是相对B 的短语

aa 是相对S 的短语

aεbbaa 是相对S 的短语

直接短语有:a ε b

句柄是:a

第14 题给出生成下述语言的上下文无关文法:

(1){ anbnambm| n,m>=0}

(2){ 1n0m 1m0n| n,m>=0}

(3){WaWr|W 属于{0|a}*,Wr 表示W的逆}

答案:

(1)S→AA

A→aAb|ε

(2)S→1S0|A

A→0A1|ε

(3)S→0S0|1S1|ε

第16 题给出生成下述语言的三型文法:

(1){an|n >=0 }

(2) { anbm|n,m>=1 }

(3){anbmck|n,m,k>=0 }

答案:(1) S→aS|ε

(2)S→aA

A→aA|B

B→bB|b

(3)A→aA|B

B→bB|C

C→cC|ε

第18 题解释下列术语和概念:

答案:(1)字母表:是一个非空有穷集合。

(2)串:符号的有穷序列。字:字母表中的元素。

句子:如果Z-+ x , x ∈V *T 则称x 是文法G 的一个句子。

(3)语言:它是由句子组成的集合,是由一组记号所构成的集合。程序设计的语言就是所有该语言的程序的全体。语言可以看成在一个基本符号集上定义的,按一定规则构成的一切基本符号串组成的集合。

语法:表示构成语言句子的各个记号之间的组合规律。程序的结构或形式。

语义:表示按照各种表示方法所表示的各个记号的特定含义。语言所代表的含义。

第4 章词法分析

第5 章自顶向下语法分析方法

第1 题对文法G[S]

S→a|∧|(T)

T→T,S|S

(1) 给出(a,(a,a))和(((a,a),∧,(a)),a)的最左推导。

(2) 对文法G,进行改写,然后对每个非终结符写出不带回溯的递归子程序。

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

(4) 给出输入串(a,a)#的分析过程,并说明该串是否为G 的句子。

答案:(1) 对(a,(a,a)的最左推导为:

S=>(t)

=> (T,S)

=> (S,S)

=> (a,S)

=> (a,(T))

=> (a,(T,S))

=> (a,(S,S))

=> (a,(a,S))

=> (a,(a,a))

对(((a,a),∧,(a)),a) 的最左推导为:

S => (T)

=> (T,S)

=> (S,S)

=> ((T),S)

=> ((T,S),S)

=> ((T,S,S),S)

=> ((S,S,S),S)

=> (((T),S,S),S)

=> (((T,S),S,S),S)

=> (((S,S),S,S),S)

=> (((a,S),S,S),S)

=> (((a,a),S,S),S)

=> (((a,a),∧,S),S)

=> (((a,a),∧,(T)),S)

=> (((a,a),∧,(S)),S)

=> (((a,a),∧,(a)),S)

=> (((a,a),∧,(a)),a)

(2) 改写文法为:

0) S→a

1) S→∧

2) S→( T )

3) T→S N

4) N→, S N

5) N→ε

非终结符FIRST 集FOLLOW 集

S {a,∧,(} {#,,,)}

T {a,∧,(} {)}....

N {,,ε} {)}....

对左部为N 的产生式可知:

FIRST (→, S N)={,}

FIRST (→ε)={ε}

FOLLOW (N)={)}

由于SELECT(N →, S N)∩SELECT(N →ε) ={,}∩{ )}= 所以文法是LL(1)的。

预测分析表(Predicting Analysis Table)

也可由预测分析表中无多重入口判定文法是LL(1)的。(3) 对输入串(a,a)#的分析过程为:

可见输入串(a,a)#是文法的句子。

第3 题

已知文法G[S]:

S→MH|a

H→LSo|ε

K→dML|ε

L→eHf

M→K|bLM

判断G 是否是LL(1)文法,如果是,构造LL(1)分析表。

答案:

文法展开为:

0)S→M H

1)S→a

2)H→L S o

3)H→ε

4)K→d M L

5)K→ε

6)L→e H f

7)M→K

8)M→b L M

非终结符FIRST 集FOLLOW 集

S {a,d,b,ε,e} {#,o}

M {d,ε,b} {e,#,o}

H {ε,e} {#,f,o}

L {e} {a,d,b,e,o,#}

K {d,ε} {e,#,o}

对相同左部的产生式可知:

SELECT(S→M H)∩SELECT(S→a) ={ d,b ,e,#,o }∩{ a }=

SELECT(H→L S o)∩SELECT(H→ε) ={ e }∩{ #,f,o }=

SELECT(K→d M L)∩SELECT(K→ε) ={ d }∩{ e,#,o }=

SELECT(M→K)∩SELECT(M→b L M) ={ d,e,#,o }∩{ b }=

所以文法是LL(1)的。

预测分析表:

由预测分析表中无多重入口也可判定文法是LL(1)的。

第7 题

对于一个文法若消除了左递归,提取了左公共因子后是否一定为LL(1)文法?试对下面文法进行改写,并对改写后的文法进行判断。

(1)A→baB|ε

B→Abb|a

(2) A→aABe|a

B→Bb|d

(3) S→Aa|b

A→SB

B→ab

答案:(1)先改写文法为:

0) A→baB

1) A→ε

2) B→baBbb

3) B→bb

4) B→a

再改写文法为:

0) A→baB

1) A→ε

2) B→bN

3) B→a

4) N→aBbb

5) N→b

预测分析表:

由预测分析表中无多重入口判定文法是LL(1)的。(2)文法:

A→aABe|a

B→Bb|d

提取左公共因子和消除左递归后文法变为:

0) A→a N

1) N→A B e

2) N→ε

3) B→d N1

4) N1→b N1

5) N1→ε

非终结符FIRST 集FOLLOW 集

A {a} {#,d}

B {d} {e}

N {a,ε} {#,d}

N1 {b,ε} {e}

对相同左部的产生式可知:

SELECT(N→A B e)∩SELECT(N→ε) ={ a }∩{#,d }=

SELECT(N1→b N1)∩SELECT(N1→ε) ={ b }∩{ e }=

所以文法是LL(1)的。

预测分析表(Predicting Analysis Table)

也可由预测分析表中无多重入口判定文法是LL(1)的。

(3)文法:

S→Aa|b

A→SB

B→ab

第1 种改写:用A 的产生式右部代替S 的产生式右部的A 得:

S→SBa|b

B→ab

消除左递归后文法变为:

0) S→b N

1) N→B a N

2) N→ε

3) B→a b

非终结符FIRST 集FOLLOW 集

S {b} {#}

B {a} {a}

N {ε,a} {#}

对相同左部的产生式可知:SELECT(N→B a N)∩SELECT(N→ε) ={ a }∩{# }= 所以文法是LL(1)的。

预测分析表(Predicting Analysis Table)

也可由预测分析表中无多重入口判定文法是LL(1)的。

第2 种改写:

用S 的产生式右部代替A 的产生式右部的S 得:

S→Aa|b

A→AaB|bB

B→ab

消除左递归后文法变为:

0) S→A a

1) S→b

2) A→b B N

3) N→a B N

4) N→ε

非终结符FIRST 集FOLLOW 集

S {b} {#}

A {b} {a}

B {a} {a}

N {a,ε} {a}

对相同左部的产生式可知:

SELECT(S→A a)∩SELECT(S→b) ={ b }∩{ b }={ b }≠

SELECT(N→a B N)∩SELECT(N→ε) ={ a }∩{ a }={ a }≠

所以文法不是LL(1)的。

预测分析表:

也可由预测分析表中含有多重入口判定文法不是LL(1)的。

第6 章自底向上优先分析

第1 题已知文法G[S]为:S→a|∧|(T)

T→T,S|S

(1) 计算G[S]的FIRSTVT 和LASTVT。

(2) 构造G[S]的算符优先关系表并说明G[S]是否为算符优先文法。

(3) 计算G[S]的优先函数。

(4) 给出输入串(a,a)#和(a,(a,a))#的算符优先分析过程。

答案:

文法展开为:

S→a

S→∧

S→(T)

T→T,S

T→S

(1) FIRSTVT - LASTVT 表:

(2) 算符优先关系表:

(3)对应的算符优先函数为:

(4)对输入串(a,a)#的算符优先分析过程为

Success!

对输入串(a,(a,a))# 的算符优先分析过程为:

Success!

第2 题已知文法G[S]为:S→a|∧|(T)

T→T,S|S

(1) 给出(a,(a,a))和(a,a)的最右推导,和规范归约过程。

(2) 将(1)和题1 中的(4)进行比较给出算符优先归约和规范归约的区别。答案:(1)(a,a)的最右推导过程为:

=> (T,S)

=> (T,a)

=> (S,a)

=> (a,a)

=>(a,(a,a))的最右推导过程为:

S=> (T)

=> (T,S)

=> (T,(T))

=> (T,(T,S))

=> (T,(T,a))

=> (T,(S,a))

=> (T,(a,a))

=> (S,(a,a))

=> (a,(a,a))

(a,(a,a))的规范归约过程:

(a,a)的规范归约过程:

(2)算符优先文法在归约过程中只考虑终结符之间的优先关系从而确定可归约串,而与

非终结符无关,只需知道把当前可归约串归约为某一个非终结符,不必知道该非终结符的名字是什么,因此去掉了单非终结符的归约。

规范归约的可归约串是句柄,并且必须准确写出可归约串归约为哪个非终结符。

第3题:有文法G[S]:

S->V

V->T|ViT

T->F|T+F

F->)V*|(

(1) 给出(+(i(的规范推导。

(2) 指出句型F+Fi(的短语,句柄,素短语。

(3) G[S]是否为OPG?若是,给出(1)中句子的分析过程。

答案:

(1)S=>V=>ViT=>ViF=>Vi(=>T i(=>T+F i(=>T+( i(=>F+( i(=>(+( i(

(2)句型F+Fi(的语法树:

短语:F,F+F,(,F+Fi( 句柄:F 素短语:(

(3)FIRSTVT 和LASTVT

算符优先关系

因为该文法是OP,同时任意两个终结符的优先关系唯一,所以该文法为OPG。

(+(i(的分析过程

第4题文法G[S]为:

S→S;G|G

G→G(T)|H

H→a|(S)

T→T+S|S

(1)构造G[S]的算符优先关系表,并判断G[S]是否为算符优先文法。

(2)给出句型a(T+S);H;(S)的短语、句柄、素短语和最左素短语。

(3)给出a;(a+a)和(a+a)的分析过程,说明它们是否为G[S]的句子。

(4)给出(3)中输入串的最右推导,分别说明两输入串是否为G[S]的句子。

(5)由(3)和(4)说明了算符优先分析的哪些缺点。

(6)算符优先分析过程和规范归约过程都是最右推导的逆过程吗?

答案:(1)构造文法G[S]的算符优先关系矩阵:

在上表中可看出终结符之间的优先关系是唯一的,或称G[S]的算符优先关系矩阵不含多重入口,因此,G[S]是一个算符优先文法。

(2)

(3)对输入串(a+a)#的分析过程如下:

说明是它的句子。

(4)试用规范推导:

S? G?H?(S)由此往下S 不可能推导出a+a,所以(a+a)不是G[S]的句子。

(5)结果说明:由于算符优先分析法去掉了单非终结符之间的归约,尽管在分析过程中,当决定是否为句柄时采取一些检查措施,但仍难完全避免把错误的句子得到正确的归约。(6)算符优先分析过程不是最右推导的逆过程。规范归约过程是最右推导的逆过程。

第7 章LR 分析

第1 题已知文法A→aAd|aAb|ε

判断该文法是否是SLR(1)文法,若是构造相应分析表,并对输入串ab#给出分析过程。

答案:文法:A→aAd|aAb|ε

拓广文法为G′,增加产生式S′→A

若产生式排序为:

0 S' →A

1 A →aAd

2 A →aAb

3 A →ε

由产生式知:

First (S' ) = {ε,a}

First (A ) = {ε,a}

Follow(S' ) = {#}

Follow(A ) = {d,b,#}

G′的LR(0)项目集族及识别活前缀的DFA 如下图所示:

在I0 中:A →.aAd 和A →.aAb 为移进项目,A →.为归约项目,存在移进-归约冲突,因

此所给文法不是LR(0)文法。

在I0、I2 中:Follow(A) ∩{a}= {d,b,#} ∩{a}=

所以在I0、I2 中的移进-归约冲突可以由Follow 集解决,所以G 是SLR(1)文法。

构造的SLR(1)分析表如下:题目1 的SLR(1)分析表

题目1 对输入串ab#的分析过程

分析成功,说明输入串ab 是文法的句子。

第2 题若有定义二进制数的文法如下:

S→L?L|L

L→LB|B

B→0|1

(1) 试为该文法构造LR 分析表,并说明属哪类LR 分析表。

(2) 给出输入串101.110 的分析过程。

答案:文法:

S→L.L|L

L→LB|B

B→0|1

拓广文法为G′,增加产生式S′→S

若产生式排序为:

0 S' →S

1 S →L.L

2 S →L

3 L →LB

4 L →B

5 B →0

6 B →1

由产生式知:

First (S' ) = {0,1}

First (S ) = {0,1}

First (L ) = {0,1}

First (B ) = {0,1}

Follow(S' ) = {#}

Follow(S ) = {#}

Follow(L ) = {.,0,1,#}

Follow(B ) = {.,0,1,#}

G′的LR(0)项目集族及识别活前缀的DFA 如下图所示:

在I2 中:B →.0 和B →.1 为移进项目,S →L.为归约项目,存在移进-归约冲突,因此所给文法不是LR(0)文法。

在I2、I8 中:Follow(s) ∩{0,1}= { #} ∩{0,1}=

所以在I2 、I8 中的移进-归约冲突可以由Follow 集解决,所以G 是SLR(1)文法。

构造的SLR(1)分析表如下:题目2 的SLR(1)分析表

题目2 对输入串101.110#的分析过程

分析成功,说明输入串101.110 是题目2 文法的句子。

题目3考虑文法S-> A S | b

A -> S A | a

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

(2)按(1)列出的项目构造识别这个文法活前缀的NFA,把这个NFA 确定化为DFA,说明

这个DFA 的所有状态全体构成这个文法的LR(0)规范族

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

(4)这个文法是LALR 或LR(1)的吗?

答:

(1)令拓广文法G’为

(0) S’ -> S

(1)S-> A S

(2)S-> b

(3)A -> S A

(4)A -> a

其LR(0)项目:

(2) 识别这个文法活前缀的NFA 如上图所示:

确定化为DFA 如下图所示:

(3)因为I5 中:FOLLOW(A)∩{a,b}≠Ф

I7 中:FOLLOW(S)∩{a,b}≠Ф

所以,该文法不是SLR(1)文法。

(4)LR(1)项目集族为:

I0 :

S’->?S, #

S ->?AS, #

S ->?b, #

S ->?SA, a / b

A ->?a, a / b

I1 : S’ -> S?,#

A -> S?A, a / b

A ->?a, a / b

A -> ?SA, a / b

S ->?AS, a / b

S ->?b, a / b

I2 : S ->A?S, #

S ->?b, #

S ->?AS, #

A A ->?a, a / b

I3 : S -> b?, #

I4 : A -> a?, a / b I5 : A -> SA?, a / b S -> A?S, a / b

S -> ?AS, a / b

S ->?b, a/ b

A ->?SA, a / b

A ->?a, a / b

I6 : A -> S?A,a/b A ->?SA, a / b

A ->?a, a / b

S->?AS, a / b

S ->?b, a / b

I7: S -> b?, a / b

I8 : S -> AS?, #

A -> S?A, a / b

A ->?SA, a / b

A ->?a, a / b

S ->?AS, a / b

S ->?b, a / b

I9 :

S ->A?S, #

S ->?AS, #

S ->?b, #

S ->?SA, a / b

A ->?a, a / b

I10 :

S ->AS?, a/b

A ->S?A, a/b

A ->?S A, a/b

A ->?a, a / b

S ->?b, a/b

S ->?AS, a / b

I11 :

S ->A?S, a/b

S ->?b, a/b

S ->?AS, a / b

A ->?S A, a/b

A ->?a, a / b

I12 :

S ->SA?, a/b

S ->A?S, a/b

S ->?AS, a / b

A ->?S A, a/b

A ->?a, a / b

因为I5 状态集中存在“归约――移进”冲突,所以不是LR(1)文法,也不是LALR

文法。

第6 题文法G=({U,T,S},{a,b,c,d,e},P,S)

其中P 为:

S→UTa|Tb

T→S|Sc|d

U→US|e

(1) 判断G 是LR(0),SLR(1),LALR(1)还是LR(1),说明理由。

(2) 构造相应的分析表。

答案:文法:

S→UTa|Tb

T→S|Sc|d

U→US|e

拓广文法为G',增加产生式S'→S

若产生式排序为:

0 S' →S

1 S →UTa

2 S →Tb

3 T →S

4 T →Sc

5 T →d

6 U →US

7 U →e

由产生式知:

First (S' ) = {d,e}

First (S ) = {d,e}

First (U ) = {e}

First (T ) = {d,e}

Follow(S' ) = {#}

Follow(S ) = {a,b,c,d,e,#}

Follow(U ) = {d,e}

Follow(T ) = {a,b}

G′的LR(0)项目集族及识别活前缀的DFA 如下图所示:

在I1 中:

S' →S.为接受项目,T →S. 为归约项目,T →S.c 为移进项目,存在接受-归约和移进-归约冲突,因此所给文法不是LR(0)文法。

Follow(S') ∩Follow(T)= { #} ∩{a ,b}=

Follow(T) ∩{ c}= { a ,b} ∩{c}=

在I8 中:Follow(U) ∩Follow(T) ∩{ c}={d,e}∩{ a ,b} ∩{c}=

所以在I1 中的接受-归约和移进-归约冲突与I8 中的移进-归约和归约-归约冲突可以由Follow 集解决,所以G 是SLR(1)文法。

构造的SLR(1)分析表如下:

第8 题证明文法:

S→A$

A→BaBb|DbDa

B→ε

D→ε是LR(1)但不是SLR(1)。(其中'$'相当于'#')

答案:文法:

A→BaBb|DbDa

B→ε

D→ε

拓广文法为G′,增加产生式S′→A

若产生式排序为:

0 S'→A

1 A →BaBb

2 A →DbDa

3 B →ε

4 D →ε

由产生式知:

First (S' ) = {a,b}

First (A ) = {a,b}

First (B ) = {ε}

First (D ) = {ε}

Follow(S' ) = {#}

Follow(A ) = {#}

Follow(B ) = {a,b}

Follow(D ) = {a,b}

G′的LR(1)项目集族及识别活前缀的DFA 如下图所示:

在I0 中:B →.,a 和T →.,b 为归约项目,但它们的搜索符不同,若当前输入符为a 时用产生式B →ε归约,为b 时用产生式D →ε归约,所以该文法是LR(1)文法。

若不看搜索符,在I0 中项目B →.和T →.为归约-归约冲突,而

Follow(B ) ∩Follow(D ) = {a,b} ∩{a,b}≠,冲突不能用Follow 集解决,所以该文法

不是SLR(1)文法。

构造的LR(1)分析表如下:

题目4 的LR(1)分析表

第16 题给定文法:S→do S or S|do S|S;S|act

(1) 构造识别该文法活前缀的DFA。

(2) 该文法是LR(0)吗?是SLR(1)吗?说明理由。

(3) 若对一些终结符的优先级以及算符的结合规则规定如下:

a) or 优先性大于do;

b) ;服从左结合;

c) ;优先性大于do ;

d) ;优先性大于or ;

请构造该文法的LR 分析表,并说明LR(0)项目集中是否存在冲突和冲突如何解决的。答案:首先化简文法,用d 代替do;用o 代替or;用a 代替act;文法可写成:

S→dSoS|dS|S;S|a

拓广文法为G',增加产生式S′→S

若产生式排序为:

0 S' →S

1 S →dSoS

2 S →dS

3 S →S;S

4 S →a

由产生式知:

First (S' ) = {d,a}

First (S ) = {d,a}

Follow(S' ) = {#}

Follow(S ) = {o,;,#}

? 识别该文法活前缀的DFA 如下图。

(2) 该文法不是LR(0)也不是SLR(1)因为:

在I5、I6、和I8 中存在移进-归约冲突,因此所给文法不是LR(0)文法。

又由于Follow(S ) = {o, ; ,#}

在I6、和I8 中:Follow(S ) ∩{ ; }={o, ; ,#} ∩{ ; }={;}≠

在I5 中:Follow(S ) ∩{ ; , o }={o , ; ,#} ∩{ ; , o }={; , o }≠

所以该文法也不是SLR(1) 文法。

此外很容易证明所给文法是二义性的,

S`→S→dSoS→ddSoS

S`→S→dS→ddSoS

因此该文法不可能满足LR 文法。

(3) 若对一些终结符的优先级以及算符的结合规则规定如下:

a) or 优先性大于do;

b) ;服从左结合;

c) ;优先性大于do ;

d) ;优先性大于or ;

则:

在I5 中:“or 和;优先性都大于do”,所以遇输入符o 和; 移进;遇#号归约。

在I6 中:“; 号服从左结合”,所以遇输入符属于Follow(S )的都应归约。

在I8 中:“; 号优先性大于do ”,所以遇输入符为;号移进;遇o 和#号归约。

此外,在I1 中:接受和移进可以不看成冲突,因为接受只有遇#号。

由以上分析,所有存在的移进-归约冲突可用规定的终结符优先级以及算符的结合规则解决,所构造的LR 分析表如下:

编译原理复习题--有答案版

1、给出下面语言的相应文法。L1={a n b n c i|n≥1,i≥0} 答案: S→ AB|B A→ a|aA B→ bBc|bc 2.给出下面语言的相应文法 L1={a n b n c m d m| m,n≥1,n为奇数,m为偶数}。 答案:文法G(S):S→AC A→aaAbb/ab C→ccCcc/cc 3、构造一个DFA,它接受={a,b}上所有包含ab的字符串。 (要求:先将正规式转化为NFA,再将NFA确定化,最小化) (一)相应的正规式为(a|b)*ab(a|b)* (二)①与此正规式对应的NFA为 答案;在自己写的纸上 4、对下面的文法G: E→TE’ E’→+E|ε T→FT’ T’→T|ε F→PF’ F’→*F’|ε P→(E)|a|b|∧(1)证明这个文法是LL(1)的。 考虑下列产生式: E’->E|ε T’->T|ε F’->*F’ |ε P->(E) |∧a|b FIRST(+E)∩FIRST(ε)={+}∩{ε}=φ FIRST(+E)∩FOLLOW(E')={+}∩{#,)}=φ FIRST(T)∩FIRST(ε)={(,a,b,^}∩{ε}=φ

FIRST(T)∩FOLLOW(T')={(,a,b,^}∩{+,),#}=φ FIRST(*F')∩FIRST(ε)={*}∩{ε}=φ FIRST(*F')∩FOLLOW(F')={*}∩{(,a,b,^,+,),#}=φ FIRST((E))∩FIRST(a) ∩FIRST(b) ∩FIRST(^)=φ 所以,该文法式LL(1)文法. 计算这个文法的每个非终结符的FIRST和FOLLOW。(8分) 答案: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,^,+,),#} (3)构造它的预测分析表。(6分) 答案;在手机上 写出表达式a+b*(c-d)对应的逆波兰式和三元式序列。 答案:逆波兰式:(abcd-*+) 三元式序列: OP ARG1 ARG2 (1) - c d (2) * b (1) (3) + a (2)

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

《编译原理》课后习题答案第一章 第 4 题 对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、代码生成)报告的。 (1) else 没有匹配的if (2)数组下标越界 (3)使用的函数没有定义 (4)在数中出现非数字字符 答案: (1)语法分析 (2)语义分析 (3)语法分析 (4)词法分析 《编译原理》课后习题答案第三章 第1 题 文法G=({A,B,S},{a,b,c},P,S)其中P 为: S→Ac|aB A→ab B→bc 写出L(G[S])的全部元素。 答案: L(G[S])={abc} 第2 题 文法G[N]为: N→D|ND D→0|1|2|3|4|5|6|7|8|9 G[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|D D->0|1|2|3|4|5|6|7|8|9 第4 题 已知文法G[Z]: Z→aZb|ab 写出L(G[Z])的全部元素。 答案: Z=>aZb=>aaZbb=>aaa..Z...bbb=> aaa..ab...bbb L(G[Z])={anbn|n>=1}

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

王汝传编译原理习题答案

《编译原理》习题答案: 第一次: 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 。第二次作业: P38 1、设T1={11,010},T2={0,01,1001},计算:T2T1,T1*,T2+。 T2T1={011,0010,0111,01010,100111,1001010} T1*={ε,11,010,1111,11010,01011,010010……} T2+={0,01,1001,00,001,01001,010,0101……}

清华大学版编译原理答案

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

清华大学数字电路汇总题库

清华大学数字电路题库 一、填空题 : (每空1分,共10分) 1. (30.25) 10 = ( ) 2 = ( ) 16 。 2 . 逻辑函数L = + A+ B+ C +D = 。 3 . 三态门输出的三种状态分别为:、和。 4 . 主从型JK触发器的特性方程= 。 5 . 用4个触发器可以存储位二进制数。 6 . 存储容量为4K×8位的RAM存储器,其地址线为条、数据线为条。 二、选择题: (选择一个正确的答案填入括号内,每题3分,共30分 ) 1.设下图中所有触发器的初始状态皆为0,找出图中触发器在时钟信号作用下,输出电压波形恒为0的是:()图。 2.下列几种TTL电路中,输出端可实现线与功能的电路是()。 A、或非门 B、与非门 C、异或门 D、OC门 3.对CMOS与非门电路,其多余输入端正确的处理方法是()。 A、通过大电阻接地(>1.5KΩ) B、悬空 C、通过小电阻接地(<1KΩ)

B、 D、通过电阻接V CC 4.图2所示电路为由555定时器构成的()。 A、施密特触发器 B、多谐振荡器 C、单稳态触发器 D、T触发器 5.请判断以下哪个电路不是时序逻辑电路()。 A、计数器 B、寄存器 C、译码器 D、触发器 6.下列几种A/D转换器中,转换速度最快的是()。 A、并行A/D转换器 B、计数型A/D转换器 C、逐次渐进型A/D转换器 B、 D、双积分A/D转换器 7.某电路的输入波形 u I 和输出波形 u O 如下图所示,则该电路为()。 A、施密特触发器 B、反相器 C、单稳态触发器 D、JK触发器 8.要将方波脉冲的周期扩展10倍,可采用()。 A、10级施密特触发器 B、10位二进制计数器 C、十进制计数器 B、D、10位D/A转换器 9、已知逻辑函数与其相等的函数为()。 A、 B、 C、 D、 10、一个数据选择器的地址输入端有3个时,最多可以有()个数据信号输出。 A、4 B、6 C、8 D、16 三、逻辑函数化简(每题5分,共10分) 1、用代数法化简为最简与或式 Y= A +

清华大学电路原理第三次仿真实验报

清华大学电路原理第三次仿真实验报

————————————————————————————————作者:————————————————————————————————日期:

[文档标题] 班级:电13 姓名:苗键强 学号:2011010645 日期:2013年1月11日

实验名称: 一、利用运算放大器的正反馈设计占空比可调的脉冲序列发生器; 二、利用运算放大器构成的脉冲序列发生器和积分器构成三角波发生器。 实验任务: 一、设计占空比可调的脉冲序列发生器 要求: (1)给出电路原理图,分析占空比可调的原因。 (2)给出仿真电路图。 (3)给出示波器 Expand 方式下整个示波器界面,分别给出占空比为 20%和70%时的脉冲序列波形和对应的电容电压波形。 二、利用运算放大器构成的脉冲序列发生器和积分器构成三角波发生器 要求: (1)给出电路原理图,分析三角波产生的原因。 (2)给出仿真电路图。 (3)给出示波器 Expand 方式下整个示波器界面,要求同时显示脉冲序列和三角波的波形。 理论分析及仿真电路: 一、设计占空比可调的脉冲序列发生器 通过Multisim仿真,设计电路图如下: 在此电路图中,通过计算可知,脉冲序列周期为:

T=2 U 滞 U 输出 CR5up+2 U 滞 U 输出 CR5down=2 U 滞 U 输出 CR5(1) 因而,占空比为: η=R5up R5 (2) 得到示波器示数如下: 当R5up R5 =0.2时,得到示波器示数如下: 其占空比为 η=46.154 223.932 =20.6% 当R5up R5 =0.7时,得到示波器示数如下:

(精选)编译原理期末考试题目及答案

一、填空题(每空2分,共20分) 1.编译程序首先要识别出源程序中每个单词,然后再分析每个句子并翻译其意义。 2.编译器常用的语法分析方法有自底向上和自顶向下两种。 3.通常把编译过程分为分析前端与综合后端两大阶段。词法、语法和语义分析是对源程序的分析,中间代码生成、代码优化与目标代码的生成则是对源程序的综合。 4.程序设计语言的发展带来了日渐多变的运行时存储管理方案,主要分为两大类,即静态存储分配方案和动态存储分配方案。 5.对编译程序而言,输入数据是源程序,输出结果是目标程序。 1.计算机执行用高级语言编写的程序主要有两种途径:解释和编译。 2.扫描器是词法分析器,它接受输入的源程序,对源程序进行词法分析并识别出一个个单词符号,其输出结果是单词符号,供语法分析器使用。 3.自下而上分析法采用移进、归约、错误处理、接受等四种操作。 4.一个LL(1)分析程序需要用到一张分析表和符号栈。 5.后缀式abc-/所代表的表达式是a/(b-c)。 二、单项选择题(每小题2分,共20分) 1.词法分析器的输出结果是__C。 A.单词的种别编码B.单词在符号表中的位置 C.单词的种别编码和自身值D.单词自身值 2.正规式 M 1 和 M 2 等价是指__C_。 A. M1和M2的状态数相等B. M1和M2的有向边条数相等 C. M1和M2所识别的语言集相等 D. M1和M2状态数和有向边条数相等 3.文法G:S→xSx|y所识别的语言是_C____。 A. xyx B. (xyx)* C.xnyxn(n≥0) D. x*yx* 4.如果文法G是无二义的,则它的任何句子α_A____。 A.最左推导和最右推导对应的语法树必定相同B.最左推导和最右推导对应的语法树可能不同 C.最左推导和最右推导必定相同D.可能存在两个不同的最左推导,但它们对应的语法树相同5.构造编译程序应掌握____D__。 A.源程序B.目标语言 C.编译方法 D.以上三项都是 6.四元式之间的联系是通过__B___实现的。 A.指示器B.临时变量C.符号表 D.程序变量 7.表达式(┐A∨B)∧(C∨D)的逆波兰表示为__B___。 A.┐AB∨∧CD∨B.A┐B∨CD∨∧C. AB∨┐CD∨∧ D.A┐B∨∧CD∨8. 优化可生成__D___的目标代码。 A.运行时间较短B.占用存储空间较小 C.运行时间短但占用内存空间大 D.运行时间短且占用存储空间小 9.下列___C___优化方法不是针对循环优化进行的。 A. 强度削弱 B.删除归纳变量C.删除多余运算 D.代码外提 10.编译程序使用_B_区别标识符的作用域。 A. 说明标识符的过程或函数名B.说明标识符的过程或函数的静态层次 C.说明标识符的过程或函数的动态层次 D. 标识符的行号 三、判断题(对的打√,错的打×,每小题1分,共10分) 2.一个有限状态自动机中,有且仅有一个唯一的终态。x

最新编译原理(清华大学 第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

清华考研 电路原理课件 第2章 简单电阻电路的分析方法

清华大学电路原理电子课件 江辑光版 参考教材: 《电路原理》(第2版)清华大学出版社,2007年3月江辑光刘秀成《电路原理》清华大学出版社,2007年3月于歆杰朱桂萍陆文娟《电路》(第5版)高等教育出版社,2006年5月邱关源罗先觉

简单电阻电路的分析方法简单电阻电路的分析方法 第2章 简单电阻电路的分析方法 2.1 串联电阻电路 2.1 串联电阻电路 2. 4 理想电源的串联和并联 2. 4 理想电源的串联和并联 2.5 电压源与电流源的等效转换 2.5 电压源与电流源的等效转换 2. 3 星形联接与三角形联接的电阻的等效变换 2. 3 星形联接与三角形联接的电阻的等效变换 2.6 两个电阻电路的例子 2.6 两个电阻电路的例子 本章重点 本章重点 2.2 并联电阻电路 2.2 并联电阻电路

? 本章本章重点重点重点 ? 电阻的串联、并联和串并联 返回目录

2.1 串联电阻电路 (Series Connection)

R eq =( R 1+ R 2…+R n ) =∑ R k R eq =( R 1+ R 2 + +……+R n ) =∑ R k u R R u k k eq =等效电阻等于串联的各电阻之和

例 两个电阻分压(voltage division ), 如下图所示 例 两个电阻分压(voltage division ), 如下图所示 u R R R u 2 11 1+= u R R R u 2 12 2+?=i 2 , p 2 = R 2i 2 ,? : p n = R 1 : R 2 : ?= (R 1+ R 2+ ? +R + R i 2 + ? + R i 2 返回目录

2013年清华大学电路原理考研真题

2013年清华大学电路原理考研真题 1、(1)理想变压器+并联谐振:理想变压器的副边借有并联的电感与电容,告诉了电感与电容支路的电流表读数相等,由这个条件可求出电路工作的频率值,再代入原边的电感值计算得到原边电路的阻抗,最后求出原边电流;(2)卷积:是一个指数函数和一个延时正比例函数的卷积,直接用公式计算即可,可以把指数函数选作先对称后平移的项,这样只需分三个时间段进行讨论即可; 2、三相电路:(1)电源和负载均为星形连接,且三相对称,直接抽单相计算线电流;(2)共B接法的二表法测电路的三相有功功率,要画图和计算两块功率表的读数,注意的读数为负数;(3)当A相负载对中性点短路后求各相电源的有功,先用节点法求出各相电流,再计算各相电源的有功功率; 3、理想运放的问题:共有2级理想运放,其中第一级为负反馈,第二级为正反馈,解答时先要判断出这一信息,然后(1)求第一级的输出,因为第一级运放是负反馈,故可以用“虚断”和“虚短”,得到输出(实为一个反向比例放大器);(2)求第二级的输出,因为是正反馈,所以“虚断”仍成立,但“虚短”不成立,不过,由正反馈的性质,运放要么工作在正向饱和区,要么工作在反向饱和区,即输出始终为,故可以假设输出为其中一个饱和电压,比较反相输入端和非反相输入端的电压值即可确定第二级的输出(实为一个滞回比较器); 4、一阶电路的方框图问题:动态元件是电容,它接在方框左端,首先告诉了方框右端支路上的电流的零输入响应,由此可得从电容两端看入的入端电阻,即为从方框左端看入的Thevenin等效电阻,其次可得到时刻的电量,画出这个等效电路图;然后改变电容值,改变电容的初始电压值,并在方框右端的支路上接上一个冲激电压源,求电容电压的响应:可以利用叠加定理,分解为零输入响应和零状态响应分别求解,零输入响应可根据前述Thevenin等效电阻直接写出,零状态响应可以先用互易定理(因为方框内的元件全是线性电阻,满足互易定理)结合前述“时刻的电量,画出这个等效电路图”得到左端的短路电流,再由Thevenin等效电阻进而得到从电容两端向右看入的Thevenin等效电路,然后先求阶跃响应,再求导得到冲激源作用下的冲激响应;最后叠加得到全响应; 5、列写状态方程:含有一个压控电流源的受控源,有2个电容和1个电感,用直接法,最后消去非状态变量即可得解答; 6、含有互感的非正弦周期电路(15分):(1)求电感电流,互感没有公共节点,无法去耦等效,只能用一般方法解,该题的电源有2种频率,有3个网孔,2个电感和1个电容,最关键的是左下角网孔的电源是电流源,因此可以设出电感电流的值,再由KCL表示出剩余支路的电流,最后对某一个网孔列写KVL,解方程即可得到要求的电感电流的值,只需列写一个方程,但要注意正确地写出互感电压的表达式;(2)求电流源发出的功率,由第一问的解求出电流源两端的电压,即可得到解答; 7、含有理想二极管的二阶电路:需要判断理想二极管何时关断、何时导通,这是解题的关键。从0时刻开始,二极管关断,电路是一个二阶电路,求出电感电流的响应,直到二极管的端电压一直由增大到零,这就是所求临界点,即电感电流达到最大值的时间节点,此后二极管导通,左右两部分电路是2个独立的一阶电路。因此(1)电路可以分为2个工作时间段,分别画出前述的二阶等效电路

编译原理复习题及答案

编译原理复习题及答案一、选择题 1.一个正规语言只能对应( B ) A 一个正规文法 B 一个最小有限状态自动机 2.文法G[A]:A→εA→aB B→Ab B→a是( A ) A 正规文法 B 二型文法 3.下面说法正确的是( A ) A 一个SLR(1)文法一定也是LALR(1)文法 B 一个LR(1)文法一定也是LALR(1)文法 4.一个上下文无关文法消除了左递归,提取了左公共因子后是满足LL(1)文法的( A ) A 必要条件 B 充分必要条件 5.下面说法正确的是( B ) A 一个正规式只能对应一个确定的有限状态自动机 B 一个正规语言可能对应多个正规文法 6.算符优先分析与规范归约相比的优点是( A ) A 归约速度快 B 对文法限制少 7.一个LR(1)文法合并同心集后若不是LALR(1)文法( B ) A 则可能存在移进/归约冲突 B 则可能存在归约/归约冲突 C 则可能存在移进/归约冲突和归约/归约冲突 8.下面说法正确的是( A ) A Lex是一个词法分析器的生成器 B Yacc是一个语法分析器 9.下面说法正确的是( A ) A 一个正规文法也一定是二型文法 B 一个二型文法也一定能有一个等价的正规文法 10.编译原理是对(C)。 A、机器语言的执行 B、汇编语言的翻译 C、高级语言的翻译 D、高级语言程序的解释执行

11.(A)是一种典型的解释型语言。 A.BASIC B.C C.FORTRAN D.PASCAL 12.把汇编语言程序翻译成机器可执行的目标程序的工作是由(B)完成的。 A. 编译器 B. 汇编器 C. 解释器 D. 预处理器 13.用高级语言编写的程序经编译后产生的程序叫(B) A.源程序?B.目标程序C.连接程序D.解释程序14.(C)不是编译程序的组成部分。 A.词法分析程序 B.代码生成程序? C.设备管理程序 D.语法分析程序 15.通常一个编译程序中,不仅包含词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成等六个部分,还应包括(C)。 A.模拟执行器B.解释器?C.表格处理和出错处理 ??? D.符号执行器16.编译程序绝大多数时间花在(D)上。 A.出错处理B.词法分析C.目标代码生成D.表格管理 17.源程序是句子的集合,(B)可以较好地反映句子的结构。 A. 线性表 B. 树 C. 完全图 D. 堆栈 18.词法分析器的输出结果是(D)。 A、单词自身值 B、单词在符号表中的位置 C、单词的种别编码 D、单词的种别编码和自身值 19.词法分析器不能(D) A. 识别出数值常量 B. 过滤源程序中的注释 C. 扫描源程序并识别记号 D. 发现括号不匹配 20.文法:G:S→xSx | y所识别的语言是(D)。 A、xyx B、(xyx)* C、x*yx* D、x n yx n(n≥0) 21.如果文法G是无二义的,则它的任何句子α(A) A.最左推导和最右推导对应的语法树必定相同 B.最左推导和最右推导对应的语法树可能不同 C.最左推导和最右推导必定相同 D.可能存在两个不同的最左推导,但它们对应的语法树相同 22.正则文法(A)二义性的。 A. 可以是 B. 一定不是 C. 一定是 23.(B)这样一些语言,它们能被确定的有穷自动机识别,但不能用正则表达式表示。 A. 存在 B. 不存在 C. 无法判定是否存在 24.给定文法A→bA | ca,为该文法句子的是(C)

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

第1章引论 第1题 解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 答案: (1) 编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。 (2) 源程序:源语言编写的程序称为源程序。 (3) 目标程序:目标语言书写的程序称为目标程序。 (4) 编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶 段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符 号表管理等工作。 (5) 后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。 (6) 遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。 第2题 一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。 答案: 一个典型的编译程序通常包含8个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。其各部分的主要功能简述如下。 词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。 语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。 语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。

目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。 表格管理程序:负责建立、填写和查找等一系列表格工作。表格的作用是记录源程序的各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。可以说整个编译过程就是造表、查表的工作过程。需要指出的是,这里的“表格管理程序”并不意味着它就是一个独立的表格管理模块,而是指编译程序具有的表格管理功能。 错误处理程序:处理和校正源程序中存在的词法、语法和语义错误。当编译程序发现源程序中的错误时,错误处理程序负责报告出错的位置和错误性质等信息,同时对发现的错误进行适当的校正(修复),目的是使编译程序能够继续向下进行分析和处理。 注意:如果问编译程序有哪些主要构成成分,只要回答六部分就可以。如果搞不清楚,就回答八部分。 第3题 何谓翻译程序、编译程序和解释程序?它们三者之间有何种关系? 答案: 翻译程序是指将用某种语言编写的程序转换成另一种语言形式的程序的程序,如编译程序和汇编程序等。 编译程序是把用高级语言编写的源程序转换(加工)成与之等价的另一种用低级语言编写的目标程序的翻译程序。 解释程序是解释、执行高级语言源程序的程序。解释方式一般分为两种:一种方式是,源程序功能的实现完全由解释程序承担和完成,即每读出源程序的一条语句的第一个单词,则依据这个单词把控制转移到实现这条语句功能的程序部分,该部分负责完成这条语句的功

编译原理试题及答案

参考答案 一、单项选择题(共10小题,每小题2分,共20分) 1.语言是 A .句子的集合 B .产生式的集合 C .符号串的集合 D .句型的集合 2.编译程序前三个阶段完成的工作是 A .词法分析、语法分析和代码优化 B .代码生成、代码优化和词法分析 C .词法分析、语法分析、语义分析和中间代码生成 D .词法分析、语法分析和代码优化 3.一个句型中称为句柄的是该句型的最左 A .非终结符号 B .短语 C .句子 D .直接短语 4.下推自动机识别的语言是 A .0型语言 B .1型语言 C .2型语言 D .3型语言 5.扫描器所完成的任务是从字符串形式的源程序中识别出一个个具有独立含义的最小语法单位即 A . 字符 B .单词 C .句子 D .句型 6.对应Chomsky 四种文法的四种语言之间的关系是 A .L 0?L 1?L 2?L 3 B .L 3?L 2?L 1?L 0 C .L 3=L 2?L 1?L 0 D .L 0?L 1?L 2=L 3 7.词法分析的任务是 A .识别单词 B .分析句子的含义 C .识别句子 D .生成目标代码 8.常用的中间代码形式不含 A .三元式 B .四元式 C .逆波兰式 D .语法树 9. 代码优化的目的是 A .节省时间 B .节省空间 C .节省时间和空间 D .把编译程序进行等价交换 10.代码生成阶段的主要任务是 A .把高级语言翻译成汇编语言 B .把高级语言翻译成机器语言 C .把中间代码变换成依赖具体机器的目标代码 装 订 线

D.把汇编语言翻译成机器语言 二、填空题(本大题共5小题,每小题2分,共10分) 1.编译程序首先要识别出源程序中每个(单词),然后再分析每个(句子)并翻译其意义。2.编译器常用的语法分析方法有(自底向上)和(自顶向下)两种。 3.通常把编译过程分为分析前端与综合后端两大阶段。词法、语法和语义分析是对源程序的(分析),中间代码生成、代码优化与目标代码的生成则是对源程序的(综合)。 4.程序设计语言的发展带来了日渐多变的运行时存储管理方案,主要分为两大类,即(静态存储分配)方案和(动态存储分配)方案。 5.对编译程序而言,输入数据是(源程序),输出结果是(目标程序)。 三、名词解释题(共5小题,每小题4分,共20分) 1.词法分析 词法分析的主要任务是从左向右扫描每行源程序的符号,按照词法规则 从构成源程序的字符串中识别出一个个具有独立意义的最小语法单位, 并转换成统一的内部表示(token),送给语法分析程序。 2.LL(1)文法 若文法的任何两个产生式A →α | β都满足下面两个条件: (1)FIRST(α) ? FIRST(β ) = φ; (2)若β?* ε,那么FIRST(α) ? FOLLOW( A ) = φ。 我们把满足这两个条件的文法叫做LL(1)文法,其中的第一个L代表从左 向右扫描输入,第二个L表示产生最左推导,1代表在决定分析器的每步 动作时向前看一个输入符号。除了没有公共左因子外,LL(1)文法还有一 些明显的性质,它不是二义的,也不含左递归。 3.语法树 句子的树结构表示法称为语法树(语法分析树或语法推导树)。 给定文法G=(V N,V T,P,S),对于G的任何句型都能构造与之关联的 语法树。这棵树具有下列特征: (1)根节点的标记是开始符号S。 (2)每个节点的标记都是V中的一个符号。 (3)若一棵子树的根节点为A,且其所有直接子孙的标记从左向右的排列 次序为A1A2…A R,那么A→A1A2…A R一定是P中的一条产生式。

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

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

编译原理试题答案

编译原理期末测试题 专业班级:_________学号:_________姓名:__________总分 一、单项选择题(共10小题,每小题2分) (题分 20分) 1.语言是 A .句子的集合 B .产生式的集合 C .符号串的集合 D .句型的集合 2.编译程序前三个阶段完成的工作是 A .词法分析、语法分析和代码优化 B .代码生成、代码优化和词法分析 C .词法分析、语法分析、语义分析和中间代码生成 D .词法分析、语法分析和代码优化 3.一个句型中称为句柄的是该句型的最左 A .非终结符号 B .短语 C .句子 D .直接短语 4.下推自动机识别的语言是 A .0型语言 B .1型语言 C .2型语言 D .3型语言 5.扫描器所完成的任务是从字符串形式的源程序中识别出一个个具有独立含义的最小语法单位即 A . 字符 B .单词 C .句子 D .句型 6.对应Chomsky 四种文法的四种语言之间的关系是 A .L 0?L 1?L 2?L 3 B .L 3?L 2?L 1?L 0 C .L 3=L 2?L 1?L 0 D .L 0?L 1?L 2=L 3 7.词法分析的任务是 A .识别单词 B .分析句子的含义 C .识别句子 D .生成目标代码 8.常用的中间代码形式不含 A .三元式 B .四元式 C .逆波兰式 D .语法树 9. 代码优化的目的是 A .节省时间 B .节省空间 C .节省时间和空间 D .把编译程序进行等价交换 装 订 线

10.代码生成阶段的主要任务是 A .把高级语言翻译成汇编语言 B .把高级语言翻译成机器语言 C .把中间代码变换成依赖具体机器的目标代码 D .把汇编语言翻译成机器语言 二、填空题(本大题共5小题,每小题2分)(题分 10分) 1.编译程序首先要识别出源程序中每个( ),然后再分析每个( )并翻译 其意义。 2.编译器常用的语法分析方法有( )和( )两种。 3.通常把编译过程分为分析前端与综合后端两大阶段。词法、语法和语义分析是对源程序的( ),中间代码生成、代码优化与目标代码的生成则是对源程序的( )。 4.程序设计语言的发展带来了日渐多变的运行时存储管理方案,主要分为两大类,即: ( )方案和( )方案。 5.对编译程序而言,输入数据是( ),输出结果是( )。 三、名词解释题(共5小题,每小题4分) (题分 20分) 1.词法分析 2.LL(1)文法 3.语法树 4.LR(0)分析器 5.语言和文法 四、简答题(共4小题,每小题5分) (题分 20分) 1.编译程序和高级语言有什么区别? 2.编译程序的工作分为那几个阶段? 3.简述自下而上的分析方法。 4.简述代码优化的目的和意义。

编译原理考试试题与答案(汇总)

《编译原理》考试试题及答案(汇总) 一、是非题(请在括号,正确的划√,错误的划×)(每个2分,共20分) 1.编译程序是对高级语言程序的解释执行。(× ) 2.一个有限状态自动机中,有且仅有一个唯一的终态。(×) 3.一个算符优先文法可能不存在算符优先函数与之对应。(√ ) 4.语法分析时必须先消除文法中的左递归。(×) 5.LR分析法在自左至右扫描输入串时就能发现错误,但不能准确地指出出错地点。(√) 6.逆波兰表示法表示表达式时无须使用括号。(√ ) 7.静态数组的存储空间可以在编译时确定。(×) 8.进行代码优化时应着重考虑循环的代码优化,这对提高目标代码的效率将起更大作用。(×) 9.两个正规集相等的必要条件是他们对应的正规式等价。(× ) 10.一个语义子程序描述了一个文法所对应的翻译工作。(×) 二、选择题(请在前括号选择最确切的一项作为答案划一个勾,多划按错论)(每个4分,共40分) 1.词法分析器的输出结果是_____。 A.( ) 单词的种别编码B.( ) 单词在符号表中的位置 C.( ) 单词的种别编码和自身值D.( ) 单词自身值 2.正规式 M 1 和 M 2 等价是指_____。 A.( ) M1和M2的状态数相等 B.( ) M1和M2的有向边条数相等C.( ) M1和M2所识别的语言集相等D.( ) M1和M2状态数和有向边条数相等

3.文法G:S→xSx|y所识别的语言是_____。 A.( ) xyx B.( ) (xyx)* C.( ) xnyxn(n≥0) D.( ) x*yx* 4.如果文法G是无二义的,则它的任何句子α_____。 A.( )最左推导和最右推导对应的语法树必定相同 B.( ) 最左推导和最右推导对应的语法树可能不同 C.( ) 最左推导和最右推导必定相同 D.( )可能存在两个不同的最左推导,但它们对应的语法树相同 5.构造编译程序应掌握______。 A.( )源程序B.( ) 目标语言 C.( ) 编译方法 D.( ) 以上三项都是 6.四元式之间的联系是通过_____实现的。 A.( ) 指示器B.( ) 临时变量 C.( ) 符号表 D.( ) 程序变量 7.表达式(┐A∨B)∧(C∨D)的逆波兰表示为_____。 A. ( ) ┐AB∨∧CD∨B.( ) A┐B∨CD∨∧ C.( ) AB∨┐CD∨∧ D.( ) A┐B∨∧CD∨ 8. 优化可生成_____的目标代码。 A.( ) 运行时间较短B.( ) 占用存储空间较小C.( ) 运行时间短但占用存空间大D.( ) 运行时间短且占用存储空间小 9.下列______优化方法不是针对循环优化进行的。 A. ( ) 强度削弱 B.( ) 删除归纳变量 C.( ) 删除多余运算 D.( ) 代码外提

相关文档
最新文档