四川大学编译原理复习要点.pdfVIP

  • 10
  • 0
  • 约8.45千字
  • 约 10页
  • 2020-10-06 发布于江西
  • 举报
学习好资料 欢迎下载 四川大学 编译原理复习要点 2013版 一、编译器各个阶段的功能,输入、输出,前端、后端 1)词法分析:将字符序列收集到称作记号(t o k e n)的有意义单元中 扫描程序 输入:源代码 输出:记号 2) 语法分析:从扫描程序中获取记号形式的源代码,并完成定义程序结构的语法分 析,语法分析定义了程序的结构元素及其关系。 输入:记号 输出:语法树 3 )语义分析程序:分析程序的静态语义, 包括声明和类型检查。 输入:语法树 输出:注释树 4 )源代码优化程序:编译器通常包括许多代码改进或优化步骤。绝大多数最早的优化 步骤是在语义分析之后完成的,而此时代码改进可能只依赖于源代码。 【对源代码进行优化,并产生中间代码】 输入:注释树 输出:中间代码 5 )目标代码生成:得到中间代码,生成目标机器的代码 代码生成器 输入:中间代码 输出:目标代码 6 )目标代码优化程序:编译器改进由代码生成器生成的目标代码。 输入:目标代码 输出:目标代码 扫描程序、分析程序和语义分析程序是前端,代码生成器是后端, 前后端分开的好处:可以给编译器带来更方便的可移植性,此时的编译器既能改变源代 码,又能改变目标代码。 【遍】编译器发现,在生成代码之前多次处理整个源程序很方便,这些重复就是遍。首 遍是从源中构造一个语法树或中间代码,在它之后的遍是由处理中间表示、向它增加信息、 更换结构或生成不同的表示组成 二、解释器和编译器的区别 与联系? 读入源语言后,解释器和编译器都要进行词法分析、语法分析和语义分析, 之后,二者开始有所分别。解释器在语义分析后选择了直接执行语句;编译器在 语义分析后选择将将语义存储成某一种中间语言,之后通过不同的后端翻译成不 同的机器语言(可执行程序) 编译器是把源语言(如 C,Pascal,java 等高级语言)转换为目标语言(汇编语言、机 器语言等低级语言),要产生目标代码。 解释器是以一个源语言(C,Pascal,java 等高级语言)为输入,一边解释一边执行源 程序,但不产生目标代码。 学习好资料 欢迎下载 三、算法描述(伪代码)p41 构造一个扫描程序的自动过程:正则表达式→NFA→DFA→程序 1、正则表达式→NFA (1)建立字母表。输入的正则表达式由于一般不输入“与”操作符,因此 首先给表达式加 .作为与操作。再利用逆波兰式的堆栈操作,把操作符与字母分开,便得 到了字母表。 (2 ) Thompson 构造法。首先将构成正则表达式的各个元素分解,对于每 一个元素,按照下述规则1 和规则2 生成NFA。注意:如果r 中记号a 出现了多次,那么 对于a 的每次出现都需要生成一个单独的NFA。 2、NFA→DFA 从单个输入字符的某个状态中去除ε -转换和多重转换。 (1)利用ε -closure 规则即闭包规则,把NFA 状态划分成集合,而后把每个集合作为 DFA 的状态。 详细描述:从NFA 的状态S 开始经过ε 到达的状态存储下,然后再把存储结果中的状 态有经过ε 到达的新状态也存储在一起,这样通过闭包规则就可以这些集合,再把集合作为 DFA 的状态。 (2 )子集构造 3、DFA→程序 DFA状态最小化 取出DFA 状态中的不可达的状态。 构造最小状态的等价DFA 的算法是通过创建统一到单个状态的状态集来进行。 构造NFA (使用Thompson结构): 1) 基本正则表达式 基本正则表达式格式a或ε,其中a表示字母表中单个字符的匹配, ε表示空串的匹配。与正则表达式a等同的N FA (即在其语言中准确接受)的是: 与ε等同的N FA是: 2) 并置 我们希望构造一个与正则表达式r s等同的N FA ,其中r 和s 都是正则表达 式。可将与rs 对应的N FA构造如下: 3) 在各选项中选择 我们希望在与前面相同的假设下构造一个与r | s

文档评论(0)

1亿VIP精品文档

相关文档