文章目录
前言
学习完编译原理课程后,对编译原理各章节应掌握知识点进行概括总结。内容类似于科目大纲,只不过是自己写的,用来串联自己脑中的知识点。
第一章:编译程序基本概念
- 了解编译程序和解释程序的区别。
- 明白编译程序含有六个步骤(模块):词法分析,语法分析,语义分析,中间代码生成,优化,目标代码生成。
第二章:形式语言基础
- 掌握符号串的运算规则。
- 明白形式语言的定义,清楚符号串集合和形式语言之间的关系。
- 掌握文法的(符号)定义,清楚文法和形式语言的联系。
- 能读懂文法。给出某简单文法,能够得出此文法所代表语言的相关性质。
- 明白推导和规约的定义。明白最左推导和最左规约的定义,以及这两者和后面语法分析算法之间的联系。
- 明白语法树的定义。明白句型,句子,短语,简单短语,句柄的定义。 能根据某句型画出语法树。并能够从语法树中找出上述这些元素。
- 掌握递归文法和二义性文法的定义。
- 会进行文法的转换:删除无用的产生式(不终结,不可达,自定己);去掉 ϵ \epsilon ϵ产生式;掌握三种常用文法的等价变换(原括号法,中括号法,花括号法 其实就是变化成正则文法的那几个步骤);。
- 了解形式语言的分类以及和对应文法的相关关系。
会做学校给的习题。
第三章:自动机基础
- 掌握有限自动机的分类以及各自(符号)定义:确定性有限自动机(DFA),带空转移的有限自动机( ϵ \epsilon ϵDFA),不带空转移的有限自动机( ϵ ‾ \overline{\epsilon} ϵDFA)。
- 掌握有限自动机的等价变换: 有限自动机的确定化(消除 ϵ \epsilon ϵ边, ϵ ‾ \overline{\epsilon} ϵDFA确定化);有限自动机的最小化(删除无用状态<不可达,不终结>,合并等价状态)。
- 明白正规文法,正则表达式,有限自动机三者之间的联系并能进行相互转化。
- 明白自动机对词法分析,语法分析的重要性。
会做学校给的习题。
第四章:词法分析
- 明白词法分析器的概念和作用。
- 明白token二元式的定义和作用。
- 掌握词法分析器的运转原理和运转过程。
- 明白算数常数处理机的运转过程。课设要求:手撕算数常数处理机,并能将其融入单词扫描器中。
- 课设要求:手撕词法分析器(单词扫描器)。
- 课设要求:能够画出识别各类别单词(标识符,数字)的自动机。
会做学校给的习题。
第五章:语法分析
- 辨析词法分析和语法分析的联系和区别。
- 掌握语法分析的几种常见算法:如下。
- 课设要求:手撕语法分析器,使用算法待定。
会做学校给的习题。
自顶向下:递归子程序法
- 能够判断一个文法是不是LL(1)文法,并能将部分不是LL(1)的文法转化成LL(1)文法(消除左递归,三种括号法)。
- 明白此方法的可行原理(即为什么这么操作就能完成语法分析的功能)。
- 掌握此方法的运转过程。
- 能根据文法产生式画出子程序流程图。
- 课设要求:能根据流程图完成代码实现。
- 能够和语法制导技术相结合,并据此修改流程图和代码。
自顶向下:LL(1)分析方法
- 能够判断一个文法是不是LL(1)文法,并能将部分不是LL(1)的文法转化成LL(1)文法(消除左递归,三种括号法)。
- 掌握此方法的可行原理。
- 能够根据文法产生式写出分析表:会找 select集 ,first集,follow集。
- 掌握LL(1)分析方法的主控程序。
- 能够脑中模拟此方法运转过程(人脑运行,哈哈)。
- 课设要求:此方法的代码实现。
- 能够和语法制导技术结合,并据此修改或重构代码。
自底向上:LR(0)分析方法
- 能够判断一个文法是不是LR(0)文法
- 掌握此文法的可行原理。
- 能够根据文法画出活前缀图或可规约前缀图(自动机)。并能将得出的自动机进行化简。能够明白前缀图的可规约态和规约态的区别(自动机能代码实现的前提)。
- 能够根据前缀图(活前缀图,可规约前缀图)得出LR(0)分析表。
- 掌握此文法的主控程序。
- 能够脑中模拟此方法的运转过程。
- 课设要求:此方法的代码实现(主要是自动机的代码实现)。
- 能够和语法制导技术结合,并据此修改或重构代码。
- 进阶技术:能够根据文法直接写出分析表,不需要经过前缀图的过渡。
自底向上:LR(0)进阶 -> SLR(1)分析方法
- 辨析SLR(0)文法同LR(0)文法的区别,也就是SLR(0)文法较LR(0)文法的优越性。
- 熟练掌握LR(0)分析方法。
- 能够根据文法找出各follow集,完成此方法较LR(0)的完善部分。
- 明白此方法分析表同LR(0)分析表的区别。
- 掌握此文法的主控程序。
- 能够脑中模拟此方法的运转过程。
- 课设要求:此方法的代码实现(主要是自动机的代码实现)。
- 能够和语法制导技术结合,并据此修改或重构代码。
- 进阶技术:能够根据文法直接写出分析表,不需要经过前缀图的过渡。
自底向上:SLR(1)进阶 -> LR(1)分析方法
- 明白LR(1)文法较SLR(1)文法的优越性。
- 熟练掌握LR(0)和SLR(1)分析方法。
- 能够根据扩展项目集活出扩展可规约前缀图,并据此得出LR(1)分析表。
- 明白此方法分析表同SLR(1),LR(0)分析表的区别。
- 掌握此文法的主控程序。
- 能够脑中模拟此方法的运转过程。
- 课设要求:此方法的代码实现(主要是自动机的代码实现)。
- 能够和语法制导技术结合,并据此修改或重构代码。
- 进阶技术:能够根据文法直接写出分析表,不需要经过前缀图的过渡。
自底向上:简单优先分析方法
- 明白此方法的可行原理。
- 能够分辨一个文法是不是简单优先文法。
- 能够根据文法产生式找出非终结符的FIRST集和LAST集,并据此找出和符号的“大小相等”关系,画出分析表。
- 掌握此方法的主控程序。
- 能够脑中模拟此方法的运转过程。
- 课设要求:此方法的代码实现(主要是自动机的代码实现)。
- 能够和语法制导技术结合,并据此修改或重构代码课程未讲授。。
自底向上:简单优先进阶 -> 算符优先分析方法
-
掌握中缀表达式向逆波兰表达式转化的算法。 因为这个算法极其有利于理解这个分析方法,其实这个算法就是这个分析方法的一个简单应用。
-
辨析此方法同简单优先算符分析方法的区别和联系。
-
能够根据文法产生式找出非终结符的FIRST集和LAST集,得出各终结符的“大小相等”关系,画出分析表。
课程未讲授。需自学 :
4. 掌握此方法的主控程序。
5. 能够脑中模拟此方法的运转过程。
6. 代码实现。
第六章:符号表
- 明白符号表的定义,功能和作用 暂时还未明白,估计得课设实践的时候才能明白了。。
能够记住各种表的英文表示(笑哭)。- 掌握符号表的构成,已经构成元素。尤其是地址一栏,针对标识符的不同类型指向不同种类的表。
- 掌握类型表的构成以及构成元素。
- 掌握数组表,结构表的构成以及构成元素。(类型表的指向)
- 掌握过函表,常量表,长度表,活动记录表的构成以及构成元素。(符号表地址栏的指向)
- 掌握形参表的构成以及构成元素。(过函表参数表栏指向) 形参表填充内容和符号表填充内容相同。
- 能够掌握各种表的嵌套交织关系(好难,呜呜呜)。
- 明白活动记录表的定义。
- 掌握活动记录表的内部构造,已经含有内容的具体含义。
- 掌握静态连的构成。
- 能够构造出嵌套过函每个过函的完整活动记录表。
- 给出一段程序,能够完整构造出最后的符号表以及活动记录表(好难,呜呜呜)。
会做学校给的习题。
第七章:中间语言(四元式)生成
- 明白中间语言(代码)的定义。
- 明白逆波兰式和四元式的联系:逆波兰式的计算顺序就是四元式的生成顺序。
- 掌握赋值语句,转向语句(goto,标号),分支语句(if,else),循环语句(while)的生成四元式。
- 掌握语法制导技术的原理:将翻译文法按照逆波兰式的顺序设计,所以生成的四元式序列就能正常运行。
- 掌握赋值语句,转向语句(goto,标号),分支语句(if,else),循环语句(while)的生成四元式翻译文法。
- 能够将翻译文法同各个语法分析方法结合,并能明白整个运转过程,能体现在代码上。
- 能够进行翻译文法的转换,能够将语义动作全部转化到产生式右部末尾。
会做学校给的习题。
第八章:(四元式)优化
- 了解优化分分类。
- 了解常见的几种局部优化方法。
- 掌握基本块划分算法,给出一段四元式序列,能够完成基本块的划分。
- 能够画出某基本块的DAG图,并进行优化。
- 能够根据优化后的DAG图,得出优化后的四元式序列。
第九章:目标代码(虚拟机及其指令系统)生成
- 掌握虚拟机的有限几个指令:存,取,转向,算数运算,逻辑运算。
- 掌握变量应用点和定义点的定义。掌握基本块内变量活跃或者非活跃的定义。
- 掌握基本块内确定变量活跃性的算法(逆序扫描)。
- 熟练掌握寄存器分配三原则。
- 给出一个基本块的四元式序列,和寄存器个数(一般是一个),能够根据三原则写出生成的目标代码。
- 注意每个基本块开始结束时的寄存器控制指令。
- 熟练掌握赋值语句(表达式四元式,赋值四元式),跳转语句(分支四元式,循环四元式)的指令生成过程。
- 熟练掌握目标代码生成算法(以上几条解决要生成什么样的指令,下面几条解决如何生成这样的指令)。
- 熟练掌握赋值语句(表达式四元式,赋值四元式),跳转语句(分支四元式,循环四元式)的指令生成算法,可进行代码实现。
总结
- 总体说来编译原理这门课程还是很有趣的。学完这门课,作为一名未来程序员,才真正了解了自己键盘所敲的字符是如何转化为机器指令操作计算机运作的。
- 经过一个学期的不努力学习和将近两周的努力复习,现在对编译原理的理论已经有所掌握。接下来就进行理论实践。
课设的相关文档和代码放在GitHub上了:~~
https://github.com/1234-bai
最后课设和他人完成,贡献不多,不放了。