一、编译概述
· 知识点:编译器的结构(前端 vs 后端)、编译的各个阶段(词法分析、语法分析、语义分析、中间代码生成、优化、目标代码生成)、遍(Pass)的概念、编译与解释的区别。
· 重点:清晰理解各阶段的任务及其输入/输出(如符号表和错误处理是所有阶段共享的核心数据结构与功能)。
二、词法分析
· 知识点:词法规则的形式化描述(正则表达式、正则定义)、有限自动机(不确定的有限自动机NFA和确定的有限自动机DFA)、词法分析器自动生成工具(如Lex/Flex)的原理。
· 重点:
· 正则表达式:描述单词符号(关键字、标识符、常数等)。
· NFA到DFA的转化(子集构造法)。
· 难点:
· DFA的最小化(Hopcroft算法):这是考试和设计的高频考点。
三、语法分析
这是编译原理课程的核心难点,主要研究如何根据文法规则识别程序的语法结构(如表达式、语句)。
· 知识点:上下文无关文法(CFG)、推导(最左推导/最右推导)、语法分析树、二义性、左递归、左公因子。
· 重点与难点:
1. 自顶向下分析
· LL(1)文法:计算First集、Follow集,构建预测分析表。
· 难点:判断一个文法是否为LL(1)文法,并利用预测分析表进行句子分析。
2. 自底向上分析
· LR分析法:包括LR(0)、SLR(1)、LR(1)和LALR。
· 核心概念:句柄、活前缀、项目、移进-归约冲突、展望符。
· 难点:
· LR(0)项目集规范族的构造。
· SLR(1)分析表的构造(利用Follow集解决冲突)。
· LR(1)项目集的构造(比SLR更精确,能解决更多冲突)。
· 二义性文法的处理(如悬空else问题,通过优先级和结合性规则解决)。
四、语法指导的翻译与中间代码生成
· 知识点:语法制导定义(SDD)、语法制导翻译方案(SDT)、中间表示形式(抽象语法树AST、三地址码、四元式、三元式)。
· 重点:

· S属性定义(适合自底向上计算)与L属性定义(适合自顶向下计算)。
· 常见语句的翻译:声明语句(符号表填加)、赋值语句、布尔表达式(短路代码)、控制流语句(if-then-else、while-do的拉链-回填技术)。
· 难点:回填技术,在处理循环和条件分支时,如何管理真/假链,在目标地址确定后回填。
五、符号表与运行时环境
· 知识点:符号表的作用与组织(哈希表、栈结构)、存储布局(代码区、静态区、堆、栈)、活动记录(AR)的结构(局部变量、形参、返回地址、动态链、静态链)、参数传递方式(传值、传引用、传名)。
· 重点:
· 嵌套作用域:如何处理嵌套过程(如Pascal),通过静态链或显示表(Display表)访问外层作用域的变量。
· 难点:Display表的维护:在过程调用/返回时如何正确更新。
六、代码优化
· 知识点:优化的分类(机器无关优化 vs 机器相关优化、局部优化 vs 全局优化)、基本块划分、流图、数据流分析(到达定值、活跃变量分析)。
· 重点:
· 局部优化:常量折叠、公共子表达式删除、复制传播、死代码删除。
· 循环优化:代码外提、强度消弱、归纳变量删除。
· 难点:数据流分析:理解数据流方程(如到达定值的GEN和KILL集),并能在流图上迭代求解。
七、目标代码生成
· 知识点:指令选择、寄存器分配(图着色算法)、指令调度(考虑流水线延迟)。
· 重点:寄存器分配。
· 难点:图着色寄存器分配:构建寄存器冲突图(干涉图),通过图着色算法分配寄存器,当颜色(寄存器)不够时,需要将某些变量溢出(Spill)到内存。
复习建议
1. 抓住主线:从源代码 → 词法单词 → 语法树 → 中间代码 → 目标代码的流程,理解每个阶段的输入输出。
2. 动手实践:尝试为一个简单的表达式或控制流语句(如if或while)手动构造词法分析、语法分析树,并生成相应的中间代码。纸上推演是掌握LL/LR分析表构造最有效的方法。
3. 工具辅助:如果有条件,可以尝试学习Lex/Yacc(或Flex/Bison)这类工具,通过实际编写小型语言的编译器,能帮助你直观地理解前端各个阶段的衔接和实现原理。