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

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&#47;x&#45;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题前后的\是转义字符,容易理解,中间部分解释如下