编译原理复习
什么是编译器,什么是解释器?
编译器是把高级程序设计语言编写的源程序翻译为等价的目标程序的软件
解释器并不通过翻译的方式生成目标语言,而是直接利用用户提供的输入执行源程序中的指定操作。
中间代码的生成要求
易于生成
易于翻译成目标语言
编译器优化的设计目标
优化必须是正确的,不能改变被编译程序的含义
优化必须能够改善很多程序的性能
优化所需的时间必须保持在合理的范围内
所需要的工程方面的工作必须是可管理的
词法分析器的任务(作用)是什么,其单词内部表示格式是什么?
任务 (作用):
(1)识别出源程序中的各个语法单元,供语法分析使用
(2)删除无用的空白字符、回车
(3)删除注释
(4)进行词法检查,报告所发现的错误
单词内部表示格式:(Class,Value)
Class -- 单词类别 Value -- 单词的值
请简述词法分析从语法分析中分离的原因?
(1)简化编译器的设计 (2)提高编译器的效率
(3)增强编译器的可移植性 (4)为编译器的模块划分提供了方便
语法分析器的作用?
从词法分析器获得词法单元,并验证该词法单元的正确性
能够报告出语法的错误,
能从常见的错误中恢复并继续处理其余部分的程序
能够构造出一个语法分析树
编译器的错误处理的不同形式
词法错误,如标识符、关键字或运算符的拼写错;
语法错误,如算术表达式的括号不配对;
语义错误,如运算符作用于不相容的运算对象;
逻辑错误,如无穷的递归调用。
什么是上下文无关文法?
一个上下文无关文法由四个元素组成:
1. 一个终结符号集合VT,也称作词法单元
2. 一个非终结符号集合VN,也称为语法变量
3. 一个产生式集合P,每个产生式包括一个产生式头和一个产生式体
4. 指定一个非终结符号为开始符号S
满足何种条件的文法被称为LL(1)文法?
任意两个产生式 → α|β都满足下列条件
( ) ( )
1. ∩ = ∅
∗
( ) ( )
2. 若 ⇒ 则 ∩ = ∅
LR分析器由哪几部分组成?请画出结构示意图
LR分析器由:
输入
输出
分析栈
分析驱动程序
语法分析表 【含动作(Action) 和 转移(Goto)两部分】
其结构示意图如下所示
全局存储分配有哪几种分配策略?简述其分配方法?
全局存储分配有三种分配策略:
静态分配策略:在编译时安排所有的数据对象的存储单元
栈式分配策略:按栈方式管理运行时的活动记录
堆式分配策略:在运行时根据要求从堆区域分配存储空间和释放存储空间
请简述按照分析树的方法进行语法制导翻译的步骤
根据基础文法构造输入的分析表
构造属性依赖图
进行拓扑排序
按照次序计算属性,得到输入串的翻译。
引用调用传参 的实现过程
实参的地址作为相应的形参的值被传递给调用者。在调用者的代码中使用形参时,实现方法是沿着这个指
针找到调用者指明的内存位置。因此,改变形参看起来就像是改变了实参一样。
寄存器的分配和指派
全局寄存器分配
使用计数
外层循环的寄存器指派
通过图着色方案进行寄存器分配
请简述基本块划分的方案
首先确定所有的首指令:
序列的第一个指令是首指令
任意一个条件或无条件转移指令的目标指令是一个首指令
紧跟一个条件或无条件转移指令之后的指令是首指令
每个首指令到下一个首指令之前的语句指令构成一个基本块 。
无符号数的正则表达式
表示一:
| |
→ 0 1 … |9
→ ∗
→ . |
( ( | | )
→ + − ) |
→
表示二:
→ [0 − 9]
→ +
( ) ( [ ] )
→ . ? + − ? ?
为正规式(a|b)*ab 构造其相应的非确定性的有限自动机(NFA),并将其确定化
描