☰
编译原理期末复习:LL(1)分析表与四元式翻译实战解析
2026/10/12 1:06:14 网站建设 项目流程

简介:这是一份编译原理期末复习资料,将常考题型与答案解析整合在一份PDF中,适合计算机相关专业正在备考编译原理期末考试的本科生使用。内容覆盖填空题、选择题与解答题三种题型,涉及静态/动态存储分配、规范规约、表达式后缀式与数组地址计算、FIRST集与FOLLOW集构造、LL(1)分析表、算符优先文法、移入-规约分析、语法制导翻译及中间代码四元式生成等核心考点,并附有对应的答案或解题过程。对于while循环语句翻译、布尔表达式回填等易考大题,资料中也给出了参考翻译模式和详细分析步骤,可帮助读者对照理解语法分析器与代码生成的工作原理。资源为单个PDF文件,大小仅386KB,便于下载后打印或快速查阅。目前已有455人学习,适合想通过典型题目巩固编译原理重点、系统梳理期末出题思路并查漏补缺的同学使用。

1. 编译原理期末考试题及答案 PDF:考前一周能不能靠它冲分

编译原理期末考试向来不是靠背就能过的,尤其解答题里的 LL(1) 分析表和四元式翻译,套路固定但细节极多,一步算错整张表就废了。这份 PDF 收录了多套完整期末试卷和配套答案,题型覆盖填空、选择、判断、名词解释、简答和计算题,内容从词法分析一路推到目标代码生成,几乎把课程全部核心考点包进来了。对考前需要集中刷题的本科生来说,它最值钱的地方是答案不光是结论,连 FIRST/FOLLOW 集合计算、四元式顺序、句柄标注这些细节都写出来了,可以直接对照自己的解题过程找差距。对考研复试准备者同样有参考价值,可以用它快速检验自己对语法分析、语法制导翻译的掌握程度。

2. 卷面结构拆解:题型分布、分值逻辑与复习策略

2.1 填空题与选择题覆盖的基础概念

以第一套卷子为例:填空题每空 2 分共 20 分,选择题每问 2 分共 20 分,解答题 60 分。填空考得最勤的可以归成五类:存储分配策略、编译阶段划分、后缀式转换、属性分类、数组地址计算。这五类都有一个共同特点——存在"标准答案式"的表述,不能自由发挥。比如动态存储分配又分为栈式和堆式,如果考场上写"链式""队列式",概念上沾边但阅卷不会给分。资源答案对这个空位的限定非常严格,属于纯记忆型得分点。

编译阶段划分那道题也值得单独说。标准表述是"词法分析、语法分析、语义分析与中间代码生成、代码优化及目标代码生成",另外还有表格管理和出错处理。不同教材对阶段的命名略有差异,但考试填空的答案顺序要按卷面提供的框架填。资源答案给出的五个阶段顺序就是阅卷标准,记忆时最好连顺序一起背,不要只记阶段名称不记前后关系。

后缀式也就是逆波兰式,是填空和简答的常客。表达式 x+yz/(a+b) 的后缀式是 xyzab+/+。处理顺序很关键:先算 y*z,再算 a+b,然后做除法,最后做加法。写后缀式的口诀是"操作数顺序不变,运算符按优先级后置",括号内的运算要整体先出现。数组地址计算那道题给的是按行存放、每个元素占一个存储单元,a[1..15,1..20] 的元素 a[i,j] 地址为 a+(i-1)*20+j-1。这类题唯一容易出错的是下标从 1 开始而不是从 0 开始,公式里的 -1 就是解决这个问题的。

选择题部分,多选题的计分规则值得注意。资源里明确写了"选对一个得 1 分且不超过满分,选错一个扣一分,扣完为止",这意味着不确定的选项不要乱选。二义文法的判据包括:存在句子有两个不同的最左推导、两个不同的最右推导、或两棵不同的语法树。单选里"上下文无关文法包括四个组成部分"答案是产生式和开始符号;"递归下降分析法"属于自顶向下分析;"算符优先分析法"特别适用于表达式分析;"经过编译得到的目标程序"是机器语言程序或汇编语言程序。这些选择题答案都配有标准选项,可以直接当 flashcard 背。

2.2 解答题的五种题型与评分细则里的答题信号

解答题占 60 分,资源里透露了不少阅卷信号。第一类大题为 LL(1) 文法,通常给一个含左递归的文法,要求改写成 LL(1)、计算 FIRST/FOLLOW、构造分析表。评分标准里专门写了"没考虑 # 扣 0.5 分,其它错或少写一个扣 0.5 分",说明 FOLLOW 集合漏了结束符 # 是高频错误。但单个集合元素出错只扣小分,不会一错全错。

典型 LL(1) 大题三步: 第一步:消除左递归 第二步:计算 FIRST 集和 FOLLOW 集 第三步:填写预测分析表并检查冲突

先记住这个骨架。第二步里判断 FIRST 时看产生式右部第一个符号:如果第一个是终结符,直接收进 FIRST;如果第一个是非终结符,把它的 FIRST 并进来;如果这个非终结符能推出 ε,还要继续看后面的符号。FOLLOW 则反过来,开始符号先放 #,然后在每个产生式右部找目标非终结符,看它后面跟什么,后面跟终结符就收终结符,后面跟非终结符就收它的 FIRST 去掉 ε,后面没东西就把左部的 FOLLOW 传过来。

第二类大题为规范推导,要求给出句子的规范推导过程、每步句柄和语法树。评分标准写"写错推导符号扣 0.5 分,最左推导扣 2 分"。推导符号要用 ⇒ 而不是 →,方向从开始符号往下推。规范推导就是最右推导,每步替换当前句型最右边的非终结符,这一点很多同学栽过。

第三类大题是语法制导翻译的打印模拟。给几个产生式和打印动作,让你推导给定输入串分析过程中的打印输出。解法是把移入-规约过程一步步写出来,每次规约时执行对应产生式的打印动作,最后把所有打印字符拼起来。资源里 aacbb 的答案是 12020,写分析过程时每步栈内容、输入串和规约产生式都要写清,不能跳步。

第四类大题是翻译 while-if 嵌套语句,要求给出带注释的分析树和四元式序列。这里用到的翻译模式包含回填技术:E 产生式生成两个跳转四元式,一个真出口一个假出口,M 产生式记录当前四元式序号,S 产生式做 backpatch。做这类题时,我习惯先用缩进写出嵌套结构,再按结构层次从左到右生成四元式,最后统一回填。

第五类大题是算符优先。要求计算 FIRSTVT/LASTVT、构造优先关系表、判断是否为算符优先文法、构造优先函数。判断条件有两条:任何两个非终结符不相邻;任意两个终结符之间最多满足一种优先关系。满足这两条就是算符优先文法,资源里给出的判断结果也说明了这一点。

2.3 名词解释、判断题与简答题的复习优先级

资源后半部分出现了判断题、名词解释、简答题和计算题。判断题的答案基本都在填空选择题的范围内,可以用对错题来检验自己对易混淆概念的掌握。名词解释里有几个高频词需要重点看:句柄是一个句型的最左直接短语;素短语是至少含一个终结符且不包含更小素短语的短语;规范句型是由规范推导得到的句型;DISPLAY 表是过程的嵌套层次显示表,记录当前过程和所有外层过程的最新活动记录地址;待用信息描述基本块内变量定值与引用之间的关系。

简答题里的参数传递是另一个高分区。传地址、传值、传名三种方式在程序输出题里表现差异很大。资源里的例子 procedure p(x,y,z) 中有 y:=x+y,如果是传地址调用且实参是 A,那么形参和实参共享同一存储单元,A 的值会跟着变;传值只拷贝初值,过程内修改不影响实参。做这类题的技巧是先把形参和实参的地址绑定关系画出来,不要直接心算。资源答案里给出了明确结果:传地址 A=6、B=16,传值 A=2、B=4。

简答题还考了正规式和优化方法。写正规式要看清语言约束条件,比如"不以 0 开头的偶数集"要拆成首位非零数字加后续任意数字、最后一位为偶数。基本优化方法包括删除公共子表达式、复写传播、删除无用代码、强度削弱和循环优化。这些属于"背了就能拿分"的内容,建议放到考前最后一天再看。

3. LL(1) 分析表构造实操:从消左递归到句子判定的完整流程

3.1 消除左递归:从 E→ETE 到引入 E'

资源第一套解答题第 1 题给了文法 G[E]:E→ETE|(E)|i,T→*|+。这个文法最大的问题是 E→ETE 直接左递归,产生式右部第一个符号就是 E 自身。LL(1) 分析要求同一非终结符的各个候选式 FIRST 集互不相交,含左递归的文法无法直接构造分析表。

消除直接左递归的通用做法是套公式:A→Aα|β 改写成 A→βA',A'→αA'|ε。这里把 E→ETE 看成 E→Eα,α 就是 TE,β 是 (E)|i。改写后的结果为:

E → (E)E' | iE' E' → TEE' | ε T → * | +

改写后 E 不再出现在自己产生式右部的开头,左递归被消除。T 的产生式保持不变。这里容易犯的错误有两个:一是把 E' 写成 TE|ε,丢掉了末尾的 E',导致递归无法在推导中延续;二是自作主张把 T 的产生式也合并进 E',导致文法层次混乱。正确做法是严格套用公式,保持 T 独立。

3.2 FIRST 与 FOLLOW 集合计算顺序与易错参数

FIRST 集合的计算顺序是先终结符、再单层非终结符、最后多层推导。计算规则只有三条:终结符的 FIRST 就是自身;A→aβ 的 FIRST 含 a;A→Bβ 的 FIRST 含 FIRST(B),B 能推出 ε 时还要把 β 的内容并进来。按此顺序,这道题的 FIRST 集合结果很清晰:

FIRST(T) = {*, +} FIRST(E') = {*, +, ε} FIRST(E) = {(, i}

FOLLOW 集合的规则稍复杂,我分三步执行:先给开始符号的 FOLLOW 加 #;然后逐个扫描产生式右部,看目标非终结符后面跟什么;如果后面紧跟终结符,直接收进;如果后面跟非终结符,把它后面非终结符的 FIRST 去掉 ε 并进来;如果后面能推出 ε 或者后面没有内容,把产生式左部的 FOLLOW 并进来。照这个流程计算结果:

FOLLOW(E) = {), *, +, #} FOLLOW(E') = {), *, +, #} FOLLOW(T) = {(, i}

注意 FOLLOW 的传递方向容易错。E→(E)E' 里 E 后面跟 E',而 E' 能推出 ε,所以 FOLLOW(E) 要把 FOLLOW(E') 并进来;反过来 E' 在产生式末尾,也要把 FOLLOW(E) 传给它。这个双向传递不建议硬背,用"后面为空就向上传递"这句话判断。资源答案特别提醒没考虑 # 扣 0.5 分,每个集合少一个元素扣 0.5 分,扣完为止,所以宁可多检查也不要漏写。

3.3 构造 LL(1) 分析表与符号串判定过程

分析表的填写方法是:对每个产生式 A→α,先计算 FIRST(α)。如果 α 不能推出 ε,把 A→α 填入每个终结符 a∈FIRST(α) 对应的 (A,a) 位置;如果 α 能推出 ε,把 A→α 填入每个 b∈FOLLOW(A) 对应的位置。资源参考答案给的分析表如下:

( ) i * + # E E→(E)E' E→iE' E' E'→ε E'→TEE' E'→TEE' E'→ε E'→ε T T→* T→+

从这张表能直接判断 LL(1):每个格子最多只出现一个产生式,说明没有分析表冲突,改造后的文法是 LL(1) 文法。注意 E' 在 )、*、+ 列都有内容,但对应的是 ε 和 TEE',分属不同列,不是同一格子的冲突,不影响判定结论。

符号串判定是 LL(1) 大题的收尾步骤。资源第二套卷子用的是 S→aBc|bAB、A→aAb|b、B→b|ε,判断 baabbb 是否为该文法的句子。完整分析过程可以这样模拟:

步骤 符号栈 输入串 规则 0 $S baabbb$ S→bAB 1 $BA aabbb$ A→aAb 2 $BbAa abbb$ A→aAb 3 $BbA bbb$ A→b 4 $Bbb bb$ B→ε 5 $Bb b$ B→ε 6 $B $ 7 $ $ success

写这种分析过程,阅卷老师看三样:符号栈是否按产生式右部反向压栈、输入串指针是否每次只消费一个终结符、最后是否到达接受状态。B→ε 规约看起来像是什么都没做,但栈里 B 被弹出时输入串没有移动,这正是 ε 产生式的特征。判定结果 baabbb 是该文法的句子,分析表在 a、b、c、d 各列都没有冲突,整个过程能在 LL(1) 分析表上走通。

4. 避坑指南:编译原理答题中的五个高频失分点

4.1 句柄、短语与素短语的边界

现象:题目给出句型 ((T,S),a) 让写短语、直接短语和句柄,答案里把素短语和句柄混为一谈。原因:句柄是"一个句型的最左直接短语",与归约过程绑定;素短语是"至少含一个终结符且不再含更小素短语"的短语;最左素短语是所有素短语里最靠左的那个。算符优先分析归约的是最左素短语,LR 分析归约的是句柄,两种分析器的"下手对象"并不一样。解决:先画语法树,根据叶子节点的父子关系找短语;直接短语是只有一层子树的叶子序列;句柄是最左边那个直接短语。资源判断题第 8 题"算符优先分析法每次都是对句柄进行归约"答案为 ×,考的就是这个区别。

4.2 FOLLOW 集合漏 # 和错误传递

现象:算出的 FOLLOW(E') 少了 #,或者多了 i,与参考答案对不上。原因:FOLLOW 集合最容易漏的是开始符号的 #,以及"产生式右部末尾非终结符要继承左部 FOLLOW"这条规则。比如 A→aB 这种形式,B 后面没有内容,FOLLOW(B) 必须包含 FOLLOW(A)。这里不能用 FIRST 的思维方式去套,不然会把 i 这种不相干的终结符收进来。解决:每算完一个非终结符的 FOLLOW,就回去扫一遍所有产生式右部,专门找以该非终结符结尾的产生式,把左部 FOLLOW 并进去。资源答案的评分说明已经把代价写得很清楚:漏一个扣 0.5 分,这分不该丢。

4.3 传地址与传值的输出结果写反

现象:简答题给定过程 p(x,y,z),体内有 y:=y+z 这类赋值,要求写出传地址和传值时程序输出,结果两个值正好写反。原因:传地址时形参和实参共享存储单元,过程内对形参赋值会直接影响实参;传值时实参值被拷贝一份,过程内怎么改都不影响外部变量。当实参里混着表达式(如 p(a+b,b,a))时,还要注意传地址无法对表达式取地址,不同教材处理方式不同。解决:画一张"形参→实参地址"的绑定图,每执行一行赋值就在绑定图对应存储单元上更新值,不要只盯着变量名心算。资源里另一道题的验证结果是:传地址 A=6、B=16,传值 A=2、B=4。

4.4 二义性文法判断只写一个条件

现象:判断题或多选题要求判断文法是否二义,只写了"存在两个不同的最左推导",漏了最右推导和语法树两个等价判据。原因:教材对二义性的定义通常以语法树为准,但考试多选题会把几个等价条件同时列出,要求全选。解决:记住三个判据必须成套记忆:两个不同最左推导、两个不同最右推导、两棵不同语法树。资源里多选题的评分规则是选对得分、选错扣分,不确定的选项宁可不选,也不要因为想凑满选项而丢分。

4.5 四元式序列回填方向出错

现象:翻译 while (a<b) do if (c>d) then x:=y+z 时,四元式序号写对了,但跳转目标填反,循环回边指向了条件判断之前的语句。原因:while 的翻译模式里 M1.quad 记录循环开始位置,M2.quad 记录循环体第一条语句位置。回填时要把 S1.nextlist 回填到 M1.quad,把 E.truelist 回填到 M2.quad,两个方向容易搞反。解决:按资源给的参考模式先把 M1、M2、E.truelist、E.falselist、S1.nextlist 都标在草稿纸上,再逐条生成四元式。参考答案里的形态是 (j>,a,b,102) 和 (j,-,-,107),跳转目标先写待定,最后由 backpatch 确定具体序号。

5. 用套题做考前自测:从错题归纳到知识网络重建

这份 PDF 里有多套卷子,我不建议从头到尾按顺序刷。更好的用法是把它拆成两份:第一套用来摸底,第二套用来验证。摸底那天先做填空和选择,再挑两道解答题,通常 LL(1) 和算符优先各挑一道,不管会不会都限时 90 分钟做完。做完后先对答案,重点标记"我以为会但错了"的题。这类题比"完全不会"的题更有价值,说明概念理解有偏差而不是空白,修正偏差的投入产出比最高。

第二遍要做的是把解答题步骤模板化。LL(1) 类题目固定四步:消除左递归、算 FIRST、算 FOLLOW、填分析表;算符优先类固定三步:算 FIRSTVT/LASTVT、填优先关系表、判断冲突并构造优先函数。你用自己的话把模板写在一张 A4 纸上,再用第二套卷子对应题目验证模板好不好用。如果某个环节卡住,比如 FIRSTVT 算到一半忘了"看产生式右部第一个终结符"那条规则,说明这个点还没有变成你的操作本能,需要回教材单独补。

我最受益的做法是"答案逆向标注"。四元式序列这类题,先照参考答案抄一遍,然后给每个四元式加注释:哪个是 while 条件判断,哪个是循环体入口,哪个是出口回填点。这个动作会强迫你从"看得懂答案"变成"讲得出为什么",考试时遇到类似题目哪怕记不全翻译模式,也能靠对结构的理解推出正确顺序。从那以后我每次复习编译原理都强制自己走一遍"做套题、写模板、标注答案"三步,基本不会在考场出现看着题目眼熟却写不出过程的窘境。希望这份 PDF 能帮你考前少踩几个坑,把踩坑的精力省给其他科目。

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

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

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

立即咨询