编译原理之路(一)第一章典型习题解答

第一章没啥好讲,就做几道典型题好了……(参考了网上的一些资料,不保证绝对正确)

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.给出声明的作用域

编译原理之路(一)第一章典型习题解答_第1张图片

4下面C代码打印的结果是什么?

打印结果:3,2
b()中,x=x+1=2+1=3
c()中,a=x+1=1+1=2

3.1部分

1.C++程序哪些词素应该有相关联的词法值

  <(>  <)> <{> 
  <;>
 <(>  <<=>  <||>  <>=>  
  <:>  <*>  <;>
<}>

2.HTML程序哪些词素应该具有相关联的词法值


    
        
        
        
               
        
        
    

3.3部分

2.描述正则表达式的语言

a(a|b)*a 以a做开头和结尾,中间可以有任意个a或者b的串
(( ϵ \epsilon ϵ|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题前后的\是转义字符,容易理解,中间部分解释如下
编译原理之路(一)第一章典型习题解答_第2张图片

你可能感兴趣的:(#,编译原理)