可以修改高级语言的程序。BASIC语言就是解释型高级语言。编译型编译程序将 级语言编写的程序,一次就会部翻译成机器语言表示的程序,而且过程进行很快, 在过程中,不能进行人机对话修改。FORTRAN语言就是编译型高级语言。 2.编译程序的工作分为那几个阶段?
词法分析、语法分析和语义分析是对源程序进行的分析(称为编译程序的前端), 而中间代码生成、代码优化和代码生成三个阶段合称为对源程序进行综合(称为 编译程序的后端),它们从源程序的中间表示建立起和源程序等价的目标程序。 3.简述自下而上的分析方法。
所谓自下而上分析法就是从输入串开始,逐步进行“归约”,直至归约到文法的 开始符号;或者说从语法树的末端开始,步步向上“归约”,直到根节点。 4.简述代码优化的目的和意义。
代码优化是尽量生成“好”的代码的编译阶段。也就是要对程序代码进行 一种等价变换,在保证变换前后代码执行结果相同的前提下,尽量使目 标程序运行时所需要的时间短,同时所占用的存储空间少。
五、综合应用题(共3小题,每小题10分,共30分)
1.证明下述文法G:
S?aSbS|aS|d
是二义性文法。 解:
一个文法,如果存在某个句子有不只一棵语法分析树与之对应,那么称这个 文法是二义性文法。
句子aadbd有两棵语法树。如下图:
由此可知,S?aSbS|aS|d定义的文法是二义性文法。 2.对于文法G[S]:S?AB,A?Aa|bB,B?a|Sb求句型baSb的全部短语、直接短语和句柄? 句型baSb的语法树如图五(2)所示。
b
A S
B a S d
d a S d
b a
S b S S a S S S d
(1) (2) B S b
a
图五(2) 句型baSb的的语法树
解:
baSb为句型baSb的相对于S的短语,ba为句型baSb的相对于A的短语,Sb为句型baSb的相对于B的短语,且为直接短语,a为句型baSb的相对于B的短语,且为直接短语和句柄。
3.设有非确定的有自限动机NFA M=({A,B,C},{0,1},?,{A},{C}),其中: ? (A,0)={C} ? (A,1)={A,B} ? (B,1)={C} ? (C,1)={C}。请画出状态转换距阵和状态转换图。 解:
状态转换距阵为:
? A B C
状态转换图为:
1 1 AB0 C ? ? 1 A,B C C 1 1 C10 2001年编译原理试题
1.(10分)处于/* 和 */之间的串构成注解,注解中间没有*/。画出接受这种
注解的DFA的状态转换图。 2.(10分)为语言
L = {ambn | 0 ? m ? 2n}(即a的个数不超过b的个数的两倍)
写一个LR(1)文法,不准超过6个产生式。(若超过6个产生式,不给分。若所写文法不是LR(1)文法,最多给5分。) 3.(10分)构造下面文法的LL(1)分析表。 D ? TL
T ? int | real L ? id R
R ? , id R | ? 4.(15分)就下面文法 S ? ( L) | a L ? L ? S | S ? 给出一个语法制导定义,它输出配对括号的个数。 ? 给出一个翻译方案,它输出每个a的嵌套深度。 如句子(a, (a, a) ),第一小题的输出是2,第二小题的输出是1 2 2。 5.(10分)Pascal语言for语句的含义见教材第222页习题7.13。请为该语句设计一种合理的中间代码结构。你可以按第215页图7.17的方式或者第219页图7.19的方式写出你的设计,不需要写产生中间代码的语法制导定义。 6.(5分)一个C语言程序如下:
func(i1,i2,i3) long i1,i2,i3; {
long j1,j2,j3;
printf(\ printf(\}
main() {
long i1,i2,i3; func(i1,i2,i3); }
该程序在某种机器的Linux上的运行结果如下:
Addresses of i1,i2,i3 = 27777775460,27777775464,27777775470 Addresses of j1,j2,j3 = 27777775444,27777775440,27777775434
从上面的结果可以看出,func 函数的3个形式参数的地址依次升高,而3个局部变量的地址依次降低。试说明为什么会有这个区别。
7.(15分)一个C语言程序及其在某种机器linux操作系统上的编译结果如下。根据所生成的汇编程序来解释程序中四个变量的作用域、生存期和置初值方式等方面的区别。
static long aa = 10; short bb = 20;
func() {
static long cc = 30; short dd = 40; }
.file \ .version \gcc2_compiled.: .data
.align 4
.type aa,@object .size aa,4 aa:
.long 10 .globl bb .align 2
.type bb,@object .size bb,2 bb:
.value 20 .align 4
.type cc.2,@object .size cc.2,4 cc.2:
.long 30 .text
.align 4 .globl func
.type func,@function func:
pushl ?p
movl %esp,?p subl $4,%esp
movw $40,-2(?p)