第三章 词法分析和有穷自动机
《编译原理》第3章
NFA到相应的DFA的构造的基本思路是: DFA的每 一个状态对应NFA的一组状态. DFA使用它的状 态去记录在NFA读入一个输入符号后可能达到的 所有状态.
NFA M所能接受的符号串的全体记为L(M)
结论:
上一个符号串集V是正规的,当且仅当存 在一个上的不确定的有穷自动机M,使得 V=L(M)。
DFA是NFA的特例.对每个NFA N一定存在一个DFA M,使得 L(M)=L(N)。对每个NFA N存在着与之 等价的DFA M。 有一种算法,将NFA转换成接受同样语言的DFA.这 种算法称为子集法. 与某一NFA等价的DFA不唯一.
0
1
S P
Z
{P} {}
{P}
{S,Z} {Z}
{P}
• δ为S * 到S的子集(2 S)的一种映射
• 从NFA的矩阵表示中可以看出,表项通常是一状态的集合, 而在DFA的矩阵表示中,表项是一个状态
∑*上的符号串t被NFA M接受:
• 对于Σ*中的任何一个串t,若存在一条从某一初态 结点到某一终态结点的道路,且这条道路上所有 弧的标记字依序连接成的串(不理采那些标记为ε 的弧)等于t,则称t可为NFA M所识别(读出或接 受)。 • 若M的某些结点既是初态结点又是终态结点;或 者存在一条从某个初态结点到某个终态结点的道 路,其上所有弧的标记均为ε,那么空字ε可为M所 接受。
其中: δ(S,0)={P}
δ(S,1)={S,Z} δ(Z,0)={P} δ(Z,1)={P} δ(P,1)={Z} • 状态图表示
1 1 S 0 0,1 Z
P
1
• 矩阵表示
状态 输入
δ(S,0)={P} δ(S,1)={S,Z} δ(Z,0)={P} δ(Z,1)={P} δ(P,1)={Z}
编译原理第三章
例3.4 Z→ A→ B→
有正规文法G: 0A 0A | 0B 1A | ε
例3.5 A→ B→ C→
有正规文法G: aB | bB aC | a | b aB
例3.6 Z→ U→ V→
有正规文法G: Z=0(0|01)*0 U0 | V1 A=(a|b)(aa)*(a|b) Z1 | 1 Z=(10|01)(10|01)* Z0 | 0
A
B
r2 ε
A C
A
B
ε
B
r1
④R为复合正规式?
例3.12 3.13 P41
教学进度
3.4.4 NFA确定化为DFA
方法(子集法) 1、改造M为M’: ①引进新的初态结点X、终态结点Y; ②对M的状态转换图实施分裂(替换)
计算机科学与工程系
2、将M’进一步变换为DFA :
①状态子集T的闭包_CLOSURE(T) ②定义状态集Ta = _CLOSURE(J) ③从DFA的初态_CLOSURE({X})开始计算状态转换矩阵;直到 不再产生新的状态子集为止。
第三章
• • • • • •
词法分析与有穷自动机
计算机科学与工程系
词法分析器的功能与输出 单词符号的两种定义方式 正规表达式与有穷自动机 正规文法与有穷自动机 词法分析器的设计 词法分析程序自动构造工具LEX简介
教学进度
3.1 词法分析器的功能
计算机科学与工程系
词法分析:对字符串表示的源程序进行从左到右的扫描和 分解,根据语言的词法规则识别出一个个具有独立意义的 单词符号。
教学进度
3.3 单词符号的两种定义方式
单词符号结构的描述方法:
计算机科学与工程系
正规文法(3型文法)(regular grammar)
第三章 词法分析和有穷自动机
ε
ε
2
ε
6 b
ε
f
3.4.5 DFA的最小化(化简)
• 最少状态DFA 对于一个DFA M,存在一个最少状态DFA M’, 使得L(M’)=L(M)。 (a)没有多余状态 (b)没有两个状态是互相等价的 结论: 一个NFA 对应的DFA不惟一 但它对应的最小化DFA不计同构是惟一的
• 多余状态的例子 a
例
正规式 φ
ε
a a|b ab (a|b)(a|b) a* ba* (a|b)*
正规集 φ {ε } {a} L(a|b)=L(a) ∪ L(b)={a,b} L(ab)=L(a)L(b)={ab} {aa,ab,ba,bb} { ε ,a,aa,aaa,…} {b,ba,baa,baaa,…} {所有由a和b组成的字}
• 例 DFA M=({0,1,2,3},{a,b}, f ,0,{3}) 其中 f 为: f (0,a)=1 f (0,b)=2 f (1,a)=3 f (1,b)=2 f (2,a)=1 f (2,b)=3 f (3,b)=3 f (3,a)=3
3.4.1 确定有穷自动机(DFA) • DFA的表示方法 两种:矩阵和图形的方式 矩阵称为状态转换矩阵 图形称为状态转换图
• NFA M所接受字符串的集合称为NFA M所能 识别的语言,记为L(M)。 • NFA的确定化 DFA是NFA的特例
NFA M存在与之等价的DFA M’,L(M)=L(M’) 与某一NFA等价的DFA不惟一 正规式 NFA 正规文法 DFA
3.4.4 NFA 确定化
• 状态集合I的空闭包:ε -closure(I) 它是一个状态集合,包含 : ♠ I中任何状态q ♠ I中任何状态q经任意条空弧到达的任何状态 • 状态集合I的a弧转换:Ia 定义一个状态集J,J是I中所有状态经一条a 弧到达的状态的全体 Ia=ε -closure(J)
第三章词法分析及有穷自动机
U
④ 以识别符号为终止状态。
例:设有正规文法G[Z]: Z∷= U0|V1 U∷=Z1|1 V∷=Z0|0
(描述的语言为L(G)={01,10}+) 则状态转换图如下:
新增加开 始状态S
1 S
0
U 1
0
V
0 Z
1
以开始符号Z 作终态
例:标识符的转换图:
字 母 或 数 字
字 母
0
1
非 字 母 和 非 数 字 2
例:一种一类的单词输出形式 设保留字、标识符、常数、运算符、分界符
的种别码分别为1,2,3,4,5;将if a>1 then b:=10表示为一种一类的单词输出形式。
if a>1 then b:=10
(字符串表示 的源程序)
=>词法分析 器=>
(1, ’ if ’ )
(2,’ a ’ ) , (4,’ >’) (3,’1’ 的二进 制数)
2>根据状态转换图写词法分析程序 为每一个状态结点写一个过程或函数: 对N1结点: Procedure PN1
Begin
Ch:=getchar( );
If ch=”e” then PN5 Else if ch=”d” then PN2
Else if ch=” ·” then PN3 Else error
从开始状态出发到某一终止状态结点为止,所经过的路径 上的符号串,称能为该状态转换图所接收(识别)的符号 串。
如:标识符x26为上述转换图识别,识别路径为
x
2
6
0
1
1
1
非 字 母 和 非 数 字 2
2) 右线性正规文法构造状态转换图
① 右线性正规文法U ∷= a|aV构造状态转换图的步骤: ② 增加一个终止状态结点z(假定文法的词汇表中不含
北航计算机学院编译习题讲解
0
1
q3
q4
0
18
0
Start
A
1 B
1
0
1
C
D
E
1
0
1
{A} -
{B}
q0
{B} {B} {BC}
q1
{BC} {BD} {BC}
q2
{BD} {B} {BCE}
q3
{BCE} {BD} {BC}
q4
0
1
-
q1
q1
q2
q3
q2
q1
q4
q3
q2
2008年7月2日
19
0
q0
-
q1
q1
q2
q3
q3
2008年7月2日
17
01
q0 -- q1 q1 q2 q3 q2 q2 q3 q3 q4 q3 q4 q2 q5 q5 q4 q3
q0 q1 q2 q3 q4
01
q0 -- q1
q1 q2 q3
q2 q2 q3
q3 q4 q3
q4 q2 q5
q5 q4 q3
0
1
-
q1
q1
q2
பைடு நூலகம்q3
q2
q1
q4
q3
第三章:词法分析
3.1 词法分析的功能 3.2 词法分析程序的设计与实现
–状态图
3.3 词法分析程序的自动生成
–有穷自动机、LEX
2008年7月2日
1
补充
1 2
NFA
正则文法
4 3
5 6
正则表达式
DFA 最小化
2008年7月2日
编译原理第三章_有穷自动机
例 过河问题 分析(续)
初始状态:MWGC-φ;终止状态:φ-MWGC。 g
MWGC-φ
WC-MG
问题:
6
例 过河问题 状态转换图
起始 g
MWGC-φ g
g φ-MWGC
g
7
WC-MG
m
m MWC-G
w
w
c
C-MWG
c W-MGC
g
g
MGC-W c
MG-WC
w
m
c G-MWC
m
gg MWG-C
+dd. ddd;
输入符号串
数字 数字
SB
.
数字
+
A
H
-.
数字
.G
接收:若扫描完输入串, 且在一个终止状态上结 束。
数字 阻塞:若扫描结束但未 停止在终止状态上;或 者为能扫描完输入串 (如遇不合法符号)。
不完全描述:某些状态 对于某些输入符号不存 在转换。
练习:+34.567 .123 3.4.5
w
有穷自动机(FA)
数字系统:可以从一个状态移动到另一个状态;每次 状态转换,都上由当前状态及一组输入符号确定的;可以 输出某些离散的值集。
FA:一个状态集合;状态间的转换规则;通过读头来 扫描的一个输入符号串。
读头:从左到右扫描符号串。移动(扫描)是由状态 转换规则来决定的。
8
读头
一个FA的例子
(3)运行: 串f(,Q,且t1tt21)∈= Σf(,f(Qt1,t2t1∈), Σt2*),其中Q∈K, t1t2为输入字符
17
例3
题:试证abba可为例1的DFA M所识别(所接受)。
sun编译原理第3章词法分析与有穷自动机第4 8讲 优质课件
={a,b}*{aa,bb}{a,b}*
练习:若S=a|bb,则L((a|bb)*)=?
2019/11/24
信息学院 孙丽云
5
第3章 词法分析与有穷自动机
■正规式中运算的优先级
括号优先,* 次之,•(连接)再次之,| 最后 例:a|bc* ≌ a|(b(c*))
ab|c*d ≌ (ab)|((c*)d)
其中 U、W∈N t∈T 其中 U、W∈N t∈T
2019/11/24
信息学院 孙丽云
8
第3章 词法分析与有穷自动机
■正规文法到正规式的转换
(1)将正规文法中的每个非终结符表示成关于它的一 个正规式方程,获得一个联立方程组。 (2)依照求解规则:
若x=αx|β(或x=αx+β),则解为x=α*β; 若x=xα|β(或x=xα+β),则解为x=βα*; 以及正规式的分配律、交换律和结合律求关于文法 开始符号的正规式方程组的解. 这个解是关于该文法开始符号S的一个正规式,显然 它表示了由该正规文法所描述的语言。
信息学院 孙丽云
2
第3章 词法分析与有穷自动机
3.3 语言单词符号的两种定义方式 多数程序设计语言的单词符号都能用正规文法或正规 式来定义。
■ 正规式与正规集
设有字母表={a1,a2,…,an},在字母表上的正 规式和它所表示的正规集可用如下规则定义: (1) Φ是上的正规式,它所表示的正规集是Φ, 即空集{} (2)ε是上的正规式,它所表示的正规集是{ε} (3)ai是上的正规式,它所表示的正规集由单个符 号ai组成,即{ai}
③ (e1)*是上的一个正规式,它所表示的正规集为 L((e1)*) =L((e1))*
正规式描述了单词符号的构成规则,正规集是正规 式能描述的所有的单词的集合。
编译原理 第三章 有限自动机与词法分析器
第三章有限自动机与词法分析器3.1词法分析3.1.1词法分析器的功能在第二章里我们已介绍了词法分析的基本问题。
计算机存储是二进制式的,因此,任何一种程序和数据在计算机内部均被表示为二进制表示。
实际上,当程序员每按键盘中的一个键时,自动往计算机里输入一个相应的八位二进制码,称这种码为ASCII码。
当程序员敲完程序时将它保存到自己事先起好名的文件中,因此,程序在计算机文件中的表示是ASCII码序列(末尾有文件结束码)。
编译器总是要用某种程序设计语言来写,而任何一种语言的程序其操作对象必须是该语言所规定的数据。
编译器的操作对象是程序中的各种语法单位,如<常量声明>,<类型声明>,<变量声明>,<过程声明>,<表达式>,<语句>,<变量>等等,因此,必须把它们都表示成某种数据结构形式,而它们的最小单位是所谓的单词,故首当其充的是要把每个单词转换成一种数据形式,通常称它们为TOKEN。
词法分析器的任务就是,从源程序的ASC码(用高级语言的术语来说是字符串)序列逐个地拼出单词,并将构造相应TOKEN数据表示。
词法分析器可有两种,一种是它作为语法分析的一个子程序,一种是它作为编译器的独立一遍。
前一种情形,词法分析器不断地被语法分析器所调用,每调用一次词法分析器将从源程序的字符序列拼出一个单词,并将其TOKEN值返回给语法分析器。
后一种情形则不同,即不是被别的部分不断地调用,而是完成编译器的独立一遍任务,具体说将整个源程序的字符序列转换成TOKEN序列,并将其交给语法/语义分析器。
实际的编译器一般都采用子程序方式,但是为了独立地介绍词法分析、语法分析和语义分析的概念和技术,我们将词法分析部分分离出来即作为独立一遍的词法处理器来介绍。
从实际的角度来说,这种方法有以下缺点:一是因为它要生成TOKEN列,自然多占用空间;二是因为要保存所有的TOKEN,需要耗费更多的时间。
第3章 词法分析(3)
3.4 正规式与有穷自动机的等价性
1. NFA M正规式R
在消结过程中,逐步用正规式来标记弧, 规则如下:
1.对于
1
2.对于
R1
2
R2
代之为
3
1
R1 R2
3
代之为 R1 R1| R2 1 2 1 2 R2 R2 3.对于 代之为 R1R2﹡R3 R 1 R 3 1 3 1 2 3
例如:有NFA M如图3.14,求其等价的正规式R。
a,b a 3
x ε 0 b 1 a|b a|b x ε 0
aa
a
4
ε
b
y (a|b)*(aa|bb)(a|b)* x y ε 2 a,b a|b aa(a|b) * y bb(a|b) *
4
ε y x
bb
2
ε
a|b
ε
0
3.4 正规式与有穷自动机的等价性
课堂练习 求以下NFA的正规式 a a 3 a 1 2 b
第一步
a
5 6 b
b
4
b
a
a
3
a
a
s
1 2
b
5 b
4 b
6 b
z
3.4 正规式与有穷自动机的等价性
第二步
a|b s 1 2
aa bb aa|bb 5
a|b
6
z
第三步
s
第四步
(a|b)*
2
5
(a|b)*
z
s
(a|b)*(aa|bb)(a|b)*
z
课堂讲解
• 【例5.12】第72页 • 【例5.13】第73页
编译原理 第3章 词法分析与有穷自动机(第5-8讲)
它所对应的状态表如图:
状态 0 1 2 3 a 1 3 1 3 后继 状态 b 2 2 3 3
输入字符 接受 否 否 否 是
式的转化
22
第3章 词法分析与有穷自动机
■DFA所识别的语言
给定DFA M,对于字符c1,c2,…,cn,当以下条件成立时, 称M接受由c1,c2,…,cn组成的字符串c1c2…cn: 存在状态序列s0,s1,s2,…,sn,使得s1=f(S,c1), s2=f(s1,c2),…,sn=f(sn-1,cn),且sn∈Z。 由DFA M接受的语言L(M)是所有M接受的字符串组成的集 合。
25
第3章 词法分析与有穷自动机
判断下图是DFA还是NFA的状态转换图,并 写出其他2种表示形式
26
第3章 词法分析与有穷自动机
■由正规表达式R构造NFA
1.基本正规表达式 (a)对于正规式φ,所构造NFA: (b)对于正规式ε,所构造NFA: (c)对于正规式a,a∈Σ,则 NFA:
x ε y
练习:若S=a|bb,则L((a|bb)*)=?
5
第3章 词法分析与有穷自动机
■正规式中运算的优先级
括号优先,* 次之,•(连接)再次之,| 最后 例:a|bc* ≌ a|(b(c*)) ab|c*d ≌ (ab)|((c*)d)
■ 正规式与正规集举例
L(a|bc*)=L(a)∪L(bc*) 思考:L(ab|c*d)=? =L(a)∪L(b)L(c*) =L(a)∪L(b)(L(c))* ={a}∪{b}{ε,c,cc,ccc……} ={a,b,bc,bcc,bccc,……}
17
第3章 词法分析与有穷自动机
■有穷自动机的状态转移图表示方法
第3章词法分析与有穷自动机20090319
单词的种类 (1)关键字:if、for、while (2)标识符: (3) 常数: (4) 运算符:+、-、* (5)分界符:, 、;、(、)
编译原理
2013年8月27日
词法分析程序的输出形式-----二元式
单词类别 单词的属性值
单词类别可以用整数编码表示:一类一种或一字一种
单词类别 关键字 标识符 常数 运算符 分界符
编译原理
2013年8月27日
【例3.9】将描述标识符的正规式R=l(l∣d)*转换 成相应的正规文法。
• 令S为文法的开始符号, 根据规则(2) 有 • S→l(l∣d)* • 根据规则(3)变换为: • S→lA • A→(l∣d)* • 根据规则(4)变换为: • S→lA • A→(l∣d)A∣ε •
有穷自动机的作用
实质上是提供了一种逻辑的探测方式,去探测一 些输入串是否属于某种语言,即: 它可以作为一种 语法检查器。
编译原理
2013年8月27日
3.4.1
确定的有穷自动机(DFA)
M=(Σ, Q, f,S, Z)
Σ:有穷字母表,它的每个元素称为一个输入符号 Q:有穷状态集,它的每个元素称为一个状态 S∈K,是唯一的初态
运算符的优先级: 先*, 后 • , 最后 | • 在正规式中可以省略.
正规式相等 这两个正规式表示的语言相等
编译原理
2013年8月27日
正规式举例
• 例:设有字母表 ∑={a,b},根据正规式与正规集的定义,有以 下的正规式和正规集 正规式 正规集 a {a} a∣b {a,b} ab {ab} ( a∣b)( a∣b) {aa,ab,ba,bb} a* {ε,a,aa,aaa,…,任意个a的串} (a∣b)* {ε,a,b,aa,ab,ba,bb,…所有a,b组成的串} (a︱b) *(aa︱bb) (a︱b) * ∑*上所有含两个连续的a 或两 个连续的b组成的串
第3章 词法分析与有穷自动机PPT课件
或作为一个联合
typedef struct {
TokenType tokenval;
unon { char* stringval;
int numval; } attribute;
} TokenRecord;
10
【例】试给出程序段 if (a>1) b = 100;输出 的单词符号串。
假定基本字、运算符和界符都是一符一种,标识符自身 的值是字符串,常数是二进制值。
(2,)
基本字 if
(29,)
左括号 (
(10,‘a’)
标识符 a
(23,)
大于号 >
(11,‘1’的二进制)
常数 1
(30,)
右括号 )
(10,‘b’)
标识符 b
(17,)
赋值号 =
(11,‘100’的二进制) 常数 100
(26,)
分号 ;
11
【例】考虑下述 C++ 代码段:
另一种 表示
while ( i >= j ) i--;
第三章 词法分析
人们理解一篇文章(或一个程序)起码是在单 词的级别上来思考的。同样,编译程序也是在单 词的级别上来分析和翻译源程序的。词法分析的 任务是:从左至右逐个字符地对源程序进行扫描, 产生一个个的,把作为字符串的源程序改造成为 单词符号串的中间程序。因此,词法分析是编译 的基础。
执行词法分析的程序称为词法分析器。本章讨 论词法分析程序的手工构造方法和自动构造方法。
将字符组合成记号与在一个英语句子中将字母构成单词 并确定单词的含义很相像,此时的任务很像拼写。
5
程序语言的单词符号一般可分为下列五种:
1) 关键字:是由程序语言定义的具有固定意义的标识符, 也称保留字或基本字。如Pascal中的 begin、end、 if、integer等,C 中的if、else、do、while, C++ 中的class、int、switch、break等都是保 留字,它们一般不用作一般标识符。
编译原理-第3章 词法分析--习题答案
第3章词法分析习题答案1.判断下面的陈述是否正确。
(1)有穷自动机接受的语言是正规语言。
(√)(2)若r1和r2是Σ上的正规式,则r1|r2也是Σ上的正规式。
(√)(3)设M是一个NFA,并且L(M)={x,y,z},则M的状态数至少为4个。
(× )(4)设Σ={a,b},则Σ上所有以b为首的符号串构成的正规集的正规式为b*(a|b)*。
(× )(5)对任何一个NFA M,都存在一个DFA M',使得L(M')=L(M)。
(√)(6)对一个右线性文法G,必存在一个左线性文法G',使得L(G)=L(G'),反之亦然。
(√) (7)一个DFA,可以通过多条路识别一个符号串。
(× )(8)一个NFA,可以通过多条路识别一个符号串。
(√)(9)如果一个有穷自动机可以接受空符号串,则它的状态图一定含有 边。
(× )(10)DFA具有翻译单词的能力。
(× )2.指与出正规式匹配的串.(1)(ab|b)*c 与后面的那些串匹配?ababbc abab c babc aaabc(2)ab*c*(a|b)c 与后面的那些串匹配? acac acbbc abbcac abc acc(3)(a|b)a*(ba)* 与后面的那些串匹配? ba bba aa baa ababa答案(1) ababbc c babc(2) acac abbcac abc(3) ba bba aa baa ababa3. 为下边所描述的串写正规式,字母表是{0, 1}.(1)以01 结尾的所有串(2)只包含一个0的所有串(3) 包含偶数个1但不含0的所有串(4)包含偶数个1且含任意数目0的所有串(5)包含01子串的所有串(6)不包含01子串的所有串答案注意 正规式不唯一(1)(0|1)*01(2)1*01*(3)(11)*(4)(0*10*10*)*(5)(0|1)*01(0|1)*(6)1*0*4.请描述下面正规式定义的串. 字母表{x, y}.(1) x(x|y)*x(2)x*(yx)*x*(3) (x|y)*(xx|yy) (x|y)*答案(1)必须以 x 开头和x结尾的串(2)每个 y 至少有一个 x 跟在后边的串 (3)所有含两个相继的x或两个相继的y的串5.处于/* 和 */之间的串构成注解,注解中间没有*/。
编译原理第二版第3章词法分析
1. ε和φ都是∑上的正规式,它所表示的正规集分
别为{ε}和Ф; 2. 任何a∈∑,a是∑上的正规式,它所表示的正 规集为{a}; 3. 假定e1和e2都是∑上的正规式,他们所表示的 正规集分别为L(e1)和L(e2),那么,以下也 都是正规式和他们所表示的正规集;
一、正规式与正规集的递归定义
3.2 单词符号及输出单词的形式
单词自身值
对常数,基本字,运算符,界符就是他们本 身的值 对标识符,将标识符的名字登记在符号表中, ‚自身值‛是指向该标识符所在符号表中位 置的指针。
假定基本字、运算符和界符都是一符一种 例:if(a>1) b=100; 词法分析后输出的单词序列是: (2, ) if (29, ) ( (10,‘a’) a (23, ) > (11,‘1’) 1 (30, ) ) (10,’b’) b (17, ) = (11,‘100’) 100 (26, ) ;
4. 仅由有限次使用上述三步定义的表达式才是∑上的 正规式,仅由这些正规式所表示的字集才是∑上 的正规集。
重点回顾
四、将正规文法转换成正规式 求非终结符的正规式 将正规文法中的每个非终结符表示成关 于它的一个正规式方程,获得一个联立 方程组 用代入法解正规式方程组 最后只剩下一个开始符号定义的正规式, 其中不含非终结符
3.3 语言单词符号的两种定义方式
作用: 描述单词的构成规则,基于这类描 述工具建立词法分析技术,进而实现词法 分析程序的自动构造。 工具有: 正规文法 正规式(Regular Expression)
多数程序设计语言的单词符号都能用正 规文法或正规式来定义。
3.3.1 正规文法
多数程序设计语言单词的语法都能用正 规文法(3型文法)描述 正规文法回顾 文法的任一产生式α →β 的形式都为 A→aB或A→a,其中A ,B∈VN ,a∈VT A→Ba或A→a,其中A ,B∈VN ,a∈ VT 正规文法描述的是VT*上的正规集
第三章有穷自动机
C
01 S0 S1 S5 0 S1 S2 S7 1 S2 S2 S5 1 S3 S5 S7 0 S5 S3 S1 0 S7 S0 S1 1
3.2.3 合并等价状态
等价状态
若s和t是M的两个不同状态,称s和t等 价:如果从状态s出发能读出某个字而停 于终态,同样从t 出发也能读出同一个字 而停于终态;反之若从t 出发能读出某个字 而停于终态,则从s出发也能读出同一个 字而停于终态。
第三章 有穷自动机
本章介绍有关有穷自动机的基本概念和 理论以及正规文法、正规表达式与有穷自动 机之间的相互关系。
§3.1 有穷自动机的形式定义
有穷状态自动机(Finite-state Automata 或简称FA)在识别功能上与正 规文法类等价,而且也等价于一个特殊类 型的语言产生器——正规表达式(Regular Expression)。因此许多简单的程序语言 都可由FA所识别。事实上,它是描述词法 的有效工具,也是进行词法分析的主要理 论基础。
消除多余状态
多余状态是指从该自动机的开始状态出发, 任何 0 S1 S2 S7 1 S2 S2 S5 1 S3 S5 S7 0 S4 S5 S6 0 S5 S3 S1 0 S6 S8 S0 1 S7 S0 S1 1 S8 S0 S6 0
B
01 S0 S1 S5 0 S1 S2 S7 1 S2 S2 S5 1 S3 S5 S7 0 S5 S3 S1 0 S6 S8 S0 1 S7 S0 S1 1 S8 S0 S6 0
l, d
l, d
l
q0
q1
l q0
q1
q2
非 l,d
图(a)
图(b)
如果赋予状态q0、q1与q2一定的操作,则
第三章_词法分析
∑*的子集U和V的连接(积)定义为
UV { | U, V}
V自身的 n次积记为 V n VV V
n
规定V0={},令
V * V 0 V1 V 2 称V*是V的闭包;
记 V VV * V 1 V 2
称V+是V的正规闭包。
3.3.1 正规式与正规集
有限自动机
有限自动机所讨论的问题
确定的有限自动机DFA 不确定的有限自动机NFA NFA的确定化 DFA的最小化
标识符单列一种;标识符自身的值表示成按机器字节划分 的内部码。
常数按类型分种;常数的值则表示成标准的二进制形式。
3.1.1 词法分析器的功能和输出形式
例 FORTRAN程序
IF (5.EQ.M) GOTO 100 输出单词符号: 逻辑IF (34,-) 左括号 (2,-) 整常数 (20, ‘5’的二进制) 等号 (6,-) 标识符 (26, ‘M’) 右括号 (16,-) GOTO (30,-) 标号 (19, ‘100’的二进制)
END;
状态转换图实现示例
'0'..'9':
BEGIN WHILE DIGIT DO BEGIN CONCAT;GETCHAR END; RETRACT; RETURN ($INT,DBT)
END;
'=': RETURN ($ASSIGN,-); '+': RETURN ($PLUS,-);
状态转换图实现示例
4 算符和界符的识别
把多个字符符合而成的算符和界符拼合成一个 单一单词符号。:=, **, .EQ.
3.2.3 状态转换图
第3章有穷自动机(胡)
(4) (a | b)* 是正规式 , 则相应正规集为 L((a | b)*)=(L(a | b))*= { a, b }*={ε,a,b,ab,ba, …} (5) ba* 是正规式 , 则相应正规集为 L(ba*)=L(b)L(a*)={b,ba,baa,baaa,…} (6) (a | b)*(aa | bb ) (a | b)*是正规式 , 则相应正规集为 L((a | b)*(aa | bb ) (a | b)*) =L((a | b)*)L(aa | bb ) L((a | b)*) ={a,b}*{aa,bb}{a,b}*
注意: 1)对于 关键字、运算符和界符 种别码是一字一 符。可以完全代表它自己。也就不用写自身值。 2)对于标识符和常数就必须依赖自身值来区分。 标识符自身值是它自己的字符串。 常数自身值是常数本身的二进制数值。 我们可以用指向标识符表或常数表的入口指针作 为它们的自身值
下表是简单语言单词符号的内部表示:
3.4 有穷自动机
自动机是一种能进行运算并实现自我控制的装置,
计算机就是一部自动机。自动机是描述符号串处理的强
有力的工具。因而自动机成为研究词法分析器的重要基
础。在识别功能上与正规文法类和正规表达式等价。 下面介绍有关有穷自动机的基本概念和理论以及正 规文法、正规表达式与有穷自动机之间的相互关系。
例题1 (右线性) 给定文法G[Z]: Z→0A A→0A|0B B→1A| ε 解:首先改为正规方程组: Z=0A A=0A+0B B=1A+ε 联立求解:3)代入2) A = 0A+01A+0 = (0+01)A+0 其次应用求解规则得 A =(0+01)*0 代入1)中 Z = 0 (0+ 01)*0 正规式为 = 0 ( 0 | 01 )* 0
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计词法分析程序
单词的描述工具
单词的识别系统
正规文法与正规式
有穷自动机
第三章 词法分析与有穷自动机
• 3.1 词法分析程序的功能
• 任务
从左到右扫描源程序,产生一个个单词符号。 • 通常词法分析程序作为语法分析程序的子程序
调用过程
字符串表示的 源程序
字符
词 法 分 析 器
• DFA M的矩阵表示
字符 0 1 2 3 a 1 3 1 3 b 2 2 3 3
状态
• DFA M的状态图表示
1 a 0 b 2 初态用箭头指出 终态双圈表示 b a a 3
a,b
b
3.4.1 确定有穷自动机(DFA) • Σ 上的符号串α 被 DFA M接受 从初态到某一终态结点通路上所有弧的标 记连接的字等于 α ,则称 α 可被M识别 (接受)。
例
正规式 φ
ε
a a|b ab (a|b)(a|b) a* ba* (a|b)*
正规集 φ {ε } {a} L(a|b)=L(a) ∪ L(b)={a,b} L(ab)=L(a)L(b)={ab} {aa,ab,ba,bb} { ε ,a,aa,aaa,…} {b,ba,baa,baaa,…} {所有由a和b组成的字}
例 NFA M=({S,P,F},{0,1}, f ,{S,P},{F}) 其中 f 为: f (S,0)={P} f (S,1)={S,F} f (P,1)={F} f (F,1)={P} f (F,0)={P}
1 1
0
F
1
{S,F} 1 {F} {P}
SS P 0 F
{P} 0,1
φ
P{P}
初态不惟一 后继状态不惟一
• 单词种别
• 一般用整数编码,对应五种单词,由具体的实 现系统来编码。 • 编码之后,语法分析可以对它进行识别。
• 单词自身的值
• 存放可以取到这个单词值的方法。 如: 标识符,自身值是它所在符号表的指针; 常数,自身值是其在常数表的指针; • 通过这个指针查到单词的值和属性,用于语义 分析。
• NFA M所接受字符串的集合称为NFA M所能 识别的语言,记为L(M)。 • NFA的确定化 DFA是NFA的特例
NFA M存在与之等价的DFA M’,L(M)=L(M’) 与某一NFA等价的DFA不惟一 正规式 NFA 正规文法 DFA
3.4.4 NFA 确定化
• 状态集合I的空闭包:ε -closure(I) 它是一个状态集合,包含 : ♠ I中任何状态q ♠ I中任何状态q经任意条空弧到达的任何状态 • 状态集合I的a弧转换:Ia 定义一个状态集J,J是I中所有状态经一条a 弧到达的状态的全体 Ia=ε -closure(J)
ε
ε
2
ε
6 b
ε
f
3.4.5 DFA的最小化(化简)
• 最少状态DFA 对于一个DFA M,存在一个最少状态DFA M’, 使得L(M’)=L(M)。 (a)没有多余状态 (b)没有两个状态是互相等价的 结论: 一个NFA 对应的DFA不惟一 但它对应的最小化DFA不计同构是惟一的
• 多余状态的例子 a
• ε -closure(I)例子 ε 5
a 1 a
6
ε
ε
2
a
3
ε
8
4
ε
7
I={1} , I={5}, I={1,5}
ε -closure(I)= {1,2} ε -closure(I)={5,6,2} ε -closure(I)= {1,2,5,6}
• I的a弧转换例子 ε 5
a 1 a
6
ε
ε
3.3.1 正规式与正规集
• 3 正规式等价 若两个正规式U和V所表示的正规集相同,则说 U和V等价。 记作:U=V
例 两个正规式等价
U=(a|b) U=b(ab)* U=(a|b)*
V=b|a V=(ba)*b V=(a*b*)*
3.3.1 正规式与正规集
• 4 正规式性质
设A,B和C均为正规式,则: ♣ A|B=B|A 或的交换律 ♣ A|(B|C)=(A|B)|C 或的结合律 ♣ A(BC)=(AB)C 连接的结合律 ♣ A(B|C)=AB|AC 分配律 (A|B)C=AC|BC 分配律 ε 是连接的恒等元素 ♣ ε A=A ε =A ♣ (A*)*=A* ♣ A*=AA*| ε =A|A*=(A| ε )*
语 单词符号 法 分 析 取下一个 器
单词符号
图 词法分析程序
3.2 单词符号及输出单词的形式
• 1 单词符号 程序语言中具有独立意义的最小单位。 一般分五种:
个数 不确定
关键字 标识符 常数 运算符 界符
个数 确定
3.2 单词符号及输出单词的形式
• 2 单词的机内表示 二元式: (单词种别,单词自身的值)
例 3.4 设有正规文法G[Z]: Z → 0A A → 0A|0B B → 1A| ε 求出该文法生成语言的正规式。 解得 正规文法G[Z]所生成语言的正规式是 0(0|01)*0
例3.5 设有正规文法G[A]: A → aB|bB B → aC|a|b C → aB 求该文法对应的正规式。
解得 G[A]所生成语言的正规式是: (a|b)(aa)*(a|b)
例 3.8 将R=(a|b)(aa)*(a|b)转换为正规文法。 S → (a|b)(aa)*(a|b)
解得G[S]: S → aA|bA A → aB|a|b B → aA
例 3.9 将R=l(l|d)*转换成正规文法
S → l(l|d)* 消去ε 得G[S]: S → l|lA A → l|d|lA|dA
3.3.1 正规式与正规集
• 1 正规式的递归定义 注:正规式中只包含3种运算符: 连接“•”,或“|”,闭包“*”。 优先级依次为:闭包-连接-或。 三种运算均是左结合的。
3.3.1 正规式与正规集
• 2 正规集 • 由正规式所表示的字集为这个正规式所对应的 正规集,也把它叫做正规式所定义的语言。 • 正规式U的正规集表示为L(U)。
• 例 if (a>1) b=100; 词法分析后的形式 if (2, ) ( (29, ) a (10,’a’) > (23, ) 1 (11,’1’) ) (30, ) b (10,’b’) = (17, ) 100 (11,’100’) ; (26, )
3.3 单词的两种定义方式
描述机制
• 正规文法(右线性文法和左线性文法) 机器易于识别 • 正规式 简洁清晰
a
A {1,2,4} C {1,2,4}
b
B B
A {1,2,4,5,6,f} D C {1,2,4,6,f} E
F {1,2,4,5,6,f} D F {1,2,4,5,6,f} D C {1,2,4,6,f} E
3.4.4 NFA 确定化-子集法
NFA N: i a 1 b DFA N’: a S b A b a B b D b a a 3 a 5 b a a C b b a E a F b 4 b a
3.4.2 非确定有穷自动机(NFA)
• α 被NFA M接受:从某一初态结点到某一终点 的通路上所有弧的标记连接成的字等于 α • 存在空转移的自动机一定是NFA • 如果某些结点既是初态又是终态,或 从某个初态到某个终态有空通路,则空字 ε 也 可被接受。
1
ε
2
ε
3
3.4.2 非确定有穷自动机(NFA)
• 例 DFA M=({0,1,2,3},{a,b}, f ,0,{3}) 其中 f 为: f (0,a)=1 f (0,b)=2 f (1,a)=3 f (1,b)=2 f (2,a)=1 f (2,b)=3 f (3,b)=3 f (3,a)=3
3.4.1 确定有穷自动机(DFA) • DFA的表示方法 两种:矩阵和图形的方式 矩阵称为状态转换矩阵 图形称为状态转换图
例 3.6 设有正规文法G[Z]: Z→ U0|V1 U→ Z1|1 V → Z0|0 求该文法对应的正规式。 解得 G[Z]所生成语言的正规式是: (10|01)(10|01)*
2 正规式转换到正规文法
Σ 上的正规式r转换到3)A→ab,可化为A→ aB,B →b (4)A→a*b,可化为A→ aA|b 不断应用(3),(4),直到每个产生式右部都只含有一个终结 符或 ε 为止。
解得G[S]: S → lA A → lA|dA| ε
去掉 ε 规则的算法
消去ε 规则的算法: (1)找出文法中在所有经过若干步能推出ε 的非终结符, 放入V中。 (2)按如下步骤构造新的P’: (a)若V中元素在某产生式右部,则将它变成两个产 生式:分别以ε 和它本身代入,将新生式加入P’ (b)其他产生式除去ε 也加入P’ (c)如果P中有产生式S →ε ,则引入新S’,将S’ → S|ε 加入P’
2
a
3
ε
8
4
ε
7
I={1,2}
J={5,3,4}
Ia= ε -closure(J)={2,3,4,5,6,7,8}
3.4.4 NFA 确定化-子集法
• NFA M=(Q, Σ , f ,S,Z) 转换成 DFA M’=(Q’, Σ ’ , f ’ ,S’,Z’) (1)字母表相同,令S’= ε -closure(S) (2) Q’, f ’ ,Z’ 由状态矩阵得出。
a 0 1 a 2 b 3 b a b 3 ab 1 a 2 a 5 a 6 4 0 b a b b a b 7 4 b 5
8
3.4.5 DFA的化简-分划法
• (1)首先将状态分成两个子集:终态和非终态 • (2)检查子集中的状态是否等价: 对输入字符是否落入现行的不同子集,是 的话就分化;直至没有新的分划。 • (3)最后在每个子集中选出一个代表,消去其他 等价状态。