自己复习用,欢迎批评指正。
一、概念解释。
编译器的前端-后端划分
前端(front end):只依赖于源语言,与目标机器独立。词法分析、语法分析、语义分析、中间代码生成、机器无关的代码优化、符号表建立、相关错误处理后端(back end) :只依赖于目标机器。机器有关的代码优化、代码生成、符号表操作、相关错误处理好处:有很多种类的高级程序语言,有很多种类的机器。l 高级程序语言可专注于语言特性,不用考虑后端;l 机器也可专注于机器特性,不用考虑前端;l 彼此之间既相互独立,又可对接。划分的前提:中间代码有国际标准。
编译器和解释器
共同点:
- 语言实现系统:无论是编译器还是解释器,它们都是用来实现某种编程语言,即将人类可读的源代码转换为计算机可执行的代码。
- 翻译代码:两者的主要功能都是将源代码(一种高级语言)转换为另一种语言(如汇编语言或机器语言),以便于计算机执行。
不同点:
- 执行时机:
- 编译器:在代码运行之前进行编译,将源代码一次性全部编译成机器语言,并保存为二进制文件。这样,当需要运行程序时,计算机可以直接以机器语言来运行此程序,因此执行速度较快。
- 解释器:在代码运行时进行解释,即逐行将源代码转换为机器语言并执行。因此,解释器的执行速度通常比编译器慢。
- 跨平台性:
- 编译器:生成的二进制文件通常只能在特定的操作系统和处理器上运行,因此跨平台性较差。
- 解释器:由于解释器是在运行时逐行解释源代码,因此它可以在不同的操作系统和处理器上运行相同的源代码,具有较好的跨平台性。
- 错误处理:
- 编译器:在编译时会检查源代码中的语法和语义错误,并一次性显示所有错误。当发现错误时,编译器会停止翻译,并在删除错误后重新翻译整个程序。
- 解释器:在解释时会逐行检查源代码中的语法和语义错误,并逐个显示每条语句的错误。当发现错误时,解释器会阻止其翻译,但在删除错误后,翻译将继续进行。
- 内存需求:
- 编译器:由于需要生成中间代码或目标代码,因此通常需要更多的内存。
- 解释器:不创建中间代码,因此内存需求通常较小。
- 分发:
- 编译器:生成一个独立的程序,分发简单,但需要在不同的平台上进行编译。
- 解释器:与源代码一起分发,无需在不同平台上进行编译,但需要在目标平台上安装解释器。
文法的分类
0型文法对产生式α→β不加任何限制, 其中α∈(VN∪VT)+,β∈(VN∪VT)*又称短语文法1型文法产生式形如αXβ→αxβ, 其中 α , β ∈(V N ∪V T ) * , X ∈V N , x ∈(V N ∪V T ) + ,又称上下文有关文法
2型文法对任一产生式α→β,都有α∈VN , β∈(VN∪VT)*又称为上下文无关文法CFG3型文法任一产生式α→β的形式都为A→aB或A→a,其中A∈VN ,B∈VN ,a∈VT又称为正则文法,正规文法
l0型文法的识别装置为图灵机l1型文法的识别装置为线性界限自动机l2型文法的识别装置为不确定的下推自动机l3型文法的识别装置为有穷自动机(FA)
二、词法分析
前置知识:
基本概念
正则式的运算
对词法分析,采用固定的步骤:
0.将自然语言描述为正规式(正则式)
1.将正规式转为NFA(非确定的有穷自动机)(易错:避免倒灌)
2.将NFA转为DFA(子集构造法/造表法)重难点
3.将DFA最小化,消去死状态、无关状态,合并等价状态 难点
三、语法分析
前置知识:
基本概念
子集构造法
对LL(1)语法分析,采用固定的步骤:
0.文法改写:消除二义性(例:if语句嵌套),消除左递归,提取左因子
注意:间接左递归的识别和消除
1.求FIRST和非终结符FOLLOW函数。最好记住每一个非终结符加入集合的来源的推导式。
2.将候选式填入分析表。来自非终结符的FIRST元素填入相应的候选式,有ε的将A->ε填入FOLLOW元素表项。
3.检查是否为LL(1)文法。
观察发现,不存在多重定义的分析表表项,即任意SELECT(A->ai)∩SELECT(A->aj)=∅。
4.非递归的预测分析法。
表有3列。分别为栈、输入和输出。
#开始符号E |待匹配式子id+id*id# |使用的候选式E->TE'
#E'T |id+id*id# |T->FT'
#E'T'F |id+id*id# |F->id
#E'T'id |id|id*id# |id匹配
#E'T' |+id*id# |........
略
# | # | accept
对LR(0)语法分析,SLR语法分析,LR(1)语法分析、LALR语法分析 ,采用固定的步骤。
本质:将移进结果相同的项目(标注了每一种匹配进度的候选式)视为一个状态,将移进的非终结符视为转移ACTION条件(移进状态)。候选式完全匹配完毕后(是否?)按对应的候选式规约(待约状态),规约后跳转至GOTO对应状态(规约后状态)。直到最后只剩下结束符,accept。