第1章引言1、解释下列各词源语言:编写源程序的语言(基本符号,关键字),各种程序设计语言都可以作为源语言。
源程序: 用接近自然语言(数学语言)的源语言(基本符号,关键字)编写的程序,它是翻译程序处理的对象。
目标程序: 目标程序是源程序经过翻译程序加工最后得到的程序。
目标程序(结果程序)一般可由计算机直接执行。
低级语言:机器语言和汇编语言。
高级语言:是人们根据描述实际问题的需要而设计的一个记号系统。
如同自然语言(接近数学语言和工程语言)一样,语言的基本单位是语句,由符号组和一组用来组织它们成为有确定意义的组合规则。
翻译程序: 能够把某一种语言程序(源语言程序)改变成另一种语言程序(目标语言程序),后者与前者在逻辑上是等价的。
其中包括:编译程序,解释程序,汇编程序。
编译程序: 把输入的源程序翻译成等价的目标程序(汇编语言或机器语言),然后再执行目标程序(先编译后执行),执行翻译工作的程序称为编译程序。
解释程序: 以该语言写的源程序作为输入,但不产生目标程序。
按源程序中语句动态顺序逐句的边解释边执行的过程,完成翻译工作的程序称为解释程序。
2、什么叫“遍”?指对源程序或源程序的中间形式(如单词,中间代码)从头到尾扫描一次,并作相应的加工处理,称为一遍。
3、简述编译程序的基本过程的任务。
编译程序的工作是指从输入源程序开始到输出目标程序为止的整个过程,整个过程可以划分5个阶段。
词法分析:输入源程序,进行词法分析,输出单词符号。
语法分析:在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位,并判断输入串是否构成语法正确的“程序”。
中间代码生成:按照语义规则把语法分析器归约(或推导)出的语法单位翻译成一定形式的中间代码。
优化:对中间代码进行优化处理。
目标代码生成:把中间代码翻译成目标语言程序。
4、编译程序与解释程序的区别?编译程序生成目标程序后,再执行目标程序;然而解释程序不生成目标程序,边解释边执行。
5、有人认为编译程序的五个组成部分缺一不可,这种看法正确吗?编译程序的5个阶段中,词法分析,语法分析,语义分析和代码生成生成是必须完成的。
而中间代码生成和代码优化并不是必不可少的。
优化的目的是为了提高目标程序的质量,没有这一部分工作,仍然能够得到目标代码。
6、编译程序的分类目前基本分为:诊断编译程序,优化编译程序,交叉编译程序,可变目标编译程序。
第2章高级语言及其语法描述1(P36)令文法为N → D∣NDD → 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⇒34N⇒ND⇒NDD⇒DDD⇒5DD⇒56D⇒568最右推导:N⇒ND⇒N4⇒D4⇒34N⇒ND⇒N8⇒ND8⇒N68⇒D68⇒5682*.写出一个文法,使其语言是奇数集,且每个奇数是不以0开头。
答:S → CAB|B (考虑了正负号)A → 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | AA | A0 | εB → 1|3|5|7|9C → +|-|ε或:(未考虑正负号)S → B | ABB → 1 | 3 | 5 | 7 | 9A → AD | NN → 2 | 4 | 6 | 8 | BD → 0 | N或:(未考虑正负号)S → C | ABCC → 1 | 3 | 5 | 7 | 9A → 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9B → BA | B0 |ε2.(P36, 8)令文法为E → T∣E+T∣E-TT → F∣T*F∣T/FF →(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*iE⇒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*iE⇒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 + TE + T iT ii3.(P36, 9)证明下面的文法是二义的:S → iSeS | iS ∣ i答:对于句子iiiei有两棵不同的语法树。
因此该文法是二义的。
S ⇒ iSeS ⇒ iiSeS ⇒ iiieS ⇒ iiieiS ⇒ 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’的转换矩阵:I I a I b{x} ①{x,y} ②{y} ③{x,y} ②{x,y} ②{x,y} ②{y} ③{x,y} ②②确定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。
0∣11(2(3)由转换矩阵构造DFA M1111111234563.(P64,12(a))将下图所示的NFA M转换为等价的DFA M’,并将该DFA’最小化。
答:该有限自动机状态0输入同一字符a时到达两个不同的结点,所以是NFA。
I I a I b{0} ①{0,1} ②{1} ③{0,1} ②{0,1} ②{1} ③{1} ③{0} ①(aabab(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:ab1 2,3123a4. (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)考虑下面文法GS→ 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→i8 #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→i14 #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→i22 #E’T’ #23 #E’ # T’→ε24 # # E’→ε3. (P81,2)对下面的文法GE → TE’E’→ +E∣εT → FT’T’→ T∣εF → PF’F’→ *F’∣εP → (E)∣^∣a∣b(1)计算这个文法的每个非终结符的FIRST和FOLLOW。