您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 编译原理课后习题答案
第一章1.解答:程序设计语言:程序设计语言是遵守一定规范的、描述“计算”(Computing)过程的形式语言。一般可以划分为低级语言和高级语言两大类。低级语言是面向机器的语言,它是为特定的计算机系统设计的语言,机器指令、汇编语言是低级语言。高级语言是与具体计算机无关的“通用”语言,它更接近于人类的自然语言和数学表示,例如FORTRAN、Pascal、C等等我们熟悉的语言是高级语言。语言处理程序:由于目前的计算机只能理解和执行机器语言,因此必须有一个程序将用程序设计语言书写的程序等价(执行效果完全一致)地转换为计算机能直接执行的形式,完成这一工作的程序称为“语言处理程序”。它一般可分为解释程序和翻译程序两大类。翻译程序:翻译程序(Translator)是一种语言处理程序,它将输入的用程序设计语言书写的程序(称为源程序)转换为等价的用另一种语言书写的程序(称为目标程序)。若源语言是汇编语言,目标程序是机器语言,称这种翻译程序为汇编程序。若源语言是高级语言,目标程序是低级语言,称这种翻译程序为编译程序。解释程序:解释程序(Interpreter)是一种语言处理程序,它对源程序逐个语句地进行分析,根据每个语句的含义执行语句指定的功能。2.解答:编译程序的总框图见图1.2。其中词法分析器,又称扫描器,它接受输入的源程序,对源程序进行词法分析,识别出一个个的单词符号,其输出结果是单词符号。语法分析器,对单词符号串进行语法分析(根据语法规则进行推导或归约),识别出程序中的各类语法单位,最终判断输入串是否构成语法上正确的“程序”。语义分析及中间代码产生器,按照语义规则对语法分析器归约出(或推导出)的语法单位进行语义分析并把它们翻译成一定形式的中间代码。编译程序可以根据不同的需要选择不同的中间代码形式,有的编译程序甚至没有中间代码形式,而直接生成目标代码。优化器对中间代码进行优化处理。一般最初生成的中间代码执行效率都比较低,因此要做中间代码的优化,其过程实际上是对中间代码进行等价替换,使程序在执行时能更快,并占用更小的空间。目标代码生成器把中间代码翻译成目标程序。中间代码一般是一种机器无关的表示形式,只有把它再翻译成与机器硬件直接相关的机器能识别的语言,即目标程序,才能在机器上运行。表格管理模块保持一系列的表格,登记源程序的各类信息和编译各阶段的进展状况。编译程序各个阶段所产生的中间结果都记录在表格中,所需要的信息也大多从表格中获取,整个编译过程都在不断地和表格打交道。出错处理程序对出现在源程序中的错误进行处理。如果源程序有错误,编译程序应设法发现错误,把有关错误信息报告给用户。编译程序的各个阶段都有可能发现错误,出错处理程序要对发现的错误进行处理、记录,并反映给用户Chapter21.试写出VT={0,1}上下述集合的正则表达式:⑴所有以1开始和结束的符号串。⑵恰含有3个1的所有符号所组成的集合。⑶集合{01,1}。⑷所有以111结束的符号串。解答:⑴1(0|1)*1|1⑵0*10*10*10*⑶01|1⑷(0|1)*1112.⑴试写出非负整数集的正则表达式。⑵试写出以非5数字为头的所有非负整数集的正则表达式。解答:⑴0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*⑵0|(1|2|3|4|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*3.试将2.8中所示的有限状态自动机M最小化。分析:只能对确定的有限状态自动机进行最小化,本题的自动机已经是确定的。最小化采用状态分离法,具体做法如下:①进行0等价类的划分:Q划分为Qf与Q-Qf②若已进行了k等价划分,即Q已被划分成(Q1,Q2,…Qn),再进行k+1划分,对Qi(i=1…n),若q、q’Qi,使得对某一个aVT,(q,a)Qj和(q’,a)Ql,j≠l或(q,a)存在而(q’,a)不存在或反之。则将Qi划分为二个子集Qi1,Qi2,使qQi1,q’Qi2。③重复②直至无法进一步划分为止。对最后划分得到的状态子集中每一个子集,选择该子集中任何一个状态作为该状态子集的代表,然后修改原来的有限状态自动机的状态转换函数,凡在作用下转向某状态子集中任何一个状态的一律改成转向该状态子集的代表。若一个状态子集中某一状态是原来的开始状态,则该状态子集的代表就是新的有限状态自动机的开始状态。同理,若一个状态子集中的状态均是最终状态,则该状态子集的代表就是新的有限状态自动机的最终状态。④抹去可能存在的无用状态与不可及状态。解答:此有限状态自动机的状态转换表如表3.1所示:表2.1M的状态转换表abABCBDCCBEDDFAcceptEGEAcceptFGEAcceptGDFAccept由此看出:此有限状态自动机是确定的。最小化:初始划分由2个子集组成,即:({A,B,C},{D,E,F,G})集合{D,E,F,G}不需要进一步划分,考察子集{A,B,C}。由于(B,a)=D{D,E,F,G},而(A,a)=(C,a)=B{A,BC},因此Q可进一步划分为:({A,C},{B},{D,E,F,G})。由于(A,b)=C{A,C},而(C,b)=E{D,E,F,G}。因此Q可进一步划分为:({A},{C},{B},{D,E,F,G})。这时不能再划分了,得到的最小化的有限状态自动机如表3.2所示:表2.2最小化的有限状态自动机abABCCBEBDCDDDAccept4.某程序语言的无(正负)符号常数可以用下面正则表达式R来表示:(D+E|D+.D+E|E|.D+E)((+|-)D|D)D*|D+|D*.D+⑴试把它转换成确定性有限状态自动机。⑵把上述有限状态自动机最小化。⑶在上述有限状态自动机中添加相应动作,取出无(正负)符号常数。分析:从正则表达式构造有限状态自动机可以分两步进行。①画一条从结点X到结点Y的有向弧,有向弧上标以正则表达式R。结点X为标以“-”的初始状态,结点Y为标以“+”的最终状态。从这一有向图出发反复应用图3.2所示的替代规则,直至所有有向弧都以VT中的符号或标记为止。图2.23条替代规则②消除应用①所得到的传递图中的ε弧,可以分为两步:首先消除ε环路,其次消除其他ε弧。a)ε环路的消除方法:i.将ε环路的诸项合并为一个顶点。ii.修改各个相关的有向弧。iii.若ε环路中某一状态是最终(或初始)状态,则新顶点是最终(或初始)状态。b)其它ε弧的消除有两种方法:1)子集法:即计算ε-Closure(T),其表示从状态集T中任何一状态沿ε弧可以到达的状态全体。其要点是:从初始状态q0的X=ε-Closure(q0)开始,按如下方法构造状态集:i.令Set={X};ii.若Set中还有未考察过的状态子集Xi,则对于每一输入符号aVT,求T=ε-Closure(move(Xi,a)),Set=Set∪{T}(其中move(Xi,a)={q|qδ(p,a),pXi})。重复执行(2),直至不存在这样的Xi。这样得到的Set即为消除ε弧后的确定的有限状态机(DFA)。DFA的初始状态就是ε-Closure(q0),最终状态由那些至少含有一个最终状态的状态子集组成。2)逐步消除法:其要点是找到类似于图2.3所示,但从B再无ε弧引出的ε弧。图2.3逐步消除法删除状态A到状态B的ε弧,对每一条从状态B到状态C标记为ai的弧,增加1条从状态A到状态C标记为ai的弧。若B是最终状态,则让A为最终状态。重复上述过程直至消除全部的ε弧,这样得到的一般是不确定的有限状态自动机(NFA)。解答:⑴图3.4给出了从正则表达式R构造有限状态自动机M的过程。图2.4替代规则的应用过程应用子集法消除?弧:ε-Closure(x)={x,2},令A1={x,2},计算:ε-Closure(move(A1,D))=ε-Closure({7,10,2,1})={7,10,2,1,y}ε-Closure(move(A1,·))=ε-Closure({5,3})={5,3}ε-Closure(move(A1,E))=ε-Closure({4})={4}令A2={7,10,2,1,y},A3={5,3},A4={4},计算:ε-Closure(move(A2,D))={7,10,2,1,y}ε-Closure(move(A2,·))={8,3}ε-Closure(move(A2,E))={4}ε-Closure(move(A3,D))={5,6,3,y}ε-Closure(move(A4,D))={12,y}ε-Closure(move(A4,+))={11}ε-Closure(move(A4,-))={11}令A5={8,3},A6={5,6,3,y},A7={12,y},A8={11},计算:ε-Closure(move(A5,D)={8,9,3,y}ε-Closure(move(A6,D)={5,6,3,y}ε-Closure(move(A6,E)={4}ε-Closure(move(A7,D)={12,y}ε-Closure(move(A8,D)={12,y}令A9={8,9,3,y},计算:ε-Closure(move(A9,D)={8,9,3,y}ε-Closure(move(A9,E)={4}得到的DFAM’的初始状态是A1,最终状态集由A2,A6,A7,A9组成。图2.5是M’的状态转换图,M’的状态转换表如表2.3所示。表2.3M’的状态转换表DE·+-A1A2A4A3A2A2A4A5AcceptA3A6A4A7A8A8A5A9A6A6A4AcceptA7A7AcceptA8A7A9A9A4Accept图2.5M’的状态转换图⑵采用状态分离法:初始时分成2个子集,即:({A1,A3,A4,A5,A8},{A2,A6,A7,A9})考察子集{A2,A6,A7,A9},它进一步可分成:({A6,A9},{A2},{A7})考察子集{A1,A3,A4,A5,A8},它进一步分成:({A4},{A1},{A8},{A3,A5})不能再进一步划分了,得到的最小化的有限状态自动机如图2.6所示:图2.6最小化的有限状态自动机⑶由于数的表示和具体的机器有着内在联系,这里仅将此无(正负)符号常数的十进制数部分和指数部分分别存入2个工作单元。设立下述工作单元:此常数的十进制数部分number此常数的指数部分exp小数点位数n此常数指数部分正负号expsign这4个工作单元进入有限状态自动机的模拟程序时被初始化为0。函数过程getchar,其功能是读入下一个字符到工作单元char中。函数过程value,其功能是求出存放在工作单元char中数字字符的值。经过加工后的状态矩阵如表2.4所示:表2.4加工后的状态矩阵D·E+-A1#1,A2#2,A3#2,A4A2#3,A2#2,A3#2,A4#10,AcceptA3#4,A6A4#5,A7#6,A8#7,A8A6#4,A6#2,A4#11,AcceptA7#8,A7#12,AcceptA8#9,A7矩阵中元素A1,A2,….,A7表示应该转换的下一个状态。#1,#2,….,#12表示应该执行的语义子程序。各语义子程序的代码归结如下:#1:number:=value(char);getchar;#2:getchar;#3:number:=number*10+value(char);getchar;#4:n:=n+1;number:=number*10+value(char);getchar;#5:expsign:=1;exp:=value(char);getchar;#6:expsign:=1;getchar;#7:expsign=-1;getchar;#8:exp:=exp*10+value(char);getchar;#9:exp:=value(char);getchar;#10:按硬件要求构造无(正负)符号数;#11:exp:=-n;按硬件要求构造无(正负)符号数;#12:
本文标题:编译原理课后习题答案
链接地址:https://www.777doc.com/doc-2069035 .html