2023年编译原理题库

上传人:枕*** 文档编号:166195057 上传时间:2022-10-31 格式:DOC 页数:35 大小:477.50KB
返回 下载 相关 举报
2023年编译原理题库_第1页
第1页 / 共35页
2023年编译原理题库_第2页
第2页 / 共35页
2023年编译原理题库_第3页
第3页 / 共35页
点击查看更多>>
资源描述
第一章 什么是编译器? 编译程序的结构分为几个阶段,各阶段的任务是什么? 遍、编译前端及编译后端的含义? 编译程序的生成方式有哪些?第二章 1. 写一文法,使其语言是偶正整数的集合。 规定:(1)允许0打头 (2)不允许0打头解:(1)允许0开头的偶正整数集合的文法 ENT|D TNT|D ND|1|3|5|7|9 D0|2|4|6|8(2)不允许0开头的偶正整数集合的文法 ENT|D TFT|G ND|1|3|5|7|9 D2|4|6|8 FN|0 GD|02.证明下述文法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 * a3. 给出生成下述语言的上下文无关文法: (1) anbnambm| n,m=0 (2) 1n0m1m0n| n,m=0解: (1) anbnambm| n,m=0 SAAAaAb| (2) 1n0m1m0n| n,m=0S1S0|AA0A1|第三章1、构造一个DFA,它接受=a, b上所有满足下述条件的字符串:字符串中的每个a都有至少一个b直接跟在其右边。解:已知=a, b,根据题意得出相应的的正规式为: (b*abb*)*根据正规式画出相应的DFA M,如下图所示用子集法将其拟定化XY(b*abb*)*XYb*abb*1eeXYb123456bbaeeeeeeIIaIbX,1,2,3,Y42,345,6,1,2,3,Y2,342,35,6,1,2,3,Y46,1,2,3,Y6,1,2,3,Y46,1,2,3,YIIaIb01213212314414由DFA得状态图 用最小化方法化简得:0,1,2,3,4,按顺序重新命名DFA M10243aaaabbbbb 0312aaabbb第四章练习1:文法GV: VN|NE EV|V+E Ni 是否为LL(1)文法,如不是,如何将其改导致LL(1)文法。解:LL(1)文法的基本条件是不含左递归和回溯(公共左因子),而GV中具有回溯,所以先消除回溯得到文法GV: GV: VNV V|E EVE E|+E Ni由LL(1)文法的充要条件可证GV是LL(1)文法练习2:有文法Gs: SBA ABS|d BaA|bS|c(1)证明文法G是LL(1)文法。(2)构造LL(1)分析表。(3)写出句子adccd的分析过程解:(1)一个LL(1)文法的充要条件是:对每一个非终结符A的任何两个不同产生式A|,有下面的条件成立: FIRST()FIRST()=; 若*, 则有FIRST()FOLLOW(A)=对于文法Gs: SBA ABS|d BaA|bS|c其FIRST集如下: FIRST(B)=a, b, c; FIRST(A)=a, b, c, d; FIRST(S)=a, b, c。其FOLLOW集如下:一方面, FOLLOW(S)=#;对SBA有: FIRST(A)加入FOLLOW(B), 即FOLLOW(B)=a, b, c, d ;对ABS有:FIRST(S)加入FOLLOW(B), 即FOLLOW(B)=a, b, c, d ;对BaA有:FOLLOW(B)加入FOLLOW(A), 即FOLLOW(A)=a, b, c, d ;对BbS有:FOLLOW(B)加入FOLLOW(S), 即FOLLOW(S)=#, a, b, c, d ;由ABS|d得: FIRST(BS) FIRST(d) = a, b, c d = ;由BaA|bS|c得: FIRST(aA) FIRST(bS) FIRST(c) =a b c= 。由于文法Gs不存在形如 的产生式,故无需求解形如FIRST()FOLLOW(A)的值。也即,文法GS是一个LL(1)文法。(2) 由Gs:SBA ABS|d BaA|bS|c的FIRST(B)=a, b, c; FOLLOW(B)=a, b, c, d ; FIRST(A)=a, b, c, d; FOLLOW(A)=a, b, c, d ;FIRST(S)=a, b, c。 FOLLOW(S)=#, a, b, c, d 可构造LL(1)预测分析表如下:abcd#SSBASBASBAAABSABSABSAdBBaABbSBcSSBASBASBAAABSABSABSAdBBaABbSBc(3)在分析表的控制下,句子adccd的分析过程如下:第五章1 已知文法GS为:Sa|(T) TT,S|S (1) 计算GS的FIRSTVT和LASTVT。(2) 构造GS的算符优先关系表并说明GS是否为算符优先文法。(3) 给出输入串 (a,(a,a)#的算符优先分析过程。解:文法:Sa|(T) TT,S|S 展开为: SaSS(T) TT,S TS(1) FIRSTVT - LASTVT表 非终结符 FIRSTVT集 LASTVT集 S a ( a ) T a ( , a ) , (2)算符优先关系表如下: 表中无多重入口所以是算符优先(OPG)文法。 a (),#a(),# (3) 输入串(a,(a,a))# 的算符优先分析过程为:栈 当前字符 剩余输入串动作 #(#(a#(N#(N,#(N,(#(N,(a#(N,(N#(N,(N,#(N,(N,a#(N,(N,N#(N,(N#(N,(N)#(N,N#(N#(N)#N(a,(a,a)# a,(a,a)#,(a,a)#(a,a)#(a,a)#a,a)#,a)#a)#a)#)#)#)#)#Move inMove inReduce: SaMove inMove inMove inReduce: SaMove inMove inReduce: SaReduce: TT,SMove inReduce: S(T)Reduce: TT,SMove inReduce: S(T) 第六章例1:有文法: S(L)|a LL,S|S 给此文法配上语义动作子程序(或者说为此文法写一个语法制导定义),它输出配对括号的个数。如对于句子(a,(a,a),输出是2。解:加入新开始符号S和产生式SS,设num 为综合属性,代表值属性,则语法制导定义如下: 产生式 语义规则 SS print(S.num) S(L) S.num:=L.num+1 Sa S.num:=0 LL1,S L.num:=L1.num+S.num LS L.num:=S.num例2:构造属性文法,能对下面的文法,只运用综合属性获得类型信息。 D L,id | L L T id T int | real解:属性文法(语法制导)定义: 产生式 语义规则 D L,id D.type:=L.type addtype(id.entry,L.type) D L D.type:=L.type L T id L.type:=T.type addtype(id.entry,T.type) T int T.type:=integer T real T.type:=real第七章例1:给出下面表达式的逆波兰表达(后缀式):(1) a*(-b+c)(2) if(x+y)*z=0 then s:=(a+b)*c else s:=a*b*c解:(1) ab-c+*(2) xy+z*0=sab+c*:=sab*c*:=¥(注:¥表达if-then-else 运算)例2:请将表达式-(a+b)*(c+d)-(a+b)分别表达成三元式、间接三元式和四元式序列。解: 三元式 间接三元式 (1) (+ a, b) 间接三元式序列 间接码表 (2) (+ c, d) (1) (+ a, b)(1) (3) (* (1), (2) (2) (+ c, d)(2) (4) (- (3), /) (3) (* (1), (2) (3) (5) (+ a, b) (4) (- (3), /) (4) (6) (- (4), (5) (5) (- (4), (1) (1) (5) 四元式 (1) (+, a, b, t1) (2) (+, c, d, t2) (3) (*, t1, t2, t3) (4) (-, t3, /, t4) (5) (+, a, b, t5) (6) (-, t4, t5, t6) 例3:请将下列语句 while (AD) then X:=Y+Z 翻译成四元式解:假定翻译的四元式序列从(100)开始:(100) if AD goto(104)(103) goto (100)(104) T=Y+Z(105) X=T(106) goto (100)(107)例4:写出for 语句的翻译方案解:产生式 动作S for E do S1 S.begin := newlabel S.first := newtemp S.last := newtemp S.curr:= newtemp S.code:=gen(S.first “:=” E.init) |gen(S.last “:=” E.final) |gen(“if” S.first “” S.last “goto” S.next) |gen(S.curr “:=” S.first) |gen(S.begin “:” ) |gen(“if ” S.curr “” S.Last “goto” S.next) |S1.code |gen(S.curr := succ(S.curr) |gen(“goto” S.begin)E v:=initial to final E.init := initial.place E.final := final.place第八章例1:C语言中规定变量标记符的定义可分为extern, extern static, auto, local static和register五种存储类:(1) 对五种存储类所定义的每种变量,分别说明其作用域。(2) 试给出适合上述存储类变量的内存分派方式。(3) 符号表中登记的存储类属性,在编译过程中支持什么样的语义检查。解:(1) extern 定义的变量,其作用域是整个C 语言程序。 extern static 定义的变量,其作用域是该定义所在的C 程序文献。 auto 定义的变量,其作用域是该定义所在的例程。 local static 定义的变量,其作用域是该定义所在的例程。且在退出该例程时,该变量的值仍保存。 register 定义的变量,其作用域与auto 定义的变量同样。这种变量的值,在寄存器有条件时,可存放在寄存器中,以提高运营效率。(2) 对extern 变量,设立一个全局的静态公共区进行分派。 对extern static 变量,为每个C 程序文献,分别设立一个局部静态公共区进行分派。 对auto 和register 变量,设定它们在该例程的动态区中的相对区头的位移量。而例程动态区在运营时再做动态分派。 对local static 变量,为每个具有这类定义的例程,分别设立一个内部静态区进行分派。(3) 实行标记符变量反复定义合法性检查,及引用变量的作用域范围的合法性检查。第九章例1:下面的程序执行时,输出的a分别是什么?若参数的传递办法分别为(1)传名;(2)传地址;(3)得结果;4)传值。 program main (input,output);procedure p(x,y,z); beginy=y+1; z=z+x;end; begina=2; b=3; p(a+b,a,a); print a end. 解:(1) 参数的传递办法为“传名”时,a 为 9。(2) 参数的传递办法为“传地址”,a 为 8。(3) 参数的传递办法为“得结果”,a 为 7。(4) 参数的传递办法为“传值”,a 为 2。 例2:过程参数的传递方式有几种?简述“传地址”和“传值”的实现原理。解:参数的传递方式有下述几种:传值,传地址,传名,得结果“传值”方式,这是最简朴的参数传递方法。即将实参计算出它的值,然后把它传给被调过程。具体来讲是这样的:1.形式参数当作过程的局部变量解决,即在被调过程的活动记录中开辟了形参的存储空间,这些存储位置即是我们所说的实参或形式单元。2.调用过程计算实参的值,并将它们的右值(r-value)放在为形式单元开辟的空间中。3.被调用过程执行时,就像使用局部变量同样使用这些形式单元。“传地址”方式,也称作传地址,或引用调用。调用过程传给被调过程的是指针,指向实参存储位置的指针。1.如实参是一个名字或是具有左值的表达式,则左值自身传递过去。2.如实参是一个表达式,比方a+b或2,而没有左值,则表达式先求值,并存入某一位置,然后该位置的地址传递过去。3.被调过程中对形式参数的任何引用和赋值都通过传递到被调过程的指针被解决成间接访问。例3:下面是一个Pascal程序program PP(input,output)var K:integer;function F(N:integer):integerbeginif N =0 then F:=1else F:=N * F(N-1);end;begin K:=F(10);.end;当第二次(递归地)进入F后,DISPLAY的内容是什么?当时整个运营栈的内容是什么?解:第十章例1:何谓代码优化?进行优化所需要的基础是什么?解:对代码进行等价变换,使得变换后的代码运营结果与变换前代码运营结果相同,而运营速度加快或占用存储空间减少,或两者都有。优化所需要的基础是在中间代码生成之后或目的代码生成之后。例2:编译过程中可进行的优化如何分类?最常用的代码优化技术有哪些?解:依据优化所涉及的程序范围,可以分为:局部优化、循环优化和全局优化。最常用的代码优化技术有1. 删除多余运算2. 代码外提3. 强度削弱4. 变换循环控制条件5. 合并已知量与复写传播6. 删除无用赋值例3:试对以下基本块B2:B:=3 D:=A+CE:=A*C F:=D+EG:=B*F H:=A+CI:=A*C J:=H+IK:=B*5 L:=K+JM:=L应用DAG 对它们进行优化,并就以下两种情况分别写出优化后的四元式序列:(1)假设只有G、L、M 在基本块后面还要被引用。(2)假设只有L 在基本块后面还要被引用。解:基本块相应的DAG 如下:B:=3 D:=A+CE:=A*C F:=D+EG:=B*F H:=A+CI:=A*C J:=H+IK:=B*5 L:=K+JM:=L例1 一个编译程序的代码生成要着重考虑哪些问题?解:代码生成器的设计要着重考虑目的代码的质量问题,而衡量目的代码的质量重要从占用空间和执行效率两个方面综合考虑。课后习题答案:P36-6(1)是09组成的数字串(2)最左推导:最右推导:P36-8文法:最左推导:最右推导:语法树:/*P36-9句子iiiei有两个语法树:P647(1)XY X1234Y5 0 1 1 0 1 1拟定化:01X1,2,31,2,32,32,3,42,32,32,3,42,3,42,3,52,3,42,3,52,32,3,4,Y2,3,4,Y2,3,52,3,4 0320 1 01 0 0 1 1 0654 0 1 0 1 1 1最小化: 002 1 1 0 0 1 0543 0 1 0 1 1 1P6412(a) a10 a,b a拟定化:ab00,110,10,1110给状态编号:ab012112203333 a10 a a b b b32 b a最小化: a a210 b b a b(b)032 b b a a b a a b541 b a a a已经拟定化了,进行最小化最小化:021 b b a a b aP811(1) 按照T,S的顺序消除左递归递归子程序:procedure S;beginif sym=a or sym= then abvanceelse if sym=( then beginadvance;T;if sym=) then advance;else error; endelse errorend;procedure T;beginS;end;procedure ;beginif sym=, then beginadvance;S;endend;其中:sym:是输入串指针IP所指的符号 advance:是把IP调至下一个输入符号error:是犯错诊察程序(2)FIRST(S)=a,(FIRST(T)=a,(FIRST()=,FOLLOW(S)=),#FOLLOW(T)=)FOLLOW()=)预测分析表a(),#ST是LL(1)文法P812文法:(1)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,+,),#(2)考虑下列产生式: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)文法.(3)+*()ab#EETTFFP(4)procedure E;beginif sym=( or sym=a or sym=b or sym= then begin T; E end else errorendprocedure E;beginif sym=+ then begin advance; E end else if sym) and sym# then errorendprocedure T;beginif sym=( or sym=a or sym=b or sym= then begin F; T end else errorendprocedure T;beginif sym=( or sym=a or sym=b or sym= then T else if sym=* then errorendprocedure F;beginif sym=( or sym=a or sym=b or sym= then begin P; F end else errorendprocedure F;beginif sym=* then begin advance; F endendprocedure P;beginif sym=a or sym=b or sym= then advance else if sym=( thenbeginadvance; E;if sym=) then advance else errorendelse errorend;P1331短语: E+T*F, T*F,直接短语: T*F句柄: T*FP1332文法:(1)最左推导:最右推导:(2)(a,a),(a),a)(S,a),(a),a)(T,a),(a),a)(T,S),(a),a)(T),(a),a)(S,(a),a)(T,(a),a)(T,S,(a),a)(T,(a),a)(T,(S),a)(T,(T),a)(T,S),a)(T),a)(S,a)(T,S)(T)S“移进-归约”过程:环节栈输入串动作0#(a,a),(a),a)# 预备1#(a,a),(a),a)# 进2#(a,a),(a),a)#进3#(a,a),(a),a)#进4#(a,a),(a),a)#进5#(S,a),(a),a)#归6#(T,a),(a),a)#归7#(T,a),(a),a)#进8#(T,a),(a),a)#进9#(T,S),(a),a)#归10#(T),(a),a)#归11#(T),(a),a)#进12#(S,(a),a)#归13#(T,(a),a)#归14#(T,(a),a)#进15#(T,(a),a)#进16#(T,S,(a),a)#归17#(T,(a),a)#归18#(T,(a),a)#进19#(T,(a),a)#进20#(T,(a),a)#进21#(T,(S),a)#归22#(T,(T),a)#归23#(T,(T),a)#进24#(T,S),a)#归25#(T),a)#归26#(T),a)#进27#(S,a)#归28#(T,a)#归29#(T,a)#进30#(T,a)#进31#(T,S)#归32#(T)#归33#(T)#进34#S#归P1333(1) FIRSTVT(S)=a,(FIRSTVT(T)=,a,(LASTVT(S)=a,)LASTVT(T)=,a,)(2)a(),a(=,是算符文法,并且是算符优先文法(3)优先函数a(),f44244g55523 (4) 栈输入字符串动作#(a,(a,a))#预备#(a, (a,a)#进#(a, (a,a)#进#(s, (a,a)#归#(t, (a,a)#归#(t,(a,a))#进#(t,(a,a)#进#(t,(a,a)#进#(t,(s,a)#归#(t,(t,a)#归#(t,(t,a)#进#(t,(t,a)#进#(t,(t,s)#归#(t,(t)#归#(t,(t)#进#(t,s)#归#(t)#归#(t)#进# s#归P1641 答:表达式(4*7+1)*2的附注语法树如下图:digit.lexval=2F.val=2E.val=58ndigit.lexval=4digit.lexval=7digit.lexval=1F.val=4F.val=7F.val=1T.val=4*T.val=28E.val=28+T.val=1E.val=1E.val=29()F.val=29T.val=29T.val=58*LP1642答:(1)ab+(2)ab+P16511答:(1)Did LD.type:= L.type;addtype(id.type,L.type)L, id L1L.type:= L1.type;addtype(id.type,L1.type)L : TL.type:= T.typeTinteger T.type := integerT real T.type := realP2171a*(-b+c)abc+*a+b*(c+d/e)abcde/+*+-a+b*(-c+d)abcd+*+A (C or not D)A not C Dnot or not or(A and B) or (not C or D)A B and C not D or or (A or B) and (C or not D and E)A B or C D not E and or and if (x+y)*z =0 then (a+b)c else abcxy+z*0= ab+cabc ¥或 xy+z*0= P1 jez ab+c P2 jump abc P1 P2P2173-(a+b)*(c+d)-(a+b+c)的三元式序列:(1) +, a, b(2) , (1), -(3) +, c, d(4) *, (2), (3)(5) +, a, b(6) +, (5), c(7) -, (4), (6)间接三元式序列:三元式表:(1) +, a, b(2) , (1), -(3) +, c, d(4) *, (2), (3)(5) +, (1), c(6) -, (4), (5)间接码表:(1)(2)(3)(4)(1)(5)(6)四元式序列:(1) +, a, b, (2) , , -, (3) +, c, d, (4) *, , , (5) +, a, b, (6) +, , c, (7) -, , , P2187100. (j, A, C, 102)101. (j, -, -, 0)102. (j, B, D, 104)103. (j, -, -, 101)104. (j=, A, 1, 106)105. (j, -, -, 109)106. (+, C, 1, T1)107. (:=, T1, -, C)108. (j, -, -, 100)109. (j, A, D, 111)110. (j, -, -, 100)111. (+, A, 2, T2)112. (:=, T2, -, A)113. (j, -, -, 109)114. (j, -, - 100)P2709(1) 9 (2) 8 (3) 7 (4) 2P 3061:read CA:=0B:=1L1: A:=A+B if BC goto L2B:=B+1goto L1L2: write A halt read C A:=0 B1 B1 B:=1-L1: A:=A+B if BC goto L2 B2- B2 B:=B+1 goto L1 B3 -L2: write A halt B4 B3 基本块为B1 、B2 、B3 、B4 程序流图如右: B4 P 3062: read A,BB1B2B5B4B3 F:=1 C:=A*A B1 D:=B*B if C100 goto L2- halt B4-L2: F:=F-1 goto L1 B5-基本块为B1、B2、B3、B4、B5程序流图如右: P307-4I:=1read J,KL: A:=K*I B:=J*I C:=A*B write C I:=I+1 if I100 goto LhaltB1 B2B3I:=1read J,KL: C:=A*B write C A:=A+K B:=B+J if AR goto LhaltA:=K*IB:=J*IR:=K*100B2构成一个循环。进行循环优化后,得到: B1 B2B2 B3
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 幼儿教育


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!