编译原理学习笔记1(编译原理概述与词法分析)

1 概述

1.1 编译过程

编译过程有五个阶段,如图1(图源编译原理基础 第二版)所示。
词法分析,语法分析,语义分析+中间代码产生,优化,及目标代码生成。在笔记中只学习前两个阶段,后三个阶段不进行深入学习。
这五个阶段与英译中十分类似,可以对比记忆。比如词法分析->识别英文单词,语法分析->分析句子语法结构,语义分析+中间代码产生->初步翻译,优化->修饰译文,目标代码产生->写出最后的译文。
每一阶段的输出是后一阶段的输入。整个编译过程也可以划分为两个部分,即分析部分(123)和综合部分(45),也叫前端和后端,我们只学习前端。
编译过程

1.2 工具与其他处理

五个阶段,也分别存在着一些分析工具:

1)词法分析:如有限自动机,用来描述构词规则;
2)语法分析:如上下文无关文法,用来描述语法规则。

此外,符号表管理和出错处理也贯穿着整个编译过程。

2 词法分析

2.1 主要工作

这里的词法分析有双重含义:

1)规定单词的形成规则,也被称为构词规则;
2)根据构词规则识别输入序列,也被称为词法分析。

词法分析器是编译器中唯一与源程序打交道的部分。
主要工作有:

1)滤掉源程序中如注释,空格之类的无用部分;
2)识别记号,交给语法分析器;
3)调用符号表管理器或出错处理器(处理词法错误)。

词法分析器作用是识别源程序中的各个记号,形成记号流,传递给语法分析器。

2.2 字符串相关

字符串间的运算有:并,交,连接,差,闭包,正闭包等。
有时字符串可能无法有限枚举,但是存在某种规律,可以用正规式来描述它,表示一类字符串。

2.3 记号的识别

对记号的识别可以通过有限自动机来完成。
NFA(不确定的有限自动机)是一个五元组,M=(S, ∑, move, s0, F),分别表示有限状态集合,有限输入字符集合,状态转移函数,唯一初态,终态集合。
有三种方式可以用来描述有限自动机:文字定义;转换图;转换矩阵。如下列图所示(图源编译原理第二版)
文字定义
转换图
转换矩阵
NFA的特点是不确定性,对于同一个字符,可能有多于一个的下一状态转移,即move函数为一对多。
与此对应的是DFA(确定的有限自动机),是NFA的一个特例,其中:状态转换图中没有标记为ε的边,对于每一个状态s和每一个字符a,最多只有一个下一状态,即move函数为一对一。
在DFA上识别输入序列无需回溯,提高了识别效率。所以更多地考虑使用DFA。
若两个有限自动机识别同一个正规集,则称两个有限自动机是等价的,为NFA转化为DFA埋下伏笔。

2.4 从正规式到词法分析器(重点)

整个过程为:

1)用正规式对模式进行描述;
2)为每一个正规式构造一个NFA;
3)将构造出的NFA转换成等价的DFA;
4)优化DFA,即DFA的最小化;
5)根据最小DFA构造词法分析器(写代码)。

1)没有什么方法,就是找规律

2)从正规式到NFA:有两种方法:Thompson算法;分解法。
Thompson算法(图源编译原理第二版):
Thompson算法
分解法较为简单,例如下图(自己画的):
分解法
3)从NFA到DFA
基本思想:将不确定的下一状态确定化。方法:子集法,如下图(图源编译原理第二版):
子集法
4)DFA最小化
最小化DFA,将一个DFA反过来考虑,可能会变成NFA,说明有些状态是冗余的,这时如果把反方向的NFA也变成DFA,就是正反方向都是DFA的最小DFA了。
做法:先将所有的非终结态和所有的终结态划分为两个集合,然后判断每个集合里的各个元素的输出去向,如果单个集合内每个元素同样输入下,去向都为相同的集合,则不用再区分,否则将不同的元素剔除,直到无法区分。

杂记

1)如何判断两集合相等:即每一个集合A中的元素,能推出它属于集合B,同时,每一个集合B中的元素,能推出它属于集合A。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值