词法分析是编译的第一个阶段,在单词的级别上 分析和翻译源程序。其涉及的理论只是包括:有限自动机理论;有限自动机理论与正则文法、正则式之间在描述语言方面有一一对应的关系。 引为本篇是以学习基本概念为主,所以后面大部分都是引用的编译原理教学课件内容(不要介意啊学习为主),以后会逐步学习进行实战,也会整理出文章哦
正则表达式、正规文法、有限自动机
正规文法、正规集与正规式
正规文法:是3型文法,这个在上篇编译器基础中有提到。正则文法是描述正规集的文法,可用于描述程序涉及语言的语法部分。例如:标识符这种单词可以用 下面的规则描述。
<标识符> -> <字母>|<标识符>(<字母>|<数字>)。其中<字母>表示任意英文字母,<数字>表示任意数字)
正规集:由正规文法产生的语言。正规集是集合,可有穷也可无穷。可通过正规式 来形式化表示。
正规式:设A是非空的有限字母表,,则
- ε,Φ(空集)和ai (i=1,2,......n)都是正规式
- 若α、β是正规式,则也是正规式。其中,“|”读作为“或”,也可写作为“+”或“,”;“•”读作连接
- 正规式只能通过有限次使用1,2规则获得
- 仅由字母表上的正规式α所组成的语言称作正规集,记作L(α)
- 利用正规集相同,可用来证明相应正规式等价
例如:证明b(ab)*=(ba)*b
∵L(b(ab)*)={b,bab,babab,......}
L((ba)*b)={b,bab,babab,......}
又∵正规集的前n项相同
∴可知它们的正规集是相等的
故:正规式 b(ab)*=(ba)*b
三者之间的关系
- 一个正规语言可以用正规文法定义,也可以用正 规式定义,对任意一个正规文法,存在一个定义 同一个语言的正规式;同样,对每个正规式,存 在一个生成同一语言的正规文法;有些正规语言 很容易用文法定义,有些则用正规式定义更容易; 两者之间是可以转换的,结构上具有等价性。
- 由正规文法或正规式定义的正规语言的集合构成正规集
例如 正规式: 的正规集为
正则表达式
正则表达式(Regular Expression,RE ) 是一种用来描述正则语言的 更紧凑的表示方法
正则表达式可以由较小的正则表达式按照特定规则递归地构建。每个正则表达式 r定义(表示)一个语言,记为L(r )。 这个语言也是根据r 的子表达式所表示的语言递归定义的
- ε是一个RE,L(ε) = {ε}
- 如果 a∈∑,则a是一个RE,L(a) = {a}
- 假设 r和 s都是 RE,表示的语言分别是 L(r)和L(s),则
- r|s 是一个RE,L( r|s ) = L(r)∪L(s)
- rs 是一个RE,L( rs ) = L(r) L(s)
- r* 是一个RE,L( r* )= (L(r))*
- (r) 是一个RE,L( (r) ) = L(r) 例:令 ∑ = {a, b},则
例:C语言无符号整数的RE
- 十进制整数的RE:
- 八进制整数的RE:
- 十六进制整数的RE:
正则语言
可以用RE定义的语言叫做正则语言(regular language)或正则集合(regular set)
RE的代数定律
正则文法与正则表达式等价
- 对任何正则文法 G,存在定义同一语言的 正则表达式 r
- 对任何正则表达式 r,存在生成同一语言的 正则文法 G
正则定义
正则定义是具有如下形式的定义序列: (给一些RE命名,并在之后 的RE中像使用字母表中的 符号一样使用这些名字) 其中:每个di都是一个新符号,它们都不在字母表 Σ中, 而且各不相同;每个ri是字母表 Σ∪{d1 ,d2 , ... ,di-1}上的正则表达式
例 C语言中标识符的正则定义
- letter_ → A|B|...|Z|a|b|...|z|_
-
有穷自动机
- 有穷自动机( Finite Automata,FA )是对一类处理系统 建立的数学模型
- 这类系统具有一系列离散的输入输出信息和有穷数目的内部状态(状态:概括了对过去输入信息处理的状况)
- 系统只需要根据当前所处的状态和当前面临的输入信息 就可以决定系统的后继行为。每当系统处理了当前的输入后,系统的内部状态也将发生改变
FA的典型例子 电梯控制装置
- 输入:顾客的乘梯需求(所要到达的层号)
- 状态:电梯所处的层数+运动方向
- 电梯控制装置并不需要记住先前全部的服务要求,只需要知道电梯当前所处的状态以及还没有满足的所有服务请求
FA模型
- 输入带(input tape):用来存放输入符号串
- 读头(head ):从左向右逐个读取输入符号,不能修改(只读)、不能往返移动
- 有穷控制器( finite control ):具有有穷个状态数,根据当前的状态和当前输入符号控制转入下一状态
FA的表示
FA 定 义(接 收)的 语 言
最长子串匹配原则
有穷自动机的分类
- 确定的FA (Deterministic finite automata, DFA)
- 非确定的FA (Nondeterministic finite automata, NFA)
确定的有穷自动机 (DFA)
非确定的有穷自动机(NFA)
DFA和NFA的等价性
- 对任何非确定的有穷自动机N ,存在定义同一语言的确定的有穷自动机D
- 对任何确定的有穷自动机D ,存在定义同一语言的 非确定的有穷自动机N
DFA的算法实现
从正则表达式到有穷自动机
从NFA到DFA的转换
计算 ε-closure(T)
将T的所有状态压入stack中; 将ε-closure(T )初始化为 T ;
while(stack非空){
将栈顶元素 t 给弹出栈中;
for(每个满足如下条件的u :从t出发有一个标号为ε的转换到达状态u)
if ( u不在ε-closure(T )中){
将u加入到ε-closure(T )中;
将u压入栈中;
}
}