HNU编译原理与技术 2024年复习纲要

自己复习用,欢迎批评指正。

一、概念解释。

编译器的前端-后端划分

前端(front end)
只依赖于源语言,与目标机器独立。
词法分析、语法分析、语义分析、中间代码生成、机器无关的代码优化、符号表建立、相关错误处理
后端(back end)
只依赖于目标机器。
机器有关的代码优化、代码生成、符号表操作、相关错误处理
好处:
有很多种类的高级程序语言,有很多种类的机器。
l 高级程序语言可专注于语言特性,不用考虑后端;
l 机器也可专注于机器特性,不用考虑前端;
l 彼此之间既相互独立,又可对接。
划分的前提:中间代码有国际标准。 

      编译器和解释器 

共同点

  1. 语言实现系统:无论是编译器还是解释器,它们都是用来实现某种编程语言,即将人类可读的源代码转换为计算机可执行的代码。
  2. 翻译代码:两者的主要功能都是将源代码(一种高级语言)转换为另一种语言(如汇编语言或机器语言),以便于计算机执行。

不同点

  1. 执行时机
    • 编译器:在代码运行之前进行编译,将源代码一次性全部编译成机器语言,并保存为二进制文件。这样,当需要运行程序时,计算机可以直接以机器语言来运行此程序,因此执行速度较快
    • 解释器:在代码运行时进行解释,即逐行将源代码转换为机器语言并执行。因此,解释器的执行速度通常比编译器慢
  2. 跨平台性
    • 编译器:生成的二进制文件通常只能在特定的操作系统和处理器上运行,因此跨平台性较差。
    • 解释器:由于解释器是在运行时逐行解释源代码,因此它可以在不同的操作系统和处理器上运行相同的源代码,具有较好的跨平台性。
  3. 错误处理
    • 编译器:在编译时会检查源代码中的语法和语义错误,并一次性显示所有错误。当发现错误时,编译器会停止翻译,并在删除错误后重新翻译整个程序。
    • 解释器:在解释时会逐行检查源代码中的语法和语义错误,并逐个显示每条语句的错误。当发现错误时,解释器会阻止其翻译,但在删除错误后,翻译将继续进行。
  4. 内存需求
    • 编译器:由于需要生成中间代码或目标代码,因此通常需要更多的内存。
    • 解释器:不创建中间代码,因此内存需求通常较小。
  5. 分发
    • 编译器:生成一个独立的程序,分发简单,但需要在不同的平台上进行编译。
    • 解释器:与源代码一起分发,无需在不同平台上进行编译,但需要在目标平台上安装解释器。

文法的分类

0型文法
对产生式α→β不加任何限制, 其中α∈(VN∪VT)+,β∈(VN∪VT)*
又称短语文法
1型文法
产生式形如αXβ→αxβ, 其中 α , β ∈(V N ∪V T ) * X ∈V N x ∈(V N ∪V T ) +
又称上下文有关文法
2型文法
对任一产生式α→β,都有α∈VN , β∈(VN∪VT)*
又称为上下文无关文法CFG
3型文法
任一产生式α→β的形式都为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。

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值