第三章 词法分析与有穷自动机
《编译原理》第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)
编译原理分知识点习题 词法分析与有穷自动机
1. 将图1所示的有穷自动机转换成与其等价的正规文法,其中4、5为终止状态。
解答:本题考查有穷自动机到正规文法的转换方法。
这类题只需要书中所介绍的方法进行即可得到正规文法,本题有穷自动机对应的正规文法G[S]为:A →aB|bB|cCB →aB|bD|aE|cC|b|aC →bB|cC|cE|cD →bD|bE →aE|a图1有穷自动机的状态转换图2.给定如图2所示的有穷自动机,试用正规表达式给出它能接受的语言集合。
图2有穷自动机解:本题考查正规表达式与有穷自动机的等价性。
对于一个在输入字母表∑上的FAM ,一定可以在字母表∑上构造一个正规表达式e ,使得L(e)=L(M) .根据状态转换图,从开始状态出发,可以有任意个(包括0个)b 作为句子的开始部分;从0状态出发,每输入一个a ,不许输入两个b 才能到达终止状态后,还可以通过输入a 回到状态1,或输入b 回到状态0,然后进入递归过程,再输入相同的符号串,所以,该有穷自动机描述的语言为:startab(b*(aa*b)*b)*3. 构造下述正规表达式的DFA。
Xy*|yx*y|xyx解:本题考查由正规表达式构造有穷自动机的方法,本题可按照由正规表达式构造等价的NFA,NFA确定化,DFA最小化3步进行求解。
(1)根据题中所给的正规表达式得到相应的DFA如图3所示。
图3正规表达式Xy*|yx*y|xyx的DFA。
(2)依据该NFA采用子集法构造确定DFA其过程如表1(已换名)所示。
以所有包含NFA的终止状态Z的DFA状态作为终止状态,得到DFA相应的状态转换图如图4所示图4 DFA的状态转换图(3)对DFA进行最小化,过程如下:已知K={0,1,2,3,4,5,6}。
首先将K分成两个子集K1={0,2,3} (非终态集)K2={1,3,4,6} (终态集)在状态集合K1={0,2,3}中,因为{0}x={1}⊂K2{2,4}x={4}⊂K1所以状态0与状态2,4不等价,故K1可分割为K11={0} K12={2,4}在状态集合K12={2,4}中,因为有{2,4}x={4} {2,4}y={5}⊂K2所以,状态2和状态4等价。
第三章词法分析及有穷自动机
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(假定文法的词汇表中不含
编译原理第三章_有穷自动机
例 过河问题 分析(续)
初始状态: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章 词法分析(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章有穷自动机
14
例:下图是一个NDFA,它所识别的是所有含有相 继两个a或相继两个b的字。
15
例子 NFA M=({S,P,Z},{0,1},f,{S,P},{Z}) 其中 f(S,0)={P} f(Z,0)={P} f(P,1)={Z} f(Z,1)={P} f(S,1)={S,Z}
16
状态图表示
1S 0
9
3.1.3 自动机的等价性
对于*中的任何字 ,若存在一条从初态结点 到某一终态结点的通路,且这条通路上所有弧的标 记符连接成的字等于 ,则称可为 DFA M所识别 (读出或接受)若M的初态结点同时又是终态结点, 则空字可为M所识别(或接受)。DFA M所能识别的 字的全体记为L(M)。
对于任给的DFA A1和A2,若L(A1)=L(A2),称 自动机A1与A2等价。P37 例3.5。
13
对于∑*中的任何一个字,若存在一条从某一 初态结点到某一终态结点的通路,且这条通路上所 有弧的标记字依序连接成的字(忽略那些标记为的 弧)等于,则称可为NDFA M所识别。若M的某些 节点既是初态结点又是终态结点,或者是存在一条 从某个初态结点到某个终态结点的的通路,那么, 空了可为M所接受。
4
3.1.1 状态转换表
第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等都是保 留字,它们一般不用作一般标识符。
03第3章 词法分析1
3.5.2 正则文法与正则表达式的等价性
正则文法与正则表达式有等价性,即可以将正则文法转换成正则 表达式。 例如,用正则文法表示标识符的文法规则如下: <标识符>∷= a|b|…|z |<标识符>a|<标识符>b|…|<标识符>z |<标识符>0|<标识符>1|…|<标识符>9 而采用正则表达式则为: <标识符>= (a|b|c|…|z){a|b|…|z|0|1|…|9} 或简写成 <标识符>=字母{字母|数字} 由此可见,正则表达式在描述语言时比正则文法更为简洁 由此可见,正则表达式在描述语言时比正则文法更为简洁。
3.5.1 正则表达式定义
3.5.1 正则表达式定义
在正则表达式的运算符中,重复优先级高于连接,而连接高于 选择,因此,(p) | ((p) . (q))可写成p | pq , 但表达式(p|q).r中的括 号则不能去掉。 例3.5,设字母表∑={a,b},则a,b, Φ和ε都是∑上的正则表达式, 所描述的语言为{a}、{b}、{}、{ε},求表达式{a}{b}、{a|b} {aa|ab|ba|bb} 和{aa|ab|ba|bb}定义的语言。 解:根据正则表达式的形式定义,可得如下结果: 表达式{a}{b}定义的语言为:{ambn|m≥0,n≥0}, 表达式{a|b}定义的语言为:{x|x ∈{a,b}*},即字母a或b组成的 任意长度字符串。 而表达式{aa|ab|ba|bb}表示的语言由字母a或b组成的所有偶长 度字符串。
3.5.2 正则文法与正则表达式的等价性
例3.7,有正则文法如下,将其换成 等价的正则表达式。 S → aS S →aB B →bC C →aC C →a 解: 先用元符号“{”和“}”将文法改 写成如下: S={a}aB B =bC C = {a}a 然后按解方程组的方法可得: C={a}a B= b{a}a S={a}ab{a}a 最终转成正则表达式 S={a}ab{a}a 可以验证,它表示的语言与原来 的正则文法描述的语言相同。
第三章_词法分析
∑*的子集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 状态转换图
第三章有穷自动机
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一定的操作,则
第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)。
2. 正规式到正规文法的转换
字母表上的正规式R到等价的正规文法G: ①令VT= ; ②令文法的开始符号S = R ; ③对形如A→ab 的规则转换为A→aB 和B→b; ④在新的文法中,将形如A→a*b 的规则进一步转换 为A→aA | b; ⑤不断利用③和④进行转换,直到每条规则的右部最 多含有一个终结符号为止。 P37-38 例3.8 R=(a|b)(aa)*(a|b) 例3.9 R=e(e|d)*
3.4.1 确定有穷自动机(DFA)
一个 DFA M是一个五元式 M=(Q, ,δ ,S,F) 其中,Q是有限状态集,是输入字符的字母表, δ是Q×Σ到Q的单值部分映射(即状态转换), δ(qi,a)=qj, S∈Q是唯一初态, F 是终态集(可空)
例3.10设DFA M=({q0,q1,q2},{a,b},f,q0,{q2})
一、 语言的单词符号 (token) 具有独立意义的最小语法单位。 关键字 标识符 常量 运算符 界符 :基本字 保留字 :表示各种名字 :常数 :+ - * / < > :, ; : ( )
3.2 单词符号及输出单词的形式
3.2.2 单词的输出形式: (单词种别,单词自身的值) 1、单词种别
单词种别编码:整数码 一符一种、一类一种
3.4 正规式与有穷自动机
有穷自动机( finite automata)(FA):具有离散 输入和输出系统的一种抽象数学模型。能够准确地 识别正规集。 DFA NFA 正规式R与FA M是等价的: (1)对任何正规式R,都存在一个FA M 使得L(M)=L(R); (2)对任何FA M,都存在一个正规式R, 使得L(R)=L(M)
3.3 单词符号的两种定义方式
单词符号结构的形式化描述方法:
正规文法(3型文法)(regular grammar)
正规式(正规表达式)(regular expression) 例:标识符的定义 id → let | id dig | id let let ( let | dig )*
3.3.1 正规式与正规集
方法和步骤:
A X R Y
r1r2 r1| r2 r1*
r1
B A C
r2
B
r1
B
① R=Φ ② R=ε ③ R=a
A
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的状态转换图实施分裂(替换)
R1=R2 正规式R1与R2等价
正规式的代数性质:
恒等式 rs=sr 说明 “”是可交换的
r(st)=(rs)t “”是可结合的 r(st)=(rs)t 连接是可结合的 r(st)=rs rt (st)r=srtr r=r r=r r*=(r)* r**=r* 分配律 对连接,是单位元素 “*”和之间的关系 “*”是幂等的
例如:程序段 if (i>j) i=20; 经词法分析器处理后, 输出单词符号系列: 〈if, 〈 — 2, 〉— 〉 〈(,〈 —29 〉 ,— 〉 〈id,指向 〈10,指向 i的符号表入口的指针〉 i的符号表入口的指针〉 〈 〉, 〈 23 —, 〉— 〉 〈id,指向 〈10,指向 j的符号表人口的指针〉 j的符号表人口的指针〉 〈), 〈 — 30, 〉— 〉 〈id,指向 〈10,指向 i的符号表入口的指针〉 i的符号表入口的指针〉 〈=, 〈 — 17 〉 ,— 〉 〈con 〈 ,指向 11,指向 20的常量表入口的指针〉 20的常量表入口的指针〉 〈;, 〈 — 26, 〉— 〉
1. 正规文法到正规式的转换 ①将文法中的规则写成关于每个非终结符的正规式方程,得到一个方程组; ②依照求解规则: 若A=αA |β,则解为A= α*β; 若A=Aα |β,则解为A= βα*; 并使用正规式的代数性质,求文法开始符号的解。 例3.4 例3.5 例3.6 P36--37
例3.4 Z→ A→ B→
正规集对应的正规式练习:
1、以1开头以0结尾的二进制串;
={0,1}
2、倒数第三个符号是0的二进制串; 3、含有相继的三个0的二进制串;
4、含有相继的两个0或相继的两个1的二进制串; 5、含有奇数个1的二进制串; 6、二进制的奇数; 7、每个1都有0直接跟在后边;
8、长度能被3整除的二进制串; 9、值能被3整除的二进制串; ……
一、定义 正规表达式 1. , 2. ai 设 ={a1,a2,…,an}是字母表 正规表达式表达的语言(正规集) {}, {ai}
3.
若有 r, s
r|s
L( r ) , L(s)
L( r ) L(s)
则有 ( a )
(b)
(c)
rs
( r )*
L( r ) L(s)
( L( r ))*
ii:若s∊T,则从s出发经过任意条弧而能到达的状态s’都 属于_CLOSURE(T)。
②定义状态集Ta = _CLOSURE(J):
若状态子集T={t1,t2,…,tn},则δ(T,a)= _CLOSURE(J); 其中J=δ(t1,a)∪δ(t2,a) ∪…∪δ(tn,a)
有 限 自 动 机(NFA与DFA)
2、单词自身的值 标识符自身值的表示 常数自身值的表示
词法分析器的输出:
(单词种别,单词符号的属性值)
单词种别提供给语法分析程序使用;单词自 身的属性值提供给语义分析程序使用。 具体的分类设计以方便语法分析程序使用为 原则。关键字可分成一类,也可以一个关键 字分成一类。常数可统归一类,也可按类型 (整型、实型、布尔型等),每个类型的常 数划分成一类。
开始 偶 0偶 1 0
1 0 0 1 1 0 1 0 偶 0奇 1
奇0偶1
2
1
3
奇0奇1
解释下列有限自动机分别识别什么语言? 1 0 1 2 3 4 5 1 0 1 0 0 6 7 0 8 0 9 1 1 1 0 1
1 a
2
a
3
a a
4
a
5
3.4.2 非确定有穷自动机(NFA)
一个 NFA M是一个五元式 M=(Q, ,δ ,S,F) 它包括: 状态集合Q 输入符号集合 转换函数δ : Q ({}) P(Q) S 是非空开始状态集 F Q是接受状态集合 例3.11 P39 a 识别语言 (a|b)*ab 的NFA 开始 0 a 1 b 2
a
{0}
a
{0, 1}
使得L(M) = L(M″ )。 也就是说,每一个NFA M都可以转换成等价的 DFA M″ 。
正规式 正规文法
NFA
DFA 最小化的DFA
实现
3.4.3 由正规表达式R构造NFA
方法和步骤: ① R=Φ ② R=ε ③ R=a
X a Y X R Y
X
Y ε
X
Y
④R为复合正规式?
3.4.3 由正规表达式R构造NFA
例 设DFA M=({0,1,2, 3}, {a,b} , δ , 0,{3}) 其中 δ(0,a)=1,δ(1,a)=3 δ(2,a)=1,δ(3,a)=3 δ(0,b)=2,δ(1,b)=2 δ(2,b)=3,δ(3,b)=3
转换矩阵
a 0 1 2 3 1 3 1 3 b 2 2 3 3
状态转换图 a 0 b 1 a a 3 a
2、将M’进一步变换为DFA :
①状态子集T的闭包_CLOSURE(T) ②定义状态集Ta = _CLOSURE(J) ③从DFA的初态_CLOSURE({X})开始计算状态转换矩阵;直到 不再产生新的状态子集为止。
3、换名
例3.14 3.15 P43-44
①状态子集T的闭包_CLOSURE(T): i:若s∊T,则s属于_CLOSURE(T);
f(q0,a)=q1 f(q1,a)=q1 f(q2,a)=q2
f(q0,b)=q2 f(q1,b)=q1 f(q2,b)=q1
一个DFA可用一个状态转换矩阵表示,
行表示状态,列表示输入字符,矩阵元素表示 δ(qi,a)的值。 一个DFA也可用一个状态转换图表示。
所以,一个DFA有三种表示方法: (1)转换函数; (2)状态转换矩阵; (3)状态转换图。
有正规文法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
b
• NFA的转换表
状 态
0 1 2 输 入 符 号
a0} {2}
a
识别语言 (a|b)*ab 的NFA
开始
0 b
a
1
b
2
注意: NFA M的状态转换图中可有标记为的边。
例 识别aa*|bb*的NFA
a 1
a
开始
0
2
b
3 b 4
DFA是NFA的特例。
对于每一个NFA M存在一个DFA M″ ,
例
while (i!=j)
if (i>j) i=i-j; else j=j-i;
词法分析器
‘while’, ‘(’,‘i’,‘!=’,‘j’, ‘)’, ‘if’,‘(’,‘i’,‘>’,‘j’,‘)’, ‘i’, ‘=’ , ‘i’, ‘-’ , ‘j’, ‘;’, ‘ else’, ‘j’, ‘=’, ‘j’, ‘-’, ‘i’ , ‘;’