
简介这份压缩包提供第二版龙书编译原理的课后习题参考答案适合正在学习编译原理课程的高校学生、考研复习者及自学者对照练习。包内共30个文件以13个doc答案文档为主辅以2个ppt课件讲课稿、8个html补充说明和7个gif插图整体仅3.34MB方便按章节查阅。资源包含第二章、第四章、第六章、第八章等课后作业答案以及总结练习与习题讲解课件可帮助读者逐题梳理解题思路、核对推导过程。需要留意的是第二版龙书出版年代较早部分技术如算符优先分析已显过时建议结合新编教材中的面向对象编译、类型检查等新内容对照学习。目前已有2033人学习下载适合用来配合教材完成课后作业与考前冲刺。1. 第二版龙书习题答案比课件和 PPT 更值得反复啃的资料先问一句你有没有过这种经历编译原理课听完了笔记抄了几十页然后拿到课后习题第一题就把你卡住了——不是不会做而是不敢确定自己做的对不对。龙书作为编译原理领域的经典教材其课后题设计得恰到好处不多但每一道都值得做比如词法分析里的正则转 NFA 再转 DFA语法分析里的消除左递归、求 FIRST 集和 FOLLOW 集还有语义分析里的语法制导翻译。这些题目不亲手过一遍你上考场基本就是在看题发呆。第二版龙书习题答案的价值正在于把这些题目从“黑匣子”变成“白盒子”。它按章节给出了每道习题的详细推理路径和最终结果覆盖从第 2 章词法分析到第 12 章代码生成的完整体系。走到哪一步该用什么方法、哪一步容易翻车打开答案解析一看便知。这很直白地解决了一个痛点你想验证自己的解法却找不到靠谱的标准答案。这份资源就是拿来做这件事的。适合正在学编译原理的在校生、准备考研或保研的计算机方向学生以及自学编译原理、想动手写出小型编译器的从业者。有了它你不再需要对着一道题憋两个小时把时间花在更有价值的“做”上面。2. 第二版龙书习题全貌上百道题里哪些能直接抄、哪些必须亲手算拿到这份答案以后第一件事不是翻开就看而是先搞清楚你手里这份文件的边界。市面上流传的龙书答案版本其实很杂有一版是英文原版第 2 版的课后题答案覆盖了原书每一章末尾的所有习题还有一版是针对清华大学出版社影印版的配套译本题目编号和原版基本一致但个别题目在表述上有差异更常见的是很多下载站把第二版和第三版的答案混在一起打包文件名写着“龙书答案”点进去发现有 1-12 章对应第二版又有第 3 章的题目按第三版来出这就会造成极大混乱。所以拿到资源第一步是根据目录核对章节编号。龙书第二版共 12 章第 2 章讲的是词法分析、第 3 章讲语法分析这一点你可以打开你的教材对照一下。2.1 先分清三种题型概念题、仿真题、代码题对应不同的答案用法为什么要把答案里的题目分成“概念题、仿真题、代码题”三类因为这三类题目的使用策略、投入时间和答案可信度判断方式完全不同。如果你把所有题目都按同一个方式对待要么浪费时间要么踩坑。我列了一个分类表可以直接作为你的筛选标准题型典型题目答案形式使用策略建议投入时间概念题“解释编译器各阶段的作用”“比较解释器和编译器的区别”几行文字结论背逻辑、摘进笔记每道 10-15 分钟仿真题“给定文法求 FIRST/FOLLOW”“构造 LR(0) 项目集规范族”“构造 SLR 分析表”逐步推演过程与表亲手推一遍再核对答案每道 30-60 分钟代码题“为某语言实现词法分析器”“实现一个语法制导翻译的中间代码生成”参考代码片段或算法描述只做骨架参考必须自己重写每道 2 小时以上概念题不解释为什么是这个结论——它默认你读懂了教材。仿真题则是这份答案的核心资产因为这一类题目答案里的每一步推演几乎就是考试的标准解法。而代码题大部分答案只给出伪代码或核心逻辑不会给你一份能直接编译运行的完整工程。原因很简单代码题的目的是训练你把算法变成程序的能力如果答案直接给你一个可以跑的项目那就失去训练意义了。我的建议代码题只看思路然后关掉答案自己写。写完再打开答案对比接口设计而不是逐行对着抄。2.2 把答案当作“对照组”使用先自己算再对照结果解题时一个比较高效的方法是“先自行推演一遍”再把你的每一步结果和答案解析进行对照定位差异。这就好比你在练车教练坐在副驾上你操作错了教练才会告诉你错在哪而不是教练直接替你打方向盘。答案的正确打开方式是打开每个题目的解析先看它列出的关键步骤然后盖住结果自己推一遍最后再对照。这里有个值得留意的细节答案里求 FIRST 集、FOLLOW 集的题目在推导过程中会写出产生式的编号比如第 3.2 条产生式这看起来是小事实际上很关键。因为语法分析表构造的顺序依赖产生式编号如果你只抄结果不看编号顺序下一次做到这类题还是会乱。对于“某道题的答案和教材例题对不上”的情况处理的原则应该是“以原书为准”。具体来说答案里求 FOLLOW 集时如果算到某非终结符身上答案给出的终结符集合中少了一个$而根据原书定义FOLLOW 集中必然包含输入右端结束标记$——那一定是答案有误。这类细节没有原书参照很难发现。当你发现某一道题的推演过程和老师 PPT 里讲的不一样先别急着怀疑答案检查一下文法的形式是不是被规范化过。常见的差别在于有的课件把 ε-产生式显式写在文法里而原书直接把 ε 省略了导致 FIRST 集的结果在形式上看起来不一样实际等价。这类“差异不是错误”的情形在龙书第二版答案里经常出现所以做题的时候保留自己的推导过程比直接抄一个最终结论更有价值。3. 手推 FIRST 集、FOLLOW 集与 SLR 分析表答案里最常考的仿真模块龙书第二版课后题里最容易出现在考卷上的仿真题一个是文法分析里的 FIRST 集、FOLLOW 集求解另一个是基于这两个集合构造的 SLR(1) 分析表。这两个模块占据了第 4 章语法分析近一半的习题量同时也是各大高校期中期末考试的高频题目。下面我以文法G E → E T | T T → T * F | F F → ( E ) | id为例拆解答案里给的解题路径。这个文法在龙书第二版习题答案中出现过不止一次它的特点是有左递归适合考察消除左递归和 FOLLOW 集求解。你拿到答案时看到的应该是下面对应的完整过程。3.1 求 FIRST 集与 FOLLOW 集三步闭环漏一步就出乱子第一步求 FIRST 集。从终结符产出逐步处理非终结符。规则是如果一个产生式右部以终结符开头则该终结符属于左部非终结符的 FIRST 集如果以非终结符开头则把该非终结符的 FIRST 集整个加入左部的 FIRST 集如果非终结符可能推导出 ε则继续看下一个符号。对上例文法处理顺序和结果如下非终结符FIRST 集关键依据E{ (, id }E → TT → FF → id / ( E )T{ (, id }T → FF → id / ( E )F{ (, id }F → ( E )、F → id第二步求 FOLLOW 集的顺序恰好反过来先把$加入开始符号的 FOLLOW 集然后扫描每个产生式如果某个非终结符后面紧跟着终结符则这个终结符直接加入 FOLLOW 集如果后面跟着非终结符则把后面非终结符的 FIRST 集加入前面非终结符的 FOLLOW 集如果后面非终结符可以推导出 ε则把产生式左部的 FOLLOW 集加入前面非终结符的 FOLLOW 集。对上面的文法FOLLOW 集是这样闭合出来的非终结符FOLLOW 集关键依据E{ $, , ) }开始符号加 $E → E T 给 E 加 F → ( E ) 给 E 加 )T{ , $, ), * }E → E T 给 T 加 和 E 的 FOLLOWT → T * F 给 T 加 *F{ , $, ), * }T → T * F 给 F 加 * T → F 继承 T 的 FOLLOW这里有一个很常见的认知偏差FOLLOW 集中的元素全部来自终结符和$它不可能包含非终结符。如果你在答案里看到 FOLLOW 集合里出现非终结符那说明这份答案的推导存在错误。同时当某个产生式右部末尾是非终结符时别忘了把产生式左部的 FOLLOW 集传递过去很多人漏在这一步。做完以上两步可以顺手检查一遍对每个非终结符FIRST 集和 FOLLOW 集交集是否为空。如果存在交集说明文法不是 LL(1) 文法——这个检查结论在后面的分析表构造里会用到。3.2 构造 SLR(1) 分析表从项目集规范族到移进与规约的选择SLR(1) 分析表的构造步骤答案里通常按以下顺序展开。第一步构造增广文法在原始文法基础上加入产生式E → E并令其编号为 0作为新开始符号。第二步构造 LR(0) 项目集规范族每一步求闭包和转移函数。闭包运算的要点在于如果项目集中某个项目形如A → α · B β则所有形如B → · γ的产生式项目都要加入闭包中。第三步为每个项目集构造分析表表项这里有三个核心规则如果项目A → α · a β存在且a是终结符则在 ACTION 表中填入“移进”动作并转向目标项目集编号如果项目形如A → α ·即点在产生式末尾则对所有a ∈ FOLLOW(A)在 ACTION 表中填入“规约 r_i”i 是产生式编号如果项目基于增广文法的开始状态则对$填入“接受 acc”。完成这三个规则后你在答案里会看到一张完整的 SLR 分析表。这个表的主轴是状态编号表头是终结符和非终结符集合。对上面的文法动作表ACTION和转移表GOTO的组合大致如下这是我做这道题得到的一个标准结果记住它方便你对照自己算出的答案状态*()id$ETF0s4s51231s6acc2r2s7r2r23r4r4r4r44s4s11s51023这张表中 s 表示移进并转到对应状态r 表示用第 i 条产生式规约数字即状态编号。你核对答案时重点看三处第一状态 2 对 * 应该执行 s7因为T → T · * F第二状态 0 对 id 和 ( 都应该移进因为此时需要读取一个终结符再开始探索第三状态 1 遇到 $ 时 acc遇到 时 s6 移进。如果你算出来的结果与这张表有一到两处不一致说明你的闭包运算或者 FOLLOW 集传递出了问题可以回溯到 3.1 节重新推一遍。对上文文法求 FIRST、FOLLOW 和分析表的过程本质上就是龙书第二版习题里 80% 仿真题的通解路径。答案文档把这些步骤一字排开比老师 PPT 上跳步骤的演草要友好得多。但是要注意这份答案对 SLR(1) 的讲解偏“结果导向”它给出了最终的项目集闭包却没有把每一步闭包扩展时用到哪一条产生式都标全。这是文档的边界你得自己在草稿纸上补上。4. 用答案时的五个常见坑现象、原因、解决答案文档带来的好处很明显但在当助教以及自用的这几年里我观察到不少人把这份资料用错了方向最后不仅没提分反而踩了不少坑。下面五条是出现频率最高的踩坑记录每一条我都按“现象→原因→解决”来写希望能帮你避开这些雷区。4.1 现象答案里的题号和你的教材对不上你拿着第十四章的题目去查答案翻到文档末尾发现人家只写到第十二章或者第 170 页的练习题编号和你的教材差了两位数。原因通常是你手里的教材是清华大学出版社第三版中文版而这份答案基于英文原版第二版整理两版在题目排序上并不完全一致。解决先翻到答案的目录页对照章节名不按题号按知识点索引。比如你查“消除左递归”就去找第 4 章的对应小节而不是先去找编号。你若在检索时心理预期是第三版答案那大概率会踩空建议先确认版本再使用。4.2 现象答案的 FOLLOW 集结果和课件不一致你算出了一个非终结符的 FOLLOW 集是{ , $, ) }答案里却写{ , $ }拿去问老师老师说答案错了。原因部分习题答案在传播过程中经过多次 OCR 识别和人工校对终结符丢失是高频错误尤其是右括号、右花括号这类符号极易在识别时被吞掉。解决把 FOLLOW 集的检查自动化用作自检——重新验证一遍原书中 FIRST 集的求解过程如果答案中没有包含产生式末尾的非终结符“继承”产生的部分就需要你手动补推。对于这类疑似错误我一般会直接翻原书该节的示例参照相同结构确认后再判定。4.3 现象开卷考试时翻不到想用的内容平时用答案做题很顺到了开卷考试却发现没办法快速找到某一类题的解法。原因答案按章节组织而考题通常按“考点”组织。一道题可能把词法分析和语法分析揉在一起比如“为下面语言构造词法分析器”这个考点既涉及正则到 NFA 的转换又涉及 DFA 最小化。你按章节找一半另一半在别处自然翻不到。解决拿到答案后花二十分钟做一次“考点标签”把每一道题的考察点写在题目旁边比如标注“正则转 NFA”“DFA 最小化”“FIRST 集”“FOLLOW 集”。这样考前按考点顺序浏览而不是按题号浏览效率高很多。一个比较实用的做法是在手机备忘录里建一个简表输入关键词比如“FOLLOW”所有相关题目的编号就能一下蹦出来。4.4 现象代码题照着答案写完实验报告被判雷同有些学校的实验课要求提交“词法分析器核心代码”部分同学直接对着答案的代码做了小幅重命名后就交上去了。这非常危险因为答案里的代码片段在 GitHub 和各届学长笔记中流传甚广学校查重系统对这类代码的指纹匹配已经比较成熟。原因你把答案当成代码仓库而不是题解。解决只看关键算法的伪代码比如主循环里switch (state)分支的写法然后自己设计数据结构。答案里面通常用 C 字符数组做状态转移表你就可以改成 Java 的HashMapState, MapCharacter, State或者用 Python 字典实现自动机。从数据结构层面改变设计后代码的形态会和答案差异巨大既保留思路又避免查重。4.5 现象对着答案推一遍第二遍还是出错有同学反映看了答案的移进规约过程自己重新做一遍还是在闭包计算那一步卡住。原因答案为了省篇幅跳过了闭包运算的中间过程直接把闭包结果写在项目集里而你还没有形成“遇到点后面是非终结符就把它的产生式无条件加入”的条件反射。解决自己构造一张推导表把每一个项目集写成“核项目 展开项目”两列核项目是显式的初始项目展开项目是闭包推进过程中加入的。每次做题都强制自己写出这一行两三次之后闭包计算就不再是玄学。我自己之前用这个方法带过几个重修的同学效果比较明显至少这一部分闭卷考试能拿分。5. 把习题答案改造成“编译器设计排错手册”一个用了几年的整理习惯前面 4 章把答案的内容、用法和坑都过了一遍最后一章分享一个我认为投入产出最高的进阶用法把这份按章节组织的答案改造成一个按考点组织的排错手册。具体做法分四步。第一步准备一张 A4 纸或一个 Excel按编译流程分板块词法分析正则、NFA、DFA、最小化、语法分析消除左递归、提取左公因子、LL(1)、FIRST/FOLLOW、LR 系列、语义分析语法制导翻译、类型检查、中间代码生成三地址码、代码优化与目标代码生成。第二步把答案里的每一道题按它考察的核心能力归入对应板块比如“将正则表达式(a|b)*abb转换成 NFA再确定化为 DFA 并最小化”这道题就划到“词法分析DFA 最小化”。第三步在每个板块里把答案中那些“结论”和“过程”分离结论抄到板块标题下面过程留在原答案里。比如词法分析板块结论写“DFA 最小化先合并所有不可区分状态再重新编号”过程只在需要读解题步骤时翻阅。第四步考试或做实验前从头到尾用这张表自查哪个板块没有做过题哪个板块的结论还背不出来一目了然。这个习惯持续下来效果体现在哪里你会发现复习从“翻一本几百页的书”变成“扫一张一页纸”而每个板块你都至少亲手推过一两道仿真题心里有底。之前一位学生考完研跟我说复试笔试时看到求 FOLLOW 集的题脑子里直接浮现出自己归纳的步骤表几分钟就写完这在以前是不可想象的。从那以后我每次拿到新的习题答案不管是龙书还是虎书都会强制自己先按考点重排一遍再开始用——这份功夫花在刀刃上比反复刷三遍原题更扎实。希望这份第二版龙书习题答案和这套使用方法能帮你在编译原理这条路上少走一些弯路。本文还有配套的精品资源点击获取