编译原理之路(一)第一章典型习题解答
第一章没啥好讲,就做几道典型题好了……(参考了网上的一些资料,不保证绝对正确)
1.1部分
1.编译器和解释器之间的区别是什么?
编译器 | 解释器 | |
实现机理 | 将程序翻译成一种能够被计算机执行的形式 | 利用用户提供的输入执行源程序中指定的操作 |
实现路径 | 源程序->编译器->目标程序 | 源程序+输入)->解释器->输出 |
特点 | 读取整个程序,再翻译 | 逐字逐句执行 |
2.编译器相对于解释器的优点是什么?
编译器编译一个程序往往更快
解释器由于逐字逐句执行,所以错误诊断效果往往更好
3.在一个语言处理系统中,编译器产生汇编语言而不是机器语言的好处是什么?
汇编语言好处:容易输出和调试
如果高级语言出错,没有汇编语言,你将不知道哪一个变量到哪一个寄存器,哪一个栈溢出……,除非你能看懂机器语言
4.把一种高级语言翻译成为另一种高级语言称为源到源的翻译器,编译器使用C语言作为目标语言有什么好处?
C语言是最接近汇编语言的高级语言,可以很方便的控制包括寄存器在内的几乎所有硬件,所以选他作为目标语言
1.6部分
1.指出赋给w,x,y,z的值
int w, x, y, z;
int i = 4; int j = 5;
{
int j = 7; //重新声明,这是局部j
i = 6; //没有重新声明,这个i就是全局的i
w = i + j; // 6+7
}
x = i + j; //6+5
{
int i = 8; //局部i
y = i + j; //8+5
}
z = i + j; //6+5
答案:解析在代码中
w :13
x :11
y :13
z :11
3.给出声明的作用域
4下面C代码打印的结果是什么?
打印结果:3,2
b()中,x=x+1=2+1=3
c()中,a=x+1=1+1=2
3.1部分
1.C++程序哪些词素应该有相关联的词法值
<float> <id,"limitedSquare"> <(> <id,"x"> <)> <{>
<float> <id,"x"> <;>
<return> <(> <id,x> <<=> <num,10.0> <||> <id,x> <>=> <num,10.0>
<?> <num,100> <:> <id,"x"> <*> <id,"x"> <;>
<}>
2.HTML程序哪些词素应该具有相关联的词法值
<text,"Here is a photo of"><nodestart,b><text,"myHouse"><nodeend,b>
<nodestart,p>
<selfendnode,img><selfendnode,br>
<text,"See">
<nodestart,a>
<text,"MorePictures">
<nodeend,a>
<text,"if you liked that one.">
<endstart,p>
3.3部分
2.描述正则表达式的语言
a(a|b)*a | 以a做开头和结尾,中间可以有任意个a或者b的串 |
(( <math> <semantics> <mrow> <mi> ϵ </mi> </mrow> <annotation encoding="application/x-tex"> \epsilon </annotation> </semantics> </math>ϵ|a)b*)* | 任意个a或b组成的串 |
(a|b)*a(a|b)(a|b) | 倒数第三个字符为a的任意个a或b组成的串 |
a*ba*ba*ba* | 包含3个b的任意个a组成的串 |
(aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)* )* | 由2m个a和2n个b组成的串m>=0,n>=0 |
5.写出下列语言的正则定义(1-3,8-9)
1 want -> other* a (other|a)* e (other|e)* i (other|i)* o (other|o)* u (other|u)*
other -> [bcdfghjklmnpqrstvwxyz]
2 a*b*……z*
3 \/\*([^*"]*|".*"|\*+[^/])*\*\/
8 b*(a+b?)*
9 b* | b*a+ | b*a+ba*
其中第3题前后的\是转义字符,容易理解,中间部分解释如下