
1. 编译原理速成指南哈工大课程核心精要编译原理这门课常常让计算机专业的学生又爱又怕。作为哈工大计算机系的镇系之宝它既包含了计算机科学最精华的理论体系又因其抽象性让不少同学头疼。不过别担心这份通关笔记就是为你准备的急救包。我在大三时修过这门课当时距离考试只剩两周硬是靠这套方法从零基础冲到80。编译原理的核心其实就三大模块词法分析、语法分析和语法制导翻译。掌握这几个关键点及格绝对没问题。先说说这门课的独特之处。与操作系统、数据库等偏实践的课程不同编译原理更像是在教你造轮子的底层逻辑。你会理解平时用的编程语言是如何从文本变成可执行文件的这种上帝视角的体验非常奇妙。2. 词法分析从正则表达式到自动机2.1 正则表达式实战技巧词法分析就像英语阅读时划分单词。正则表达式就是我们的单词识别器它用简洁的符号描述一类字符串的模式。记住这几个核心元字符就够用了*表示0次或多次重复|表示或关系()用于分组[]定义字符集举个例子C语言的标识符可以表示为[a-zA-Z_][a-zA-Z0-9_]*。这表示第一个字符必须是字母或下划线后面可以跟任意数量的字母、数字或下划线。2.2 有穷自动机的转换诀窍正则表达式最终要转换成有穷自动机(FA)才能被计算机执行。这里有个实用技巧先画非确定有限自动机(NFA)再用子集法转为确定有限自动机(DFA)最后用划分法最小化。我总结了一个三步走口诀RE转NFA按运算优先级拆解从内到外构建NFA转DFA用子集法每个状态集看作一个新状态DFA最小化合并等价状态去除冗余考试常考的是子集法的具体步骤。记住关键点ε-closure和move操作要交替进行直到没有新状态产生为止。3. 语法分析LL与LR算法精解3.1 自顶向下分析实战LL分析是预测型分析就像做英语完形填空看到某个单词就预测后面可能出现的结构。要掌握三个核心集合的计算FIRST集计算口诀终结符的FIRST就是它自己非终结符的FIRST是其所有产生式右部第一个符号的FIRST的并集如果某个产生式可以推出ε还要继续看后面的符号FOLLOW集计算技巧先把$放入开始符号的FOLLOW对于产生式A→αBβ把FIRST(β)加入FOLLOW(B)如果β可推出ε把FOLLOW(A)也加入FOLLOW(B)SELECT集则是判断LL(1)文法的关键对于产生式A→α如果α不能推出εSELECT就是FIRST(α)否则是FIRST(α)∪FOLLOW(A)。3.2 自底向上LR分析要诀LR分析像是玩拼图不断把小的语法单位组合成大的结构。重点掌握SLR分析表的构造先构造LR(0)项目集规范族遇到冲突时用FOLLOW集来决策移进-规约冲突若下一个输入符号在FOLLOW(规约非终结符)中选择规约否则移进规约-规约冲突选择FOLLOW集不相交的产生式实际考试中SLR(1)就够用了。记住这个判断标准同一状态中任何两个产生式的SELECT集不能有交集。4. 语法制导翻译属性计算与代码生成4.1 属性文法实战应用语法制导翻译是连接语法分析和中间代码生成的桥梁。重点掌握两类属性综合属性自底向上计算子节点的属性决定父节点继承属性自顶向下传递依赖父节点或兄弟节点我常用这个记忆法综合属性像子承父业继承属性像父传子业。4.2 中间代码生成技巧三地址代码是中间表示的核心形式掌握四元式的生成规律赋值操作目标地址放在结果位置算术运算两个操作数在前结果在后数组访问基址和偏移量分开处理函数调用参数和返回地址要特殊处理一个实用技巧先生成抽象的中间代码再考虑具体的目标机器特性。这样既保持可移植性又为后续优化留出空间。5. 高频考点与应试策略5.1 必考题型分析根据历年考题这些知识点出现频率最高正则表达式与自动机转换30%FIRST/FOLLOW集计算20%LL(1)文法判断15%SLR分析表构造20%语法制导定义15%特别要注意FIRST/FOLLOW集的计算题几乎每年必考。我建议先做这部分因为只要记住规则就能拿分。5.2 三天速成复习计划第一天攻克词法分析上午正则表达式与自动机转换下午DFA最小化算法第二天突破语法分析上午LL(1)文法与预测分析表下午LR(0)和SLR分析第三天搞定语义分析上午属性文法与SDD下午中间代码生成每晚做一套往年试题重点练习计算题。记住编译原理考试计算题占比很大多练手是关键。6. 实验与理论的平衡之道哈工大的编译原理以实验难度大著称。根据我的经验可以这样分配精力前三个实验词法分析、语法分析、语义分析要亲自动手这对理解理论帮助很大后面的优化实验可以借鉴优秀代码重点理解思路考试前两周集中刷题实验代码留作参考有个小技巧用现成的lex/yacc工具生成基础代码然后自己修改。这样既节省时间又能深入理解原理。7. 学习资源与工具推荐除了教材这些资源也很实用《编译原理及实践》案例丰富适合入门哈工大慕课配合本课程使用效果更佳ANTLR工具可视化语法分析过程JFLAP自动机模拟神器我特别推荐使用Graphviz来可视化语法树和自动机这对理解抽象概念帮助很大。安装也很简单sudo apt-get install graphviz # Linux brew install graphviz # Mac8. 常见误区与避坑指南根据我和同学们的踩坑经验这些错误一定要避免混淆LL和LR分析方法记住LL是自顶向下LR是自底向上FIRST集计算时漏掉ε产生式的影响SLR分析时错误使用FOLLOW集属性计算时忽略依赖关系导致环中间代码生成时混淆源和目标操作数位置有个检查技巧做完每道题后用简单例子验证一下。比如计算FIRST集后随便构造一个字符串看看是否符合预期。