- 1.1.1 1-1什么是编译
- 1.2.1 1-2 编译系统的结构
- 1.3.1 1-3 词法分析概述
- 1.4.1 1-4 语法分析概述
- 1.5.1 1-5语义分析概述
- 1.6.1 1-6中间代码生成及编译器后端概述
- 2.1.1 2-1 基本概念
- 2.2.1 2-2 文法的定义
- 2.3.1 2-3语言的定义
- 2.4.1 2-4文法的分类
- 2.5.1 2-5CFG的分析树
- 3.1.1 3-1正则表达式
- 3.2.1 3-2正则定义
- 3.3.1 3-3有穷自动机
- 3.4.1 3-4有穷自动机的分类
- 3.5.1 3-5从正则表达式到有穷自动机
- 3.6.1 3-6从NFA到DFA的转换
- 3.7.1 3-7识别单词的DFA
- 4.1.1 4-1自顶向下分析概述
- 4.2.1 4-2文法转换
- 4.3.1 4-3LL(1)文法
- 4.6.1 4-4 FIRST集和FOLLOW集的计算
- 5.1.1 4-5递归的预测分析法
- 5.2.1 4-6非递归的预测分析法
- 5.3.1 4-7预测分析中的错误处理
- 6.1.1 4-8自底向上分析概述
- 6.2.1 4-9LR分析法概述
- 6.3.1 4-10LR(0)分析
- 6.4.1 4-11LR(0)分析表构造算法
- 7.1.1 4-12SLR分析
- 7.2.1 4-13LR(1)分析
- 7.3.1 4-14LALR分析法
- 7.4.1 4-15二义性文法的LR分析
- 7.5.1 4-16LR分析中的错误处理
- 8.1.1 5-1语法制导翻译概述
- 8.2.1 5-2语法制导定义SDD
- 8.3.1 5-3SDD的求值顺序
- 8.4.1 5-4S-属性定义与L-属性定义
- 9.1.1 5-5语法制导翻译方案SDT
- 9.2.1 5-6在非递归的预测分析过程中进行翻译
- 10.1.1 5-7在递归的预测分析过程中进行翻译
- 10.2.1 5-8L-属性定义的自底向上翻译
- 11.1.1 6-1类型表达式
- 11.2.1 6-2声明语句的翻译
- 12.1.1 6-3简单赋值语句的翻译
- 12.2.1 6-4数组引用的翻译
- 13.1.1 6-5控制流语句及其SDT
- 13.2.1 6-6布尔表达式及其SDT
- 13.3.1 6-7控制流翻译的例子
- 14.1.1 6-8布尔表达式的回填
- 14.2.1 6-9控制流语句的回填
- 14.3.1 6-10switch语句的翻译
- 14.4.1 6-11过程调用语句的翻译
- 15.1.1 7-1运行存储分配概述
- 15.2.1 7-2静态存储分配
- 15.3.1 7-3栈式存储分配
- 15.4.1 7-4调用序列和返回序列
- 15.5.1 7-5非局部数据的访问
- 15.6.1 7-6符号表
- 15.7.1 7-7符号表的建立
- 16.1.1 8-1流图
- 16.2.1 8-2常用的代码优化方法(一)
- 16.3.1 8-3常用的代码优化方法(二)
- 16.4.1 8-4基本块的优化
- 17.1.1 8-5数据流分析
- 17.2.1 8-6到达定值分析
- 17.3.1 8-7到达定值方程的计算
- 18.1.1 8-8活跃变量分析
- 18.2.1 8-9可用表达式分析
- 19.1.1 8-10支配结点和回边
- 19.2.1 8-11自然循环及其识别
- 19.3.1 8-12删除全局公共子表达式和复制语句
- 19.4.1 8-13代码移动
- 19.5.1 8-14作用于归纳变的强度削弱
- 19.6.1 8-15归纳变量的删除
- 20.1.1 9-1代码生成器的主要任务
- 20.2.1 9-2一个简单的目标机模型
- 20.3.1 9-3指令选择
- 20.4.1 9-4寄存器的选择
- 20.5.1 9-5寄存器选择函数getReg的设计
- 20.6.1 9-6窥孔优化
这学期在《编译原理》这门课的实验中收获了很多。最重要的是学习了一种系统设计的思想,一种对全局把握的能力。系统是一个很庞大的工程,它里面包含很多模块,模块之间相互联系,虽然尽量使用“高内聚,低耦合”的设计思想,但系统越大,不可避免地会提高模块之间的耦合程度,这时就需要设计者既有一种纵观全局的开阔眼界,又有对每一个细节的精准把握。在编写这个编译器的过程中我的体会是:代码越多,调试越困难。因为代码越多,程序一旦编写错了,定位出错位置就比较难了。比如我在编写语法分析器的过程中发现有一个错误如何调试都不对,后来发现不是语法分析的代码有错,而是之前编写的词法分析器有一个隐性的错误当时测试时没有发现,这让我感到其实程序测试也是很重要的一项的工作,尤其是在比较大型的系统编写过程中,需要对之前编写的代码进行充分的测试,保证在开始新工作之前以前的代码都是正确的。另一个让我印象深刻的错误是在编写符号表的过程中,是一个很低级的错误,但却花费了我好几天也没调试出来,就是声明一个指针int *pint;那么在访问过程中如pint+1,这个1的单位不是字节,而是这个pint类型的size,在这里相当于加了4个字节。这个错误在于我对C语言的掌握不够,以前的知识模糊。调试这个错误的过程中IDE提示的出错位置不是在这,而是在另一个malloc申请内存的语句处,这是因为以前错误对不该访问的地址访问、赋值,导致程序在申请堆上空间时出错。
本课程共计20讲。
第1讲 绪论
第2讲 程序设计语言及其文法
第3讲 词法分析
第4讲 语法分析_1
第5讲 语法分析_2
第6讲 语法分析_3
第7讲 语法分析_4
第8讲 语法制导翻译_1
第9讲 语法制导翻译_2
第10讲 语法制导翻译_3
第11讲 中间代码生成_1
第12讲 中间代码生成_2
第13讲 中间代码生成_3
第14讲 中间代码生成_4
第15讲 运行存储分配
第16讲 代码优化_1
第17讲 代码优化_2
第18讲 代码优化_3
第19讲 代码优化_4
第20讲 代码生成
课程大纲
第1讲 绪论
1-1 什么是编译
1-2 编译系统的结构
1-3 词法分析概述
1-4 语法分析概述
1-5 语义分析概述
1-6 中间代码生成及编译器后端概述
本讲模拟练习题(不计分)
本讲课程讲义(PDF文档)
【讨论1-1】编译过程与人工翻译过程之间的关系
【讨论1-2】符号表中NAME字段的设计
第1讲 测验(计分)
本讲课程讲义(PPT文档)
第2讲 程序设计语言及其文法
2-1 基本概念
2-2 文法的定义
2-3 语言的定义
2-4 文法的分类
2-5 CFG的分析树
本讲模拟练习题(不计分)
本讲课程讲义(PDF文档)
【讨论2-1】计算机中是如何表示语言的?
【讨论2-2】每一类单词可否看成一种语言?
第2讲测验(计分)
本讲课程讲义(PPT文档)
第3讲 词法分析
3-1 正则表达式
3-2 正则定义
3-3 有穷自动机
3-4 有穷自动机的分类
3-5 从正则表达式到有穷自动机
3-6 从NFA到DFA的转换
3-7 识别单词的DFA
本讲模拟练习题(不计分)
本讲课程讲义(PDF文档)
第3讲测验(计分)
本讲课程讲义(PPT文档)
第4讲 语法分析_1
4-1 自顶向下分析概述
4-2 文法转换
4-3 LL(1)文法
本讲模拟练习题(不计分)
本讲课程讲义(PDF文档)
4-4 FIRST集和FOLLOW集的计算
本讲课程讲义(PPT文档)
第4讲测验(计分)
第5讲 语法分析_2
4-5 递归的预测分析法
4-6 非递归的预测分析法
4-7 预测分析中的错误处理
本讲模拟练习题(不计分)
本讲课程讲义(PDF文档)
第5讲测验(计分)
本讲课程讲义(PPT文档)
第6讲 语法分析_3
本讲课程讲义(PPT文档)
4-8 自底向上分析概述
4-9 LR分析法概述
4-10 LR(0)分析
4-11 LR(0)分析表构造算法
本讲模拟练习题(不计分)
本讲课程讲义(PDF文档)
【讨论6-1】下推自动机与有穷自动机之间的关系
【讨论6-2】LR语法分析栈中状态信息与文法符号信息之间的关系
第6讲测验(计分)