☰
哈工大编译原理期末复习:词法分析、语法分析、语义分析核心考点与提分策略
2026/10/13 1:23:45 网站建设 项目流程

简介:面向软件工程与计算机专业学生的哈工大编译原理期末复习资料,围绕期末考点系统梳理编译系统结构与语言文法、词法分析、语法分析、中间代码生成、目标代码生成和代码优化全部核心模块。资料为1个PDF文档,约31.14MB,知识点排布紧凑,目录结构清晰,便于考前集中查阅与反复回顾。正文从编译系统结构及William Waite定义讲起,延伸至文法的形式定义与分类、CFG分析树、二义性文法,再到正则表达式与有穷自动机、DFA与NFA识别原理及其等价转换,接着覆盖语法分析树构造、三地址码与四元式等中间表示,最后落到目标代码生成的寄存器分配以及代码优化策略,各章节层层递进,并配有期末复习要点总结,可直接对照查漏补缺。当前已有2311人学习下载,适合计算机专业考前突击、期末系统复习以及备考考研的学生使用。

1. 哈工大编译原理期末复习:内容这么多,考前先抓哪一块才不吃亏

期末复习编译原理,大多数人的第一反应是“这也太多了”。词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成,每章都有能出题的点,几百页课件翻起来满眼都是 FIRST、FOLLOW、LR(1) 这类越看越陌生的符号。很多人复习到一半就换了一套方法:先刷课后题,再背概念,过两天发现前面刷过的又忘了。于是有了一个有点反常识的结论:编译原理期末能不能拿高分,常常不取决于你把每个算法背得多熟,而是取决于你能不能按卷面上的分值权重分配复习时间。这篇文章就是按哈工大期末常见的题型布局,把词法分析、语法分析、语义分析这条主线一层层拆开,最后给一份直接能用的避坑清单和考前压缩方法。适合正在备考期末的同学、准备补考的考生,也适合用同类教材自学但找不到复习重点的人。

2. 词法分析复习:正则式到最小化 DFA 的完整拿分步骤

2.1 词法分析考什么:正则式转 NFA/DFA 为什么几乎每年都出现

哈工大期末卷面的词法分析部分,通常是一道 10 到 15 分的题放在卷面靠前位置,形式非常固定:给一个正则式,比如letter(letter|digit)*或a(b|c)*d,要求用子集构造法构造 NFA 转 DFA,然后对 DFA 做最小化。有时候会反过来,给一段词法规则,要求画出状态转换图,再写出识别程序的核心逻辑。这个考点说穿了就是把正则表达式变成计算机能执行的有限自动机,是整个编译过程的前置关卡。

为什么这道题几乎年年考?因为词法分析是整个编译原理里最规整的部分,算法流程固定,没有太多歧义,非常适合笔试。同时,后面语法分析里的终结符匹配也是建立在词法分析产生的 token 流基础上的,老师用一个题就能同时考察正则表达式、有限自动机、状态转换图三个知识块。复习时不要把它想象成写工程代码,期末更看重手推过程:写出 NFA、填 DFA 状态转换表、划最小化等价类。熟练以后,一道题从动笔到写完大约控制在二十分钟内,考试才不会挤压后面的语法分析大题时间。

这里还有一个容易被忽视的考点:正则式和有限自动机的等价性,偶尔会出简答题,比如“为什么任何正则式都能构造出等价的 NFA”。复习时可以把它当作一个小知识点记下来,不需要展开证明,只要写清楚 Thompson 构造法对空串、字符、连接、选择、闭包五种情况的构造思路即可。

2.2 手工构造词法分析器的五个步骤与检查点

复习词法分析,我习惯分五个步骤走,每一步都有固定写法,考试时可以照着往下写。

第一步,把要识别的单词用正则式描述出来。比如标识符是letter(letter|digit)*,关键字是if|else|while这类枚举,整型常量是digit(digit)*。如果题目给的是中文描述,比如“以字母开头的字母数字串”,要能先转成正则式再继续做,转错了后面全错。

第二步,按 Thompson 构造法把正则式拆成 NFA。拆的时候注意三个基本连接规则:两个结构首尾相接,只需要把前一个的终态指向后一个的初态并加一条 ε 边;选择结构a|b要新增一个初态和终态,分别用 ε 边连接到两个分支;闭包结构a*则在原结构上增加两条 ε 回路,一条从新增初态到原结构初态,一条从原结构终态回到新增初态。拆 NFA 时最容易犯的错是漏画 ε 边,因为下一步的 ε 闭包计算完全依赖这些边。

第三步,从 NFA 初态出发做子集构造。具体做法是:把 NFA 的初态和所有能通过 ε 边到达的状态合并成一个集合,记为 DFA 的初始状态,然后对每个输入符号 a,找出该集合中所有状态经过 a 边能到达的状态,再对这些状态求 ε 闭包,得到 DFA 的下一个状态。每生成一个新状态都要检查它是否包含原 NFA 的终态,包含了就标记为 DFA 终态。这一步的检查重点是:每次求闭包后,看看集合里的状态是否还有没走到的 ε 边,直到集合对 ε 边封闭为止。

第四步,DFA 最小化。先把所有状态分成终态和非终态两个集合,然后逐个检查:对当前划分中的每个状态集合,看它们在输入符号 a 下分别转移到哪个现有集合。如果同一个集合里的两个状态在某个输入符号下转移到不同集合,就把它们拆开。重复这个过程直到所有集合都没有进一步拆分。最小化前可以先把从初态不可达的状态删掉,减少工作量。

第五步,根据 DFA 写识别函数。考试如果让写程序,一般有两种写法:状态转换表驱动,或者用条件分支直接模拟。状态转换表的写法是把当前状态作为行、输入符号作为列、下一状态作为表项,每次读入字符查一次表,最后看是否停在终态。这种写法的好处是代码结构和 DFA 一一对应,老师批改时很容易给步骤分。

以识别“标识符或关键字”为例,常见的状态转换表可以设计成:状态 0 是初态,读字母进状态 1,读数字留在状态 0 即错误;状态 1 读字母或数字都回到状态 1,读其他字符则结束识别,然后查关键字表区分是关键字还是普通标识符。这样的表在考试中经常出现,复习时把“最长匹配”和“先识别再查关键字表”这两个规则记牢。

2.3 词法分析复习的优先级判断

词法分析这一章不要平均用力。第一优先是“正则式 → NFA → DFA → 最小化”这条完整链路,建议每一道例题都完整手推两遍,不要只看结论。第二优先是状态转换图与识别函数写法,因为实验课里很多人用 Java 或 C++ 写词法分析器,换到期末手写题时容易写出几十行代码还漏掉最长匹配,所以要把“状态转换表驱动”这个思路练熟。第三优先才是正则式转 NFA 的定理证明,通常只考选择或简答,花十分钟背结论就够了。

这里有一个很多同学踩过的坑:实验课里用面向对象方式写了词法分析器,到期末做手算题时还在回忆代码细节,把 NFA 转 DFA 的子集构造法反而忘了。复习时一定要把实验实现和手算算法分开。实验能帮你理解 token 流的处理过程,但期末考的是算法过程,不是程序工程。如果你实验课用的是 Java,那就要注意“java+编译原理”这个组合在期末复习时容易让人误以为写代码比推算法重要,实际恰恰相反。

3. 语法分析复习:FIRST/FOLLOW 与 LL(1)、LR 分析表的构造顺序

3.1 语法分析为什么是重点:题型分布与复习顺序

语法分析是哈工大编译原理期末复习的绝对重心。往届卷面里这一块的分值通常在 25 到 35 分之间,经常是一道 LL(1) 大题和一道 LR 大题,中间穿插递归下降或二义性判断的小题。这就决定了复习顺序不能乱。我个人的经验是:先专门练 FIRST 集和 FOLLOW 集的计算,因为不管是 LL(1) 预测分析表还是 SLR(1) 的归约符号判断,都依赖这两个集合的计算结果。第一步做 LL(1) 文法判定与预测分析表构造,第二步做 LR(0) 项目集和 SLR(1) 分析表。如果时间还有富余,再看递归下降子程序怎么把产生式改写成 EBNF,以及如何处理左递归。

为什么不建议一开始就拿到 LR(1) 的完整构造去啃?因为 LR(1) 项目集数量多,向前搜索符号的计算繁琐,期末卷面很难容纳完整的表,通常只考与 LALR 的区别这类概念题。把 LL(1) 和 SLR(1) 练熟,性价比高很多。这里还涉及一个容易忽视的问题:文法二义性判断。如果题目问某文法是否二义性,最常用的方法是看是否存在一个句子有两棵不同的语法分析树;在 LL(1) 框架下则表现为预测分析表存在一个格子多条产生式。我建议把它和 FIRST/FOLLOW 一起复习,因为二义性经常会导致 FIRST 集或 FOLLOW 集出现交叉现象。

3.2 FIRST 集和 FOLLOW 集:每一步写下来就不容易漏

FIRST 集考的是“一个符号串可能以哪些终结符开头”。手算时按下述顺序做最稳妥。

对每个非终结符 X,先看产生式右部第一个符号。如果它是终结符 a,就把 a 加入 FIRST(X)。如果它是非终结符 Y,就把 FIRST(Y) 中除 ε 外的符号加进来,并且如果 FIRST(Y) 含 ε,就继续看产生式右部的下一个符号。如果一直看到产生式末尾,说明 X 可以推导出空串,就把 ε 加入 FIRST(X)。这里的常见错误是看到第一个符号是非终结符就不再往下看,导致漏掉一批通过空串传导的终结符。

FOLLOW 集的定义是“在某个句型中紧跟在一个非终结符之后可能出现的位置”。计算时先给文法开始符号加入 $,然后反复应用两条规则。规则一是对形如 A → αBβ 的产生式,把 FIRST(β) 中除 ε 外的所有符号加入 FOLLOW(B)。规则二是如果 β 能推导出 ε,或者产生式就是 A → αB,那么把 FOLLOW(A) 的所有符号加入 FOLLOW(B)。注意规则二需要累积传播,所以要循环到没有变化为止。

举个例子说明:文法 S → A B,A → a | ε,B → b。先算 FIRST:FIRST(A) = {a, ε},FIRST(B) = {b},FIRST(S) = FIRST(A) ∪ FIRST(B) 中除 ε 部分,结果是 {a, b}。再算 FOLLOW:给 FOLLOW(S) 加入 $,然后看产生式 S → A B,把 FIRST(B) = {b} 加入 FOLLOW(A),又因为 B 不是空串,FOLLOW(S) 不会传给 FOLLOW(A)。接着 A → a | ε 不影响 FOLLOW。最终 FOLLOW(S) = {$},FOLLOW(A) = {b},FOLLOW(B) = {$}。这个例子简单,但能看出一个关键点:FOLLOW 里永远不应该出现 ε。

还有两个容易丢分的点。第一,FOLLOW 集里不会有 ε,从 FIRST(β) 取符号时必须把 ε 丢掉。第二,规则二的传播不是一次就结束的,比如有产生式 S → A,A → B,那么 FOLLOW(S) 的 $ 会先传给 A,再由 A 传给 B,要循环到不再增加为止。平时练习时最好在纸上把每一轮新增的符号标出来,写清楚“这一轮没有变化,停止”,考试时也能少一个隐患。不要只核对课后习题答案,第一次算就尽量完整写在纸上,答案只能用来验证,替代不了自己推的过程。

3.3 LL(1) 预测分析表与 SLR(1) 分析表的构造:亲手走一遍才算会

LL(1) 预测分析表的构造是自顶向下分析的主要关卡。填表时对每个产生式 A → α 考虑两件事:对 FIRST(α) 里的每个终结符 a,把 A → α 填入 M[A][a];如果 α 能推导出 ε,那么对 FOLLOW(A) 里的每个终结符 b,也把 A → α 填入 M[A][b]。如果一个格子出现了两条不同的产生式,说明文法不是 LL(1)。做这道题时,最稳妥的步骤是先把所有非终结符按行列出,再逐条产生式去填,不要边推导边填,否则很容易漏掉通过 ε 传导产生的填表项。

LR 分析表构造则以 LR(0) 项目集为基础。先写拓广文法 S' → S,然后从项目集 I0 = closure({S' → ·S}) 出发,反复对每个符号 X 求 goto(I, X),生成整个项目集规范族。每个项目集对应一个 DFA 状态。构造 SLR(1) 分析表时的动作比较固定:遇到移进项目,就把 ACTION 填为移进;遇到归约项目 A → α·,对 FOLLOW(A) 中的所有终结符填归约;如果归约左部是开始符号且输入是 $,则填接受。注意这里的 FOLLOW 集必须单独计算并标注在项目集旁边,不要临时去翻前面的计算过程。

考试时构造 SLR(1) 分析表,建议用一张大表来组织:左侧列出项目集状态编号,中间写出每个状态对应的活前缀和项目集内容,右侧分别列出 ACTION 和 GOTO 表。这样写虽然慢,但老师阅卷时能按步骤给分,就算最后结果有错,前面的项目集正确也能拿到一部分分数。我自己复习时做过很多次对比:直接把 ACTION 和 GOTO 混在一起写,容易漏填,分栏写基本不出错。

3.4 自底向上分析的复习投入:LR(1) 该学到什么程度

很多同学学完 LR(0) 之后直接冲到 LR(1),被向前搜索符号的计算绕晕,最后没时间复习中间代码生成。实际上哈工大期末的自底向上部分一般在 SLR(1) 就收住,LR(1) 和 LALR 多半以选择或简答出现,比如“LR(1) 与 LALR(1) 的区别”“合并同心项目集可能产生哪类冲突”。原因是完整的 LR(1) 分析表太大,笔试基本无法完整呈现。

所以复习建议是:花百分之三十的时间把 LR(1) 项目的向前搜索符号含义搞清楚,再花百分之二十记住 LALR 合并的结论,剩余时间全部用来刷 LR(0) 和 SLR(1) 的构造题。刷题时要注意,LR(1) 项目闭包中,搜索符号是按“紧跟在该项目右部剩余符号之后的 FIRST 集合”来传播的,不是简单复制左部的 FOLLOW。理解了这一点,LR(1) 的概念题就基本过关。另外还有一个常考判断题:LALR(1) 合并同心状态后不会产生新的移进归约冲突,但可能产生归约归约冲突。这个结论很多同学记反,考前单独标出来。

4. 语义分析与中间代码复习:SDD、符号表与三地址码的考点闭环

4.1 语法制导定义和翻译方案:把语义动作落到产生式上

语法分析树只解决了“句子是否符合文法”的问题,真正要计算表达式的值、生成代码,还需要给产生式附加语义规则。哈工大期末在语义分析这块的常考形式是给出一个简单的表达式文法,要求为某个产生式补充语义规则,或者给出一个语法制导定义,要求写出带注释的分析树和三地址码。

复习时要分清两个维度。按属性求值方向分综合属性与继承属性:综合属性依赖子节点的属性,在自底向上分析里很容易实现;继承属性依赖父节点或兄弟节点,在递归下降中更容易实现。按计算方法又分 S 属性定义与 L 属性定义。考试如果问“为什么 S 属性定义适合自底向上”,可以回答:因为自底向上分析是边归约边计算,归约时子节点的综合属性已经在栈里,可以直接传给父节点。

语法制导翻译方案(SDT)是把语义动作嵌入产生式的版本。如果动作写在产生式末尾,在 LR 分析中归约时执行即可;如果动作写在产生式中间,就需要引入一个标记非终结符 M → ε,让动作在 M 被归约时执行。这个考点需要配合栈操作理解。考试常考的类型是:给定一个 SDT,要求写出在递归下降子程序中对应的代码片段,或者说明在移进归约分析时如何取用栈上属性。关键要把握两点:一是标记非终结符必须插在动作执行位置,二是在 LR 分析中,动作执行时栈顶的项目是 M 的归约结果,属性值也从对应栈区获取。

4.2 符号表考点:作用域栈与最近嵌套规则

符号表是编译原理里很容易被低估的考点,但哈工大期末选择或简答几乎每届都有。关键知识点包括:符号表项存放什么、线性表与散列两种组织方式在插入和查找上的差别、栈式符号表如何配合作用域的管理。比如在类 C 语言里进入一个块就压入一层作用域,退出块就弹出,查找变量时从当前作用域出发逐层往外找,里层同名变量会遮蔽外层同名变量。考试常给一段带嵌套的代码,让画出进入内层块前后符号表栈的内容,或者回答指定位置访问某个变量命中哪一层。

举个例子说明。外层声明 int x;进入内层块后声明 int x 和 int y,此时符号表栈有两层,内层 x 遮蔽外层 x。如果在内层块里访问 x,命中内层 x;退出内层块后访问 x,命中外层 x。如果想访问内层 x 而它已出栈,在静态作用域规则下是不合法的。这类题的解题关键是画栈,不要在心里想象。每次访问变量时从栈顶往下逐层查找,找到第一个同名校验类型和声明位置,命中后停止。

实验课里有人用哈希表实现了符号表,期末复习时可以想一想如果用线性表,插入和查找的时间复杂度怎么变化,这也是高频选择题。线性表插入快、查找慢,哈希表查找快、但需要处理冲突。实际编译器常用哈希表,因为符号表查找频率远高于插入。

4.3 中间代码生成:三地址码翻译与布尔表达式回填

中间代码生成的期末大题通常落脚在三地址码。要熟练写出常见语句的翻译模板:赋值语句生成普通运算指令,if和while需要生成条件跳转和无条件跳转。这里最常见的手写题是布尔表达式的短路翻译。表达式a < b or c < d不能简单生成两条独立比较指令,而要设计真链和假链,让第二个条件只在第一个条件为假时才执行。翻译时用回填技术:先把跳转目标留空,等后续信息足够后再统一填上标号。

复习时建议按这个流程练:先写出不带回填的三地址码,给每个跳转指令先编上虚拟编号,再一遍遍回填。比如对if a < b goto True; goto False;的写法,重点看真假出口是否匹配。带有and/or的表达式更容易出错,尤其注意or的真入口与and的真入口对应的“下一个条件”位置不同。这道题一旦掌握套路,考场可以省略一部分推演直接写出结果。

另外一个常考小点是类型转换。比如整型和浮点型相加时,需要生成(float) x这样的显式类型转换指令,选择题偶尔会出现。这类题与语义分析里的类型检查呼应,复习时可以一并记忆:类型转换分隐式和显式,隐式转换规则参看编译原理教材里的“通常算术转换”,显式转换则对应一目运算指令。

5. 期末复习常见问题排查:五个翻车点和对应的纠正方案

5.1 现象:正则式转 DFA 时初始闭包漏项,后面全错

这个问题我在前面的步骤里强调过,但复习中几乎每次都能在作业里看到。现象是:从 NFA 初态出发做子集构造时,只把初态自己写进第一个 DFA 状态,漏掉了从初态通过 ε 边能到达的其它 NFA 状态;或者反过来,把 ε 闭包重复计算导致状态数变多。原因是 ε 闭包的定义没有落实到操作层面,只记得“集合内状态可相互到达”,动手时却没有系统收集。

解决方法是把每一步都写成集合形式。每生成一个新的 DFA 子集,先在右边标注它对应的 NFA 状态编号集合,再检查一遍该集合里所有状态是否还有 ε 边指向未收录的 NFA 状态,直到不再增加为止。平时做题可以把 NFA 图放大,用虚线标出 ε 边,检查时逐条核对。考试时如果发现 DFA 状态数量异常偏少,十有八九就是闭包漏项,回头查初态的那一条 ε 链。

5.2 现象:FOLLOW 集每逢 ε 必错,FOLLOW 永远不应该出现 ε

很多同学在计算 FOLLOW(B) 时,如果遇到 A → αBβ 且 β 能推导出 ε,会把 ε 也写进 FOLLOW(B)。这个错误影响很大,因为后面填 LL(1) 表和 SLR(1) 表时会把终结符集合搞混。原因是把 FIRST(β) 的结果直接搬进 FOLLOW,没有过滤 ε。

解决办法是记住 FOLLOW 的语义是“紧跟其后的终结符”,终结符集合里没有空串。每次做这一步都强制自己写“去掉 ε”,遇到 β 为空串的情形改用传播规则,也就是把左部非终结符的 FOLLOW 全部复制过来。做完一组 FOLLOW 后从头再扫一遍,直到没有新增为止。如果出现 FOLLOW 里有 ε,立刻检查是不是把 FIRST 和 FOLLOW 的规则混用了。

5.3 现象:SLR(1) 冲突判断只看项目数量,不看集合是否相交

判断 SLR(1) 分析表是否存在冲突时,最容易翻车的就是看到某个项目集里既有 A → α· 的归约项目,又有 B → β·aγ 的移进项目,就急着写“有移进归约冲突”。实际上冲突判定要拿具体输入符号说话:只有当 a 同时属于 FOLLOW(A) 时,分析器才会在面临 a 时既想移进又想归约,这时才算冲突;如果 a 不在 FOLLOW(A) 里,则输入是 a 时唯一动作是移进,不冲突。两个归约项目同时存在也同理,需要检查 FOLLOW(A) 与 FOLLOW(B) 的交集是否非空。

这一条必须在考前反复练习几次,因为考试卷面如果出判断题或简答题,喜欢在这个点上设陷阱。解决方法是每遇到一个项目集都用表格列出“移进符号集合、各归约左部的 FOLLOW 集合”,再做交集判断,不要扫一眼就下结论。我自己复习时曾经在 SLR(1) 分析表上花了很多时间,最后发现一个项目集里同时有归约和移进但不冲突,才彻底理解冲突是“对同一个符号有两个动作”,而不是“一个项目集里有两个动作”。

5.4 现象:语义动作写在产生式中间,自底向上分析时不知道在哪执行

写翻译方案时,经常会在产生式右边中间位置插入打印或赋值动作。在递归下降子程序中,动作可以按顺序直接写成代码,这很好理解;但在 LR 分析时,中间动作无法直接在栈上执行,因为归约动作是在整个产生式右部被归约时才触发的。现象就是考试让“给出该 SDT 对应的 LR 翻译动作”时,有人直接照抄递归下降的写法,失分。

原因是没有引入标记非终结符。解决办法是在需要执行中间动作的位置插入一个 M → ε 产生式,并为 M 关联语义动作。在分析过程中,当 M 被归约时,动作就会在正确时机执行。复习时多画几遍带有 M 的语法树,就能把“归约时机”和“动作时机”对上。如果题目明确要求用递归下降实现,则不需要标记非终结符,直接在大括号里写动作即可。区分这两种场景,是这道题拿满分的前提。

5.5 现象:复习把重心全压在大题上,符号表与代码优化等零散考点集体失分

哈工大期末卷面里除了算法大题,还有约二十分的选择、填空和简答,覆盖编译原理的边角内容,包括符号表、运行时存储组织、代码优化与目标代码生成。常见现象是考前疯狂刷 NFA/DFA、LL/LR 大题,等卷子上出现“活动记录里静态链的作用”“基本块内优化有哪些方法”时茫然无措。

原因很简单:复习计划里根本没有给概念题留时间。解决办法是考前留出两个完整的晚上,把符号表、活动记录、优化概述、目标代码生成这四块的内容快速过一遍,每块整理出一两句话的核心结论。比如活动记录的静态链指向外层函数的活动记录,动态链指向调用者的活动记录;基本块内常见优化有删除公共子表达式、复写传播、死代码删除。这类知识点已经背住就有分,完全不需要计算。如果时间实在不够,优先背符号表和作用域,因为这块出现在卷面上的概率最高。

6. 考前一周的一个压缩技巧:用“题型×知识点×易错点”三层表代替翻书

复习到最后一周,如果还在全书一章一章地翻,效率会很低。我自己的做法是把整门课压成一张三层表,按“题型 → 对应知识点 → 我的易错点”来组织。表的第一列放卷面上容易出现的题型,第二列写该题型涉及的知识点和标准步骤,第三列记自己刷题时错过的地方。下面的表是一个简化示例,你可以根据自己刷题的错题情况来扩充。

题型知识点与标准步骤易错点
正则式转 DFA拆 NFA → ε闭包 → 子集构造 → 最小化初态闭包漏项;终态集合忘标记
FIRST/FOLLOW 计算先 FIRST 后 FOLLOW;循环到不动点FOLLOW 中误加 ε;传播轮次不够
LL(1) 表构造FIRST 填表 + ε 用 FOLLOW 填表同一格子多条产生式忘判非 LL(1)
SLR(1) 分析表拓广文法 → 项目集规范族 → 按 FOLLOW 填归约冲突判断不考虑 FOLLOW 交集
三地址码翻译按语句模板生成 + 布尔回填真假链回填标号错位
符号表概念栈式作用域、最近嵌套、查找顺序内层遮蔽后忘记仍从栈顶逐层找

这张表每天睡前花二十分钟过一遍,不翻书,在一张纸上默写每个题型的第一步是什么。第二步如果卡住,就在对应格子里画一个记号,次日专门翻课件解决。这样做的好处是把复习从“熟悉”推向“能输出”,考场上遇到原题或变体题时,第一步的套路能立刻浮出来。我复习时还会在表格右侧再加一列“验证方法”,比如 FIRST/FOLLOW 计算完了用 LL(1) 表填充来反向验证,如果填表不冲突,大概率算对了。

我自己曾经吃过最大的亏,是复习语法分析时一头扎进 LR(1) 的完整构造,耗费大量时间,结果期末选择里的符号表和作用域题丢了分。后来再复习其它课程,我都先做三层表,把必考题型和冷门考点一起纳入分配,复习的投入产出比明显不一样。这个习惯对哈工大编译原理期末至少帮我稳住了基础分,也让考前最后一周不再是一种“翻开书都会、合上书全忘”的状态。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询