编译原理期末总结
第一章
1、编译器的概念:编译器将源语言编写的程序作为输入,而产生用目标语言编写的等价程序。
2、机器语言→汇编语言→高级语言
3、乔姆斯基分层结构
-
0型:无限制文法------图灵机
-
1型:上下文相关文法------线性有界自动机
-
2型:上下文无关文法------下推自动机
-
3型:正则文法------正则表达式、有限确定的自动机
分类:
-
文法左边有终结符:0型/1型
-
0型文法左边符号数>=1,.右边符号=>0
-
1型文法左右终结符位置对应
-
文法左边无终结符:2型/3型
-
3型文法右边形式只有 a 或 Aa
4、相关程序和概念
-
解释器:立即执行源程序
-
编辑器:接受并编辑源程序
-
交互式开放环境:编译器、编辑器、其他程序捆绑在一起构成的交互式环境
-
调试程序:可在编译了的程序中判定执行错误的程序
-
分析与综合:
-
分析:分析源程序以计算其特性的编译器操作
-
综合:生成翻译代码时的编译器操作
-
-
前端与后端
-
前端:只依赖于源语言的操作
-
后端:只依赖于目标语言的操作
-
-
遍:对源程序或源程序中间结果从头到尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序。
5、扫描程序的功能及输入输出
-
功能:依据语法规则,分析由字符组成的源程序,把它分割为一个个具有独立意义的最小语法单位,即记号
-
输入:源程序
-
输出:Token
6、语法分析器的任务
-
分析单词串是如何构成语句和说明的
-
分析语句和说明是如何构成程序的
-
分析程序的结构
7、语义分析的基本功能
-
确定类型
-
类型检查
-
语义处理
-
某些静态语义检查
8、源代码→词法分析→记号→语法分析→抽象语法树/语义树→语义分析→注释树→源代码优化→中间代码→代码生成→目标代码
9、语法制导的语义中,语法树会进行标注?
10、T形图:自举与移植
S:源语言
T:目标语言
H:宿主语言
为了编译器能立即执行,宿主语言必须是机器语言
第二章
1、正则表达式r:
a. 语言:所有匹配这个正则表达式的字符串的集合
b. 字母表:这个正则表达式所有接受的字符的集合
c. 元符号:具有特殊意义的符号
2、有限自动机组成元素
a. 字母表
b. 状态集合
c. 转换函数
d. 初始状态
e. 接受状态
3、DFA的判定
a. 单个输入状态
b. 输入字符,得到的状态确定
c. 消除了ε转换
4、NFA的构造
a. 输入为初始状态的ε集合
b. 输出为转入状态的ε集合
5、DFA与NFA区别
a. 能否根据当前处所状态与面临的输入字符,确定唯一的后继状态
第三章
1、所有记号符号的串集是被表达式的文法定义的语言
2、二义性文法:对某个输入的记号串,可产生两个及两个以上不同分析树或语法树的文法。
消除的方法:
-
消除二义性规则
-
修改文法,即将文法改变成能强制正确分析 树的构造 的结构
原因:
- 文法中缺少对文法符号优先级与结合性的规定,else悬挂
证明有二义性:
-
针对一个输入,有两个或两个以上不同的分析树或语法树
-
两个及以上的最左推导或最右推导
第四章
一、自顶向下
从文法的开始符号开始,反复使用各种产生式,直到推出整个字符串或者出错
递归下降分析法:
- 将一个非终结符A的文法规则看作将识别A的一个过程的定义
LL1
-
第一个L:从左向右扫描输入串
-
第二个L:最左推导
-
1:一个符号先行
-
动作:生成、匹配、接受
二、自底向上
-
从程序开始逐步进行归约直到归约到文法的开始符号或出错
-
通过叶子结点,逐步向上构造分析树,直到完整构造出根节点。
-
寻找句柄
第五章
1、LR(0)文法判别
DFA中每个状态都是移入状态或归约状态,其中哪些
状态为归约状态,哪些
状态为移入状态;且每个归约状态中只有一个完整项,所以该文法是LR(0)文法。
2、语法:
一组规则,用它可形成和产生一组合式的程序
3、文法:
描述语言的语法结构的形式规则
第六章
1、属性文法
语法规则:
- 语法——一组规则,用它能够形成一组合式的程序
语义规则:
- 语义——定义程序的意义的一组规则
2、语义属性包括:
-
变量的数据类型
-
表达式的值
-
存储器中变量的位置
-
程序的目标代码
-
数的有效位数
3、概念
-
联编:确定语义的过程
-
联编时间:确定语义的时间点
-
静态语义:联编时间能在编译阶段进行确定
-
动态语义:联编时间只能在运行的时候进行确定
4、常见的静态语义
5、块结构
包含说明的任意构造 (过程、函数、复合语句)
6、哈希表的基本原理
把字符映射到整数值上
7、符号表的作用、内容
-
Tips:分析阶段是对符号表的构建过程
-
类型检查(语义分析阶段)
-
存储地址(相对地址)(目标代码生成阶段)
-
三种基本操作:插入、查找和删除
8、符号表的基本结构
-
线性表 //无序表
-
搜索树 //有序表
-
杂凑表 //哈希表
第七章
1、概念
1.运行时环境:
目标计算机的寄存器以及存储器的结构
2.过程活动记录:
一个过程或函数被激活或调用的时候,分配给它存储局部数据的空间
-
自变量(参数空间)
-
用作簿记地址的空间,它包括了返回地址
-
用作局部数据的空间
-
用作局部临时变量的空间
3.调用序列:过程或函数被调用时,必须发生的操作序列的判定
-
为活动记录分配存储器
-
计算和保存自变量
-
寄存器的保存和设置
4.返回序列:过程或函数返回时需要的额外操作
-
放置可由调用程序访问的返回值
-
调整寄存器
-
活动记录存储器的释放
二、几种运行时环境及特点
a. 完全静态运行时环境 FORTRAN77
1 | i. 数据空间在编译阶段确定 |
b. 基于栈的运行时环境 C C++ Pascal
i. 指针
1. fp frame point 指向当前活动
2. 控制链 指向先前活动记录
3. sp stack point 指向栈顶
ii. 允许递归调用、支持指针,某个过程可能有多个有效的过程活动记录
iii. 整个存储器空间被划分为 代码区、静态存储区域(存放全局变量)、栈区域、堆区域、空闲区域
c. 完全动态的运行时环境
i. 只有在被调用时才被分配空间
ii. 使用堆管理
8-10章
1、代码生成
第一个必须考虑机器的物理特性
2、代码优化的分类
a)窥孔优化:
在目标代码上进行的优化
b)优化应用的程序范围
基本块:一个最大的线性代码序列
局部优化:基本块内
全程优化:过程内,基本块外
过程间优化:程序内,过程外
源代码优化的实例
没找到
名词解释
-
短语——一个句型的语法树中任一子树的叶节点所组成的符号串
-
直接短语——最小子树的叶节点
-
素短语——如果短语中至少含有一个终结符,而且除它自身之外不再含任何更小的素短语
-
句柄——一个句型的最左直接短语
-
文法——描述语言的语法结构的形式规则
-
语法——一组规则,用它能够形成一组合式的程序
-
基本块——程序中一顺序执行的语句序列
-
语法制导翻译——在语法分析过程中,根据每个产生式所对应的语义程序进行翻译的方法
-
语义——定义程序的意义的一组规则