您好,欢迎来到爱问旅游网。
搜索
您的当前位置:首页2001级编译原理试题(A)

2001级编译原理试题(A)

来源:爱问旅游网
2001级编译原理试题(A)

2003.12

一 简答题(60分)

1. 编译程序按功能分为哪几个阶段?各个阶段的主要功能?

六个阶段: 词法分析,语法分析,语义分析,中间代码生成,中间代码优化和目标代码生成。 各阶段的主要功能:

词法分析: 检查词法错误并把源程序中的单词转换成一种内部形式(数据形式); 语法分析: 检查源程序的语法错误,当发现错误时输出一些信息,并尽可能的继续检查; 中间代码生成: 生成源程序的一种便于优化和便于产生目标代码的内部表示; 中间代码优化: 进行不依赖于目标机的优化,以产生高质量目标代码; 目标代码生成: 根据目标机特点从中间代码产生高质量目标代码。 2. 实现高级语言程序的途径有哪几种?它们之间的区别?

途径有两种: 解释器和编译器;解释器是源程序的一个执行系统,而编译器是源程序的一

个转换系统;解释器直接由源程序得到运行结果,而编译器是生成等价于源程序的某种目标机程序。

3. 给出描述非0数字作为开始符的奇数字符串的正则表达式或正则式。 S  Head Body Tail | Tail Head  1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 Body  Body D | D

D  0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | λ Tail  1 | 3 | 5 | 7 | 9

4. 判断字符串anbn(n >0)是否可用确定自动机识别?如果能,则画出自动机,否则说明原因

anbn ( n>0 )不能用确定自动机识别,因为确定自动机只有有限个状态,而a,b的个数是不定

的(也可以是无限的),而要识别的话需要每扫描一个a或b都要产生一个新的状态,所以 无法识别。

5. 对如下文法:

G[S] : S  a b S | a a B | a d

B  b b B | b

分别给出句子abaabbb和ad的句柄 句子ad的语法分析树为:

S a d

句子abaabbb的语法分析树为:

S a b S a b B b B a b 所以句子abaabbb的句柄是b;句子ad的句柄是ad . 6. 有如下文法,给出每个产生式的Predict集。 P S E

 begin S end  id := E ; S |   n | id

Follow( S ) ={ end }

Predict( P begin S end ) = { begin } Predict( S id := E ; S ) = { id } Predict ( S  ) = { end } Predict ( E n ) = { n } Predict ( E id )= { id } 7. 什么是可规约活前缀?举一例说明。

若活前缀是含句柄的活前缀,即有α =α′π ,且π是句柄,则活前缀α为可归约活前缀。 例S  a | b C d C e

则be为一个可归约活前缀

8. 通过合并LR(1)文法中的同心状态得到的LALR(1)文法可能会产生哪些冲突?一定不会产生

哪些冲突?

可能引入归约—归约冲突,不会产生移入—归约冲突。

9. 设对偶表(L,N)分别表示程序在当前位置的层数和偏移量,确定下面程序段中括号部分的内

容。假设系统规定整型(int)变量占1个单元,实型(real)变量占2个单元。 (L, N) Type at = array of [1..10] of int; () var x :real;

() function f ( ( ?,M) var a: at,

() b: at,

() var x: real ) : int

① ( L , N ) ② ( L , N+2 ) ③ ( L+1 , M+1 ) ④ ( L+1,M+11) 10. 给出活动记录空间结构?并给出各部分的存储对象? 活动记录的空间结构:

临时变量区 局部变量区 形参变量区 返回值 全局变量环境 机器状态 过程层数 返回地址 动态链指针

11. 有如下文法:

G[S]:

S  ( L ) | a L  S P P  , S P | 

全局变量信息 机器状态信息 本层变量和返回值 控制状态信息 给出该文法的动作文法打印每个a的嵌套深度。例如(a,(a),(a))打印1,2,2。 动作文法:

G: S  <#init> ( L ) | a L  S P P  S P |  : i :=0;

: i := i+1; : i := i -1; : print(“%d”,i); 12. 文法可分为几类;各举一例。

文法分为四类:0型(短语文法),1型(上下文有关),2型(上下文无关),3型(正则)文法。 0型:S abC | c, bCd; 1型:S abC , bC ad; 2型:S abC, Cbd; 3型:S a | bC , Cd;

13. Display表的作用?

Display表用来表示变量访问环境,对于每一个AR,求出其变量访问环境,并把它以地址表的形式(Display表)保存在AR中,这样通过查询Display表就可以找到变量。

14. 如下是当前执行某个过程时的活动记录,设变量x的层数和偏移量分别为L和Off,说明如何

访问变量x。

sp ... ... ... .... 局部Display表 D sp

Addr(x) = [sp+D+L]+Off

15. 当实参为变量,形参分别为变参和值参时,传参的区别。

形参为变参时,AR中保存实参变量的地址,改变形参即改变实参变量;

形参为值参时,AR中保存形参变量,其初始值为实参的值,此后形参与实参没有联系。 二、(10分)说明如下文法是否是LL(1)文法,若不是,将其转换为LL(1)文法。最后给出该

文法的LL(1)分析表。 G[A]:

A  B e B  B b | a

文法中有左递归,不是LL(1)文法。 转换为 G′ : A B e B a B′ B′b B′ | λ

Predict(A B e) ={ a } Predict(B a B′) ={ a } Predict(B′b B′) ={ b } Predict(B′λ ) ={ e } A B B′

a  B e  a B′ b  b B′ e λ LL(1)分析表:

三、(15分)判断如下文法是否是LR(1)文法,若不是,说明理由,是则画出它的LR状态图,并给

出它的LR(1)分析表。 G[S]:

S  a | b | (T) T  TeS | S

是LR(1)文法,状态图如下:

(1): S  a (4): TTeS

(2): S b (5):TS

(3): S(T) LR(1)分析表:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 a S2 S6 S6 S6 b S3 S7 S7 S7 e R5 R1 R2 S11 S11 R3 R4 ( S4 S8 S8 S8 ) R5 R1 R2 S13 S12 R3 R4 S 1 5 5 14 T 10 9 # Acc R1 R2 R3 14

四、(15分)给出如下程序段的中间代码,并将其优化为最简代码形式。(中间代码的操作符可用自身代替)。其中A:Array of [1..10] of Array [1..10] of integer,整型变量占1个存储单元。

z := 3;

while j< 10 do begin

j := x +1; x := x+1 ; m: = x+1;

if x <10 then y:= A[i][j]+m else y:= A[i][j]-m n := z + 10; end 中间代码:

(1) (: = , 3 , z ) (2) ( LABLE,L1) (3) ( LT, j , 10 , t1)

(4) (JUMP0,L2) (5) ( + , x , 1 ,t2 ) (6) ( : = , t2 , j ) (7) ( + , x , 1 ,t3 ) (8) ( : = , t3 , x ) (9) ( + , x , 1 , t4 ) (10) ( : = , t4 ,m ) (11) ( LT , x ,10 , t5) (12) ( JUMP0, L3) (13) ( - , i ,1 , t6 ) (14) ( * , t6, 10 , t7) (15) ( - , j , 1 ,t8) (16) ( + , t7 , t8 ,t9) (17) (* , t9 , 1, t10) (18) ( [], A ,t10 , t11) (19) (+, t11,m ,t12) (20) ( : = , t12 , y ) (21) (JUMP, L4) (22) (LABLE, L3) (23) ( - , i , 1 ,t13 ) (24) ( * ,t13 ,10 , t14 ) (25) ( - , j , 1 , t15 ) (26) ( + , t14 , t15 , t16) (27) (* , t16 , 1 ,t17 ) (28) ( [], A , t17 , t18 ) (29) ( - , t18 , m ,t19 ) (30) (LABLE , L4) (31) ( + , z , 10, t20 ) (32) ( : = , t20, n) (33) ( JUMP, L1 ) (34) ( LABLE, L2 )

优化后的中间代码:

(1) (: = , 3 , z ) (2) ( LABLE,L1) (3) ( LT, j , 10 , t1) (4) (JUMP0,L2) (5) ( + , x , 1 ,t2 ) (6) ( : = , t2 , j )

(7) ( : = , t2 , x ) (8) ( + , x , 1 , t3 ) (9) ( : = , t3 ,m ) (10) ( - , i ,1 , t4 ) (11) ( * , t4 , 10 , t5) (12) ( - , j , 1 ,t6) (13) ( + , t5 , t6, t7 ) (14) (* , t7 , 1, t8 ) (15) ( [], A ,t8 , t9 ) (16) ( LT , x ,10 , t10) (17) ( JUMP0, L3) (18) (+, t9,m ,t11 ) (19) ( : = , t11 , y ) (20) (JUMP, L4) (21) (LABLE, L3) (22) ( - , t9 , m ,t12 ) (23) ( LABLE , L4 ) (24) ( + ,z , 10 ,t13) (25) ( : = , t13 , n) (26) ( JUMP, L1 ) (27) ( LABLE, L2 )

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- awee.cn 版权所有 湘ICP备2023022495号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务