本专栏提供的信息:
Updated on Jan 15th, 2022
资料来源:
老师本学期最后一节课的复习内容&本人当场速记&本人记忆补充&参照往年学长学姐资料补充
复习ppt:本年度无(老师明确表示不发,因此之后复习课时能当场记就当场记)
本人复习和上课用书:编译原理(第二版)龙书
编译原理(第2版)(Alfred V. Aho、Monica S.Lam等著)
配套答案
其他资源:
课本查找
内容说明:
本篇博客内容由于为当场速记,虽已经过整理,但为了重现课堂,因此仍涵盖大量口语,请自行理解。
复习重点:
题型:
选择题 20道
简答题 几道
两道大题
老师对于考试的一些提示:
YACC要知道,简单的YACC代码要能看懂
题可能会很多,要衡量一下时间
代码题写伪代码就行
汇编语言要会看,起码知道哪个指令代表什么意思
学期知识复习概览:
1. 编译器:
我们将高级语言程序翻译成机器代码进行执行,它的过程是翻译而不是解释也不是直接执行。
要知道编译器的功能是什么,起到的作用是什么。
2. 词法分析:
识别源程序是否有误,读入源程序生成token序列
串:什么是串?串的运算?给一个串,它的幂是多少?长度是多少?
正则表达式:语言和正则表达式之间的转换。知道正则表达式能够表示什么样的语言——写出一个正则表达式它所描述的语言;设计一个语言来写出它的正则表达式。
正则表达式的运算:或、幂、连接。 不同正则表达式运算之间的规律:交换律、结合律等等
有限自动机:NFA DFA
词法分析的工作流程:给定一个正则表达式,根据thompson构造法构造出等价的NFA,根据子集构造法将NFA转化为DFA,并将DFA优化,使得状态集最小。
3. 语法分析:
上下文无关文法描述其语法结构:给定一个CFG,这里面的终结符是哪些,非终结符是哪些,开始符号是哪一个
CFG的改写——去掉空串、消除左递归使得CFG可以满足自顶向下和自底向上
推导:最左推导和最右推导,以及推导和规约之间的关系。
语法分析的工作原理:
自顶向下:递归下降和LL1,要知道递归下降的缺点和LL1的优点
自底向上:LR0 SLR LR1 LALR
对于YACC采取的是LALR的分析思路。要利用YACC这个辅助工具辅助语法分析的过程。
重点掌握:LL1 LR0 SLR这三部分就可以了
4. 语法制导翻译:
SDD SDT :有S-SDD L-SDD ,要能够写出来简单的SDD和SDT
SDD转成SDT:S属性的SDD和L属性的SDD转化成SDT时,应该将属性嵌到什么位置,这些基本的规则要掌握。
5. 中间代码生成:
中间表示形式:能够画出语法树,写出相应的三地址码、四元式和三元式等。
类型和声明:如何写一个对象的类型表达式;对于一个声明语句掌握其在翻译过程中的作用是什么
表达式:控制语句、布尔表达式的翻译,这些翻译要能够看懂
6. 运行时刻环境:
静态分配、栈分配和堆分配分别是怎么进行分配和划分的
7. 代码生成部分:
根据中间表示生成汇编语言,涵盖指令选择、寄存器分配和指令排序等等
对于一个基本块,能够根据中间表示能够划分基本块,形成相应的流图和简单的优化
8. 代码优化部分:
公共子表达式消除、死代码消除、折叠常量等等, 这些可以通过什么样的方式找到不同优化的形式,以及如何对它进行相应的优化。
9. 符号表和错误处理:
符号表记录哪些信息,错误处理:每个阶段可能会遇到哪个错误,然后报告出错误的位置然后继续编译。
大致题目内容:
以下为本场考试的本人记忆,不对真实性和时效性做任何承诺。
- 选择题:
一个文法所对应的NFA过程选择
给出一个文法,选择其表示什么语言
Yacc中的include部分可以写什么
L-SDD要在自底向上中分析,应该满足什么条件(给四个概念选一个)
公共子表达式消除对应什么优化形式(到达定值、活跃变量、可用表达式……)
……
选择题属于比较基础的题,就是一些简单练习和概念,难度不大
- 简答题:
- 给语言写出可以描述其的正则表达式。
本次考试题目为:给出描述一个八进制除8余x的正则表达式描述(x具体是几我忘记了)
本题可以参考一道“二进制整除3的正则表达式”解答方法……(个人想法) - 给一个串和产生式,给出能够表示出这个串的SDT/SDD
- 中间代码四元式表示
……
- 大题:
Thompson构造法大题:从正则表达式——NFA——DFA——DFA优化 ,比平常作业难了点,出现了死状态,写的时候一直在怀疑自己前面有没有写错
SLR大题:给出文法,指出文法中终结符有哪些非终结符有哪些,然后构造SLR分析表。
本场考试总结:
小崩。
选择题感觉还可以;
简答题的时候正则表达式不太会写,感觉要写很久跳过了,结果后面也没时间转头写了;第二个SDD和SDT的题,没有太看懂那个串应该如何推导出来,想到的一个推导方法又太nc了,感觉不会这么简单,所以就不知道语义动作应该加什么,加到哪里……
大题:NFA那题题目比平时作业多了一个点,就是到终态之后可能并不会返回回之前出现的某个状态,而是空出来。因为之前练这种题少所以一直在检查自己到底有什么地方出错了,花费了较多时间;
文法SLR比平时作业简单,写的还算顺利。
总的来说,编译原理这课学的时候就太过懵懂,没有及时复习,也没有做多少题,取得这种结果也是理所应当。
一定要多做题!一定要及时弄懂老师上课讲的东西 啊!
关于平时作业:
因为平时作业的ppt也是老师的成果,所以不会放出来;
但是平时作业的题目一部分为龙书课后习题原题,大多数题目类型都可以在龙书课后习题中找到,因此我可以直接摘自龙书,答案在上文中已给出资源链接。
龙书上的正则表达式和语言转化:
龙书上的NFA:
龙书上的SDD和SDT:
龙书上的DAG图和代码优化:
关于布尔表达式的四元式序列,可以参考B站视频(选集p5,我觉得讲的比较好),龙书上我并没有找到课后习题
一些关于布尔表达式翻译题的习题博客