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

编译原理作业标准答案第一章引言一、解释下列各词源语言:编写源程序的语言(基本符号,关键字),各种程序设计语言都可以作为源语言。
源程序: 用接近自然语言(数学语言)的源语言(基本符号,关键字)编写的程序,它是翻译程序处理的对象。
目标程序: 目标程序是源程序经过翻译程序加工最后得到的程序。
目标程序(结果程序)一般可由计算机直接执行。
低级语言:机器语言和汇编语言。
高级语言:是人们根据描述实际问题的需要而设计的一个记号系统。
如同自然语言(接近数学语言和工程语言)一样,语言的基本单位是语句,由符号组和一组用来组织它们成为有确定意义的组合规则。
翻译程序: 能够把某一种语言程序(源语言程序)改变成另一种语言程序(目标语言程序),后者与前者在逻辑上是等价的。
其中包括:编译程序,解释程序,汇编程序。
编译程序: 把输入的源程序翻译成等价的目标程序(汇编语言或机器语言),然后再执行目标程序(先编译后执行),执行翻译工作的程序称为编译程序。
解释程序: 以该语言写的源程序作为输入,但不产生目标程序。
按源程序中语句动态顺序逐句的边解释边执行的过程,完成翻译工作的程序称为解释程序。
二、什么叫“遍”?指对源程序或源程序的中间形式(如单词,中间代码)从头到尾扫描一次,并作相应的加工处理,称为一遍。
三、简述编译程序的基本过程的任务。
编译程序的工作是指从输入源程序开始到输出目标程序为止的整个过程,整个过程可以划分5个阶段。
词法分析:输入源程序,进行词法分析,输出单词符号。
语法分析:在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位,并判断输入串是否构成语法正确的“程序”。
中间代码生成:按照语义规则把语法分析器归约(或推导)出的语法单位翻译成一定形式的中间代码。
优化:对中间代码进行优化处理。
目标代码生成:把中间代码翻译成目标语言程序。
四、编译程序与解释程序的区别?编译程序生成目标程序后,再执行目标程序;然而解释程序不生成目标程序,边解释边执行。
编译原理附标准答案五

练习5.1解答:输入(4*7+1)*2n,带注释的分析树如下:练习5.2解答: (1)根据表5.3中的语法制导定义建立表达式((a)+(b))的分析树和语法树(2)根据图5.17的翻译模式构造((a)+(b))的分析树和语法树练习5.3解答:设置下面的函数和属性:expr1||expr2:把表达式expr2拼写在表达式expr1后面。
deletep(expr):去掉表达式expr左端的‘(’和右端的‘)’。
E.expr,T.expr,F.expr:属性变量,分别表示E,T,F的表达式。
E.add,T.add,F.add,属性变量,若为true,则表示其表达式中外层有‘+’号,否则无‘+’号。
E.pmark,T.pmark,F.pmark,属性变量,若为true,表示E,T,F的表达式中左端为‘(’,右端是‘)’。
语法制导定义如下:产生式语义规则E -> E1 +T if(T.pmark==true)THEN E.expr=E1.expr||'+'||deletep(T.expr) ELSE E.expr:=E1.expr||'+'||T.expr;E.add:=true;E.pmark:=false;E -> T if(T.pmark==true)THEN E.expr:=deletep(T.expr)ELSE E.expr:=T.expr;E.add:=T.add;E.pmark:=false;T -> T1*F T.expr:=T1.expr||'*'||F.expr; T.add:=false;T.pmark:=false;T -> F T.expr:=F.expr; T.add:=F.add;T.pmark:=F.pmark;F -> (E) if(E.add==false)THEN BEGINF.expr:=E.expr;F.add:=false;F.pmark:=false;ENDELSE BEGINF.expr:='('||E.expr||')';F.add:=true;F.pmark:=true;END;F -> id F.expr:=id.lexval;F.add:=false;F.pmark:=false;练习5.4解答: (1)语法制导定义如下:产生式语义规则E -> E1+T if(E1.type==int) AND (T.type==int) THEN E.type:=intELSE E.type:=real;E -> T E.type:=T.type;T -> num T.type:=int;T -> num.num T.type:=real;(2)设E.pf和T.pf分别是E和T的前缀形式,||是两个字符串的连接,语法制导定义如下:产生式语义规则E -> E1+T if(E1.type==int) AND (T.type==int)THEN E.type:=intELSE BEGINE.type:=real;if(E1.type==int) AND (T.type==real)THEN E1.pf:='inttoreal'||E1.pfELSE if(E1.type==real)AND(T.type==int)THEN T.pf:='inttoreal'||T.pfEND;E.pf:='+'||E1.pf||T.pf;E -> T E.type:=T.type; E.pf:=T.pf;T -> num T.type:=int; T.pf:=int.lexval;T ->num.numT.type:=real; T.pf:=real.lexval;练习5.5解答: (1)用综合属性决定s.val的语法制导定义:产生式语义规则S -> L S.val:=L.val;S ->L1.L2S.val:=L1.val+L2.val*L2.p;L -> B L.val:=B.val; L.p:=2-1;L -> L1B L.val:=L1.val*2+B.val; L.p:=L.p*2-1;B -> 0 B.val:=0;B -> 1 B.val:=1;注:L.p表示恢复L.val的因子。
编译原理 全部参考答案

第二章P-36-6(1)L(G)是0~9组成的数字串;(2)最左推导:N⇒ND⇒NDD⇒NDDD⇒DDDD⇒0DDD⇒01DD⇒012D⇒0127N⇒ND⇒DD⇒3D⇒34N⇒ND⇒NDD⇒DDD⇒5DD⇒56D⇒568最右推导:N⇒ND⇒N7⇒ND7⇒N27⇒ND27⇒N127⇒D127⇒0127N⇒ND⇒N4⇒D4⇒34N⇒ND⇒N8⇒ND8⇒N68⇒D68⇒568P-36-7G(S):(没有考虑正负符号问题)S→P|APP→1|3|5|7|9A→AD|NN→2|4|6|8|PD→0|N或者:(1)S→ABC|CA→1|2|3|4|5|6|7|8|9B→BA|B0|εC→1|3|5|7|9P-36-8G(E):E→T|E+T|E-TT→F|T*F|T/FF→(E)|i最左推导: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)语法树:SiSeSiSiiSiS i S eS iiP-36-9句子:iiiei 有两个语法树: S ⇒iSeS ⇒iSei ⇒iiSei ⇒iiiei S ⇒iS ⇒iiSeS ⇒iiSei ⇒iiiei因此iiiei 是二义性句子,因此 该文法是二义性的。
P-36-10 S →TS|T T →(S)|()P-36-11L1: G(S): S →AC A →aAb|ab C →cC|ε L2: G(S): S →AB A →aA|ε B →bBc|bc L3: G(S): S →AB A →aAb|ε B →aAb|ε L4: G(S): S →1S0|A A →0A1|ε或者:S →A|B A →0A1|ε B →1B0|A 第三章(1)Ei+i+iE +TE +TT F iF iF iEE +TT F iT *FF iii+i*i Ei-i-iE-TE -TT F iF iF i确定化:最小化:{0,1,2,3,4,5},{6}{0,1,2,3,4,5}0={1,3,5} {0,1,2,3,4,5}1={1,2,4,6} {0,1,2,3,4},{5},{6} {0,1,2,3,4}0={1,3,5} {0,1,2,3},{4},{5},{6}{0,1,2,3}0={1,3} {0,1,2,3}1={1,2,4} {0,1},{2,3},{4},{5},{6}{0,1}0={1} {0,1}1={1,2} {2,3}0={3} {2,3}1={4} {0},{1},{2,3},{4},{5},{6}P64-8(1)(0|1)*01(2)(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*(0|5)|(0|5)(3)0*1(0|10*1)* | 1*0(1|01*0)*P84-12(a)a最小化:{0,1} {2,3}{0,1}a={1},{0,1}b={2}{2,3}a={0,3},{2,3}={3}{0,1},{2},{3}a(b)已经确定化,只需最小化:{0,1},{2,3,4,5}{0,1}a = {1} {0,1}b = {2,4}{2,3,4,5}a = {1,3,0,5} {2,3,4,5}b = {2,3,4,5}又:{2,4}a = {1,0} {2,4}b = {3,5} {3,5}a={3,5} {3,5}b = {2,4} 分划为:{0,1},{2,4},{3,5}{0,1}a = {1} {0,1}b = {2,4}{2,4}a = {1,0} {2,4}b = {3,5}{3,5}a = {3,5} {3,5}b = {2,4}所以不能再分aP64-14正规式:(0|10)*还可以:然后再确定化,最小化,结果应该一样。
编译原理习题答案

编译原理习题答案1、正规文法又称DA、0型文法B、1型文法C、2型文法D、3型文法2、对于无二义性的文法,规范归约是BA.最左推导B.最右推导的逆过程C.最左归约的逆过程D.最右归约的逆过程。
3、扫描器的任务是从源程序中识别出一个个单词符号4、程序所需的数据空间在程序运行前就可确定,称为A管理技术。
A静态存储B动态存储C栈式存储D堆式存储5、编译过程中,语法分析器的任务是(B)。
①分析单词是怎样构成的②分析单词串是如何构成语句和说明的③分析语句和说明是如何构成程序的④分析程序的结构A、②③B、②③④C、①②③D、①②③④6、文法G:E→E+T|TT→T某P|PP→(E)|i则句型P+T+i的句柄和最左素短语分别为BA.指示器B.临时变量C.符号表D.程序变量8、程序语言的单词符号一般可以分为保留字、标识符、常数、运算符、界符等等。
9、下列B优化方法是针对循环优化进行的。
A.删除多余运算B.删除归纳变量C.合并已知量D.复写传播10、若文法G定义的语言是无限集,则文法必然是AA、递归的B、前后文无关的C、二义性的D、无二义性的11、文法G产生的D的全体是该文法描述的语言。
A、句型B、终结符集C、非终结符集D、句子12、Chomky定义的四种形式语言文法中,0型文法又称为A文法;1型文法又称为C文法。
A.短语文法B.上下文无关文法C.上下文有关文法D.正规文法A.短语文法B.上下文无关文法C.上下文有关文法D.正规文法13、语法分析最常用的两类方法是自顶向下和自底向上分析法。
14、一个确定的有穷自动机DFA是一个AA五元组(K,∑,f,S,Z)B四元组(VN,VT,P,S)C四元组(K,∑,f,S)D三元组(VN,VT,P)A、语法B、语义C、代码D、运行15、B不属于乔姆斯基观点分类的文法。
A、上下文无关文法B、算符优先文法C、上下文有关文法D、正规文法16、一个文法所描述的语言是A;描述一个语言的文法是BA.唯一的B.不唯一的C.可能唯一,可能不唯一A.唯一的B.不唯一的C.可能唯一,可能不唯一17、语法分析是依据语言的语法规则进行的,中间代码产生是依据语言的等价变换规则进行的。
《编译原理》作业参考答案

《编译原理》作业参考答案一、填空1.图二图一。
2.文法是无ε产生式,且任意两个终结符之间至多有一种优先关系的算符文法。
3.最右推导最右推导。
4.对于循环中的有些代码,如果它产生的结果在循环中是不变的,就把它提到循环外来。
把程序中执行时间较长的运算替换为执行时间较短的运算。
5.对于文法中的每个非终结符A的各个产生式的候选首符集两两不相交;对文法中的每个非终结符A,若它存在某个候选首符集包含ε,则FIRST(A)∩FOLLOW(A)= ø6.控制。
7.语义分析和中间代码产生8.自上而下自下而上自上而下9.自下而上表达式10.自下而上11.源程序单词符号12. DFA初态唯一,NFA初态不唯一;DFA弧标记为Σ上的元素,NFA弧标记为Σ*上的元素;DFA的函数为单射,NFA函数不是单射13.词法,词法分析器,子程序,语法14.ε,a,ab,ab15.终结符号,非终结符号,产生式16.L(G)={a n | n≥1}17.1型,2型,3型18.二义的19.快20.终态,输入字21.单词符号,终结符22.归约23.必须24.直接25.终结符,更快26.E→E+∙T, E→E∙+T, E→∙E+T, E→E+T∙27.归约—归约28.类型检查,一致性检查29.词法分析、词法30.语法分析程序、语法31。
终结符号、产生式、开始符号、非终结符32.2、2、333.不需要避开34.符合、不符合35.推导36.包括37.Ass38.一定没有、一定没有、至多只有一个39.SLR(1)40.移进——归约41.a.控制流检查、b.一致性检查、c.相关名字检查二、判断下面语法是否正确1 ×2 ×3 √4 ×5 √6 ×三、简答题1.词法分析的任务是对输入的源程序进行单词及其属性的识别,为下一步的语法分析进行铺垫;有两种方法可以实现词法分析器:一,手工编写词法分析程序。
二,由词法分析器自动生成程序生成。
编译原理作业与答案

编译原理独立作业2010.5一、简答题1、 构造一个文法使其生成的语言是不允许0打头的偶正整数集合。
2、文法][E G :T T E T E E -+→,F F T F T T /*→,i E F )(→,构造句型i T T T *+-的语法树,并指出该句型的短语、直接短语、句柄、素短语和最左素短语。
3、 某LL(1)文法的预测分析表如下,请在下述分析过程表中填入输入串( a , a )$ 的分析过程。
4、 文法][S G :R L S =→,R S →,R L *→,i L →,L R →,求增广文法中LR(1)项目集的初态项目集I 0。
5、文法][S G :G G S S ;→,()G G t H →,)(S a H →,求出各非终结符的FISTVT 和LASTVT 集合。
二、分析题:1、构造自动机,使得它能识别字母表{0,1}上以00结尾的符号串,将构造的自动机确定化,并写出相应的正规文法。
2、文法][S G :RT eT S → εDR T → εdR R → bd a D →,写出每个非终结符的FIRST 集和FOLLOW 集,并判断该文法是否为LL(1)文法。
3、若有文法][S G :AB S → εaBa A → εb A b B → (1)试证明该文法是SLR(1) 文法,并构造SLR(1)分析表。
(2)给出输入串aa # 的分析过程。
参考答案一、简答题1、构造一个文法使其生成的语言是不允许0打头的偶正整数集合。
8|6|4|2|ABC Z → 9|8|7|6|5|4|3|2|1→A ε|0|B AB B → |8|6|4|2|0→C2、文法][E G :T T E T E E -+→,F F T F T T /*→,i E F )(→,构造句型i T T T *+-的语法树,并指出该句型的短语、直接短语、句柄、素短语和最左素短语。
短语:T ,T-T ,i ,T*i ,T-T+T*i直接短语:T , i 句柄: T素短语(P72):T-T,i 最左素短语:T-T3 某LL(1)文法的预测分析表如下,请在下述分析过程表中填入输入串( a , a )$ 的分析过程。
编译原理习题参考答案
程序设计语言与编译——语言的设计与实现(第2版)习题4答案4-5 解:上下文有关文法(1型文法),产生的语言L(G){=a i b i c i | i≥1,i为整数} 4-6 解:3型文法,L(G)={a i | i≥1,i为奇数}4-7 解:2型文法,L(G)={a i b i | i≥1,i为整数}4-8 解:1型文法,L(G)={a i b i c i | i≥1,i为整数}4-9 解:1. 最左推导最右推导S⇒ (A) ⇒ (B) ⇒(SdB) S⇒ (A) ⇒ (B) ⇒ (SdB)⇒ ((A)dB) ⇒ ((B)dB) ⇒ (SdS) ⇒ (Sda)⇒ ((S)dB) ⇒ ((b)dB) ⇒ ((A)da ⇒ ((B)da)⇒ ((b)dS) ⇒ ((b)da) ⇒ ((s)da⇒ ((b)da)2. 语法树4-10解:1. 因为存在推导S ⇒ SbF ⇒ SbP ⇒ Sbc ⇒ Fbc ⇒ FaPbc所以FaPbc是文法G (S) 的一个句型。
2. 语法树4-11解:因为串aaabaa可有下列两棵不同的语法树所以文法G (S)是二义文法。
因为串i(*可有下列两棵不同的语法树9-2解:(1)消除文法G的②产生式直接左递归。
A→SeA' | fA' ③A'→dA' | ε④(2)消除间接左递归:按S.A排序,将S的①产生式代入③有A→AaeA' | AbeA' | ceA' | fA' ⑤(3)消除⑤的直接左递归有A→ceA'A" | fA'A" ⑥A"→aeA'A" | beA'A" | ε⑦(4)对S的①产生式提公因子有S→AB | c ⑧B→| a | b ⑨(5)最后,文法G提取公因子,消除左递归后的产生式由⑧, ⑨, ⑥, ⑦和④组成,无多余的产生式。
编译原理试题及答案
编译原理试题及答案
试题:
1. 解释编译原理的定义,同时给出编译器的作用。
2. 简要描述编译过程中的四个基本步骤。
3. 解释词法分析器的功能和作用。
4. 解释语法分析器的功能和作用。
答案:
1. 编译原理是研究如何将高级语言程序转化为等价机器语言程序的一门学科。
编译器是将高级语言文本转换成等价的机器语言的软件工具。
它负责将源代码转化为目标代码,以便计算机能够理解和执行。
2. (1) 词法分析:将源代码分解成一系列单词或标记。
(2) 语法分析:根据语法规则组织单词或标记形成语法树。
(3) 语义分析:分析语法树以检测语义错误。
(4) 代码生成:根据语法树生成目标代码。
3. 词法分析器的功能是将源代码分解成一系列单词或标记。
它将源代码读取为字符流,然后将这些字符组成单词,同时可以去除空格、注释等不具有实际意义的内容。
词法分析器的作用是为语法分析器提供正确的单词序列,为后续的语义分析和代
码生成步骤建立基础。
4. 语法分析器的功能是根据语法规则组织单词或标记形成语法树。
它通过构建语法树来分析源代码的语法结构,同时可以检测语法错误。
语法分析器的作用是为后续的语义分析和代码生成步骤提供一个结构化的表示形式,便于后续的处理和转换。
编译原理答案整理
1第2章 习题2-1 设有字母表A 1 ={a,b,c,…,z},A 2={0,1,={0,1,……,9},9},试回答下列问题:,试回答下列问题:,试回答下列问题:(1) 字母表A 1上长度为2的符号串有多少个?的符号串有多少个? (2) 集合A 1A 2含有多少个元素?含有多少个元素?(3) 列出集合A 1(A 1∪A 2)*中的全部长度不大于3的符号串。
的符号串。
2-2 试分别构造产生下列语言的文法:试分别构造产生下列语言的文法:试分别构造产生下列语言的文法: (1){a nb n|n≥0};|n≥0}; (2){a n b m c p |n,m,p≥0};|n,m,p≥0};(3){a n#b n|n≥0}∪|n≥0}∪{c {c n#d n|n≥0};|n≥0};(4){w#w r # | w ∈{0,1}*,w r 是w 的逆序排列的逆序排列 } }; (5)任何不是以0打头的所有奇整数所组成的集合;的集合;(6)所有由偶数个0和偶数个1所组成的符号串的集合。
号串的集合。
2-3 试描述由下列文法所产生的语言的特点:试描述由下列文法所产生的语言的特点: (1)S→10S0)S→10S0 S→aA S→aA A→bA A→bA A→a A→a (2)S→SS S→1A0S→1A0 A→1A0A→1A0A→ε (3)S→1A )S→1A S→B0S→B0 A→1A A→1A A→C A→C B→B0B→B0 B→C B→C C→1C0C→1C0C→ε(4)S→aSS )S→aSS S→a 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 的最右推导,并指出各步直接推导所得句型的句柄;指出句子的全部短语。
编译原理作业参考答案
编译原理作业参考答案作业一一、是非题1.(×)2.(×)3.(×)4.(×)5.(×)6.(√)7. (√)8.(√)9.(√) 10.(×) 11.(√) 12.(√) 13.(√)二、填空题1.(词法分析),(语法分析),(中间代码生成),(代码优化),(目标代码生成)2.(单词符号),(语法单位)。
3.(源程序),(单词符号)4.(语法),(语义)5. (词法分析)、(语法分析)、(语义分析),(中间代码产生),(代码优化),(目标代码生成)6.(解释方式)7. (语法规则)8. (上下文无关文法)9. (自上而下分析法),(自下而上分析法)10. (规范推导)11. (最左归约)三、名词解释题:1.词法分析器-----执行词法分析的程序。
2. 自编译方式------先对语言的核心部分构造一个小小的编译程序,再以它为工具构造一个能够编译更多语言成分的较大编译程序。
如此扩展下去,就像滚雪球一样,越滚越大,最后形成人们所期待的整个编译程序。
3. 遍-----所谓“遍”就是对源程序或中间结果长头到尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序。
4. 编译程序-----一种翻译程序: 能够把某一种语言程序(称为源语言程序)转换成另一种语言(成为目标程序),而后着与前者在逻辑上是等价的。
5. 超前搜索-----所谓超前搜索是在词法分析过程中,有时为了确定词性,需超前扫描若干个字符。
6. 短语------令G是一个文法,S划文法的开始符号,假定αβδ是文法G的一个句型,如果有SαAδ且Aβ,则称β是句型αβδ相对非终结符A的短语。
7. 规范句型------由规范推导所得到的句型。
8. 句柄------一个句型的最左直接短语。
9. -规范推导-----最右推导又称为规范推导。
四、简答题:1. 正规式a ( a | b )*。
2.(a*b|b*a)={a,b,ab,ba,aab,bba……}3.状态转换图是一张有限方向图。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《编译原理》第一次作业参考答案一、下列正则表达式定义了什么语言(用尽可能简短的自然语言描述)?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子串的所有二进制串.规律:构造语言L的补语言L’的DFA,可以先构造出接受L的DFA,再把这一DFA的接受状态改为非接受状态,非接受状态改为接受状态,就可以得到识别L’的DFA.说明:在上述两题中的D状态,无论输入什么符号,都不可能再到达接受状态,这样的状态称为“死状态”.在画DFA时,有时为了简明起见,“死状态”及其相应的弧(上图中的绿色部分)也可不画出.2.再证明:对任一正则表达式R,一定存在另一正则表达式R',使得L(R')是L(R)的补集.证明:根据正则表达式与DFA的等价性,一定存在识别语言L(R)的DFA. 设这一DFA为M,则将M的所有接受状态改为非接受状态,所有非接受状态改为接受状态,得到新的DFA M’. 易知M’识别语言L(R)的补集. 再由正则表达式与DFA的等价性知必存在正则表达式R’,使得L(R’)是L(R)的补集.三、设有一门小小语言仅含z、o、/(斜杠)3个符号,该语言中的一个注释由/o开始、以o/结束,并且注释禁止嵌套.1.请给出单个正则表达式,它仅与一个完整的注释匹配,除此之外不匹配任何其他串. 书写正则表达式时,要求仅使用最基本的正则表达式算子( ,|,*,+,?).参考答案一:/o(o*z|/)*o+/思路:基本思路是除了最后一个o/,在注释中不能出现o后面紧跟着/的情况;还有需要考虑的是最后一个o/之前也可以出现若干个o.参考答案二(梁晓聪、梁劲、梁伟斌等人提供):/o/*(z/*|o)*o/2.给出识别上述正则表达式所定义语言的确定有限自动机(DFA). 你可根据问题直接构造DFA,不必运用机械的算法从上一小题的正则表达式转换得到DFA.~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~《编译原理》第三次作业参考答案一、考虑以下DFA的状态迁移表,其中0,1为输入符号,A~H代表状态:其中A为初始状态,D为接受状态,请画出与此DFA等价的最小DFA,并在新的DFA状态中标明它对应的原DFA状态的子集.说明:有些同学没有画出状态H,因为无法从初始状态到达状态H. 从实用上讲,这是没有问题的. 不过,如果根据算法的步骤执行,最后是应该有状态H的.二、考虑所有含有3个状态(设为p,q,r)的DFA. 设只有r是接受状态. 至于哪一个状态是初始状态与本问题无关. 输入符号只有0和1. 这样的DFA总共有729种不同的状态迁移函数,因为对于每一状态和每一输入符号,可能迁移到3个状态中的一个,所以总共有3^6=729种可能. 在这729个DFA中,有多少个p和q是不可区分的(indistinguishable)?解释你的答案.解:考虑对于p和q,在输入符号为0时的情况,在这种情况下有5种可能使p和q无法区分:p和q在输入0时同时迁移到r(1种可能),或者p和q在输入0时,都迁移到p或q(4种可能).类似地,在输入符号为1时,也有5种可能使p和q无法区分.如果再考虑r的迁移,r的任何迁移对问题没有影响. 于是r在输入0和输入1时各有3种可能的迁移,总共有3*3=9种迁移.因此,总共有5*5*9=225个DFA,其中p和q是不可区分的.三、证明:所有仅含有字符a,且长度为素数的字符串组成的集合不是正则语言.证明:用反证法.假设含有素数个a的字符串组成的集合是正则语言,则必存在一个DFA接受这一语言,设此DFA为D. 由于D 的状态数有限,而素数有无限多个,所以必存在两个不同的素数p和q(设p<q),使得从D的初始状态出发,经过p个a和q个a后到达同一状态s,且s为接受状态. 由于DFA每一步的迁移都是确定的,所以从状态s 出发,经过(q-p)个a,只能到达状态s.考虑仅含有字母a,长度为p+p(q-p)的字符串T. T从初始状态出发,经过p个a到达状态s,再经过(q-p)个a仍然到达s;同样,经过p(q-p)个a后仍然到达s. 因此,从初始状态出发,经过p+p(q-p)个a后必然到达状态s. 由于p+p(q-p)=p(q-p+1)是合数,而s为接受状态,因而得出矛盾. 原命题得证.~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~《编译原理》第四次作业参考答案一、用上下文无关文法描述下列语言:1.定义在字母表∑={a, b}上,所有首字符和尾字符相同的非空字符串.S → aTa | bTb | a | bT → aT | bT | є说明:1. 用T来产生定义在字母表∑={a, b}上的任意字符串;2. 注意不要漏了单个a和单个b的情况.2.L={0i1j|i≤j≤2i且i≥0}.S → 0S1 | 0S11 | є3.定义在字母表∑={0, 1}上,所有含有相同个数的0和1的字符串(包括空串).S → 0S1 | 1S0 | SS | є思路:分两种情况考虑.1)如果首尾字母不同,那么这一字符串去掉首尾字母仍应该属于我们要定义的语言,因此有S → 0S1 | 1S0;2)如果首尾字母相同,那么这一字符串必定可以分成两部分,每一部分都属于我们要定义的语言,因此有S → SS.二、考虑以下文法:S → aABeA → Abc|bB → d1.用最左推导(leftmost derivation)推导出句子abbcde.S ==> aABe ==> aAbcBe ==> abbcBe ==> abbcde2.用最右推导(rightmost derivation)推导出句子abbcde.S ==> aABe ==> aAde ==> aAbcde ==> abbcde3.画出句子abbcde对应的分析树(parse tree).三、考虑以下文法:S → aSbS → aSS →1.这一文法产生什么语言(用自然语言描述)?所有n个a后紧接m个b,且n>=m的字符串.2.证明这一文法是二义的.对于输入串aab,有如下两棵不同的分析树3.写出一个新的文法,要求新文法无二义且和上述文法产生相同的语言.答案一:S → aSb | TT → aT | ε答案二:S → TS’T → aT | εS’→ aS’b | ε~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~《编译原理》第五次作业参考答案一、考虑以下文法:S → aTUV | bVT → U | UUU →ε | bVV →ε | cV写出每个非终端符号的FIRST集和FOLLOW集.FIRST(S)={a, b} FIRST(T)={є, b} FIRST(U)={ є, b} FIRST(V)={є, c}FOLLOW(S)={$} FOLLOW(T)={ b, c, $} FOLLOW(U)={ b, c, $} FOLLOW(V)={b, c , $}二、考虑以下文法:S → (L) | aL → L, S | S1.消除文法的左递归.S → (L) | aL → SL’L’→ ,SL’ | ε2.构造文法的LL(1)分析表.FIRST(S) = {‘(‘, ‘a’} FIRST(L) = {‘(‘, ‘a’} FIRST(L’) = {‘,’, ε}FOLLOW(S) = {‘$’, ‘,’, ‘)’} FOLLOW(L) = {‘)’ } FOLLOW(L’) = {‘)’}3.三、考虑以下文法:S → aSbS | bSaS | ε这一文法是否是LL(1)文法?给出理由.这一文法不是LL(1)文法,因为S有产生式S →ε,但FIRST(S) = {a, b, ε},FOLLOW(S) = {a, b},因而FIRST(S)∩FOLLOW(S)≠∅. 根据LL(1)文法的定义知这一文法不是LL(1)文法.~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~《编译原理》第六次作业参考答案一、考虑以下文法:(0) E’→ E(1) E → E+T(2) E → T(3) T → TF(4) T → F(5) F → F*(6) F → a(7) F → b1. 写出每个非终端符号的FIRST集和FOLLOW集.FIRST(E’)= FIRST(E)= FIRST(T)= FIRST(F)={a, b}FOLLOW(E’)={$} FOLLOW(E)={+, $} FOLLOW(T)={+, $, a, b} FOLLOW(F)= {+, *, $, a, b}2. 构造识别这一文法所有活前缀(viable prefixes)的LR(0) 自动机(参照课本4.6.2节图4.31).~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~《编译原理》第八次作业参考答案一、考虑以下语法制导定义(Syntax Directed Definition):对于输入串gbbabbccd构造带注释的分析树(annotated parse tree).最终答案:34二、以下文法定义了二进制浮点数常量的语法规则:S → L.L | LL → LB | BB → 0 | 1试给出一个S属性的语法制导定义,其作用是求出该二进制浮点数的十进制值,并存放在开始符号S相关联的一个综合属性value中。