有穷自动机与词法分析器
第三章词法分析及有穷自动机-PPT

={a}*={ε,a,aa,aaa,、、…}
复 6o 合 7o
8o
ba* a| ba* (a|b)*
L(ba*)=L(b) L(a*) ={b,ba,baa,baaa,……}
L(a| ba*)=L(a)∪L(ba*)={a,b,ba,baa,……}
L((a|b)*)= (L(a|b))*={a,b}*={ε,a,b,aa,ab,…… 所有ab组成得串}
……
§3 正规式与有穷自动机
❖ 为了进一步讨论词法分析程序得自动生成,需 要将状态转换图得概念加以形式化;同时将由 正规文法描述得单词由正规式描述,可利用有 穷自动机生成词法分析程序。
一、正规式与正规集
语言得单词结构不仅由正规文法描述,还可以 由正规式描述。
例:<标识符>∷=<字母>|<标识符><字母>|<标识符>< 数字>
单词:指语言中具有独立意义得最小语法单位。 语言中得单词符号:
一般可归结为五种:
❖ 保留字(基本字):如if, for, and 等――个数确定 ❖ 标识符:表示常量、变量、类型、过程等名称――个数不确定 ❖ 常数:如34,-0、37等――个数不确定 ❖ 运算符:如+,-,*,/,< 等――个数确定 ❖ 界线符:如逗号,分号,括号等――个数确定
④ 以识别符号为终止状态。
例:设有正规文法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
第三章 词法分析和有穷自动机

ε
ε
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)
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))*
正规式描述了单词符号的构成规则,正规集是正规 式能描述的所有的单词的集合。
有穷自动机在词法分析器建模中的应用研究

界符= l 1 I , ; . (I) 其中l 示 a 表 —— z中 的 任 何 一 个 字 母 , 示 d表 9中的任何一 个数 字 。 e*也 都 是 正 规 式 , 们 所 表 示 的 正 规 集 分 别 为 l 它 关 键字 也 是一 种单 词 ,关 键 字集 合是 标 识符集 合 Le) (1ULe) (1・(2, (1 ; (1Le) (2, e)Le)Le) , L ( ) 的子集 , 关键字 与标 识符 的构 词原则 相 同。 ()仅 由有 限次 使 用上 述 三个 步骤 而 定 义 的表 达 4 式才 是 ∑上 的正 规式 , 由这些 正 规式 所 表示 的字 集 仅 整数 前 面 的正 负 号 在 词 法 分 析 中可看 作 运 算 符 , 因此 只定 义无 符号 整数 的词法 。 才是 ∑上 的正 规集 。[ 1 1 - . 正 规式 可 用 来 描述 符 号 串所 遵从 的规则 ,用 正规 232将词法 转化 为有穷 自动机形 式 的词法模 型
2 1 年第 1 0 1 1期
福 建 电
脑
9 5
有 穷 自动机在词 法分 析器建模 中的应 用研究
罗 海 丽
(内 蒙古科技 大 学 信息工程 学院 内蒙古 包头 0 4 1 1 0 0)
【 摘 要】 :有 穷自动机可用于描述语言的词法模型,有穷自动机形式的词法模型与特定的控制程序 相 配合 可构 成语 言 的词 法分析 器 。介 绍 了利 用有 穷 自动机 建 立语 言的词 法模 型及 以此 词 法模 型为基础 构 建词 法分析 器的过程 。实例 证 明 , 方 法构造 的词 法 分析 器正确 、 该 有效 。 【 关键词】 :有穷 自 动机; 正规文法; 控制程序; 词法模型; 词法分析器
编译原理报告—词法分析器

词法分析器的作用词法分析是编译的第一阶段。
词法分析器的主要任务是读入源程序的输入字符,将它们组成词素,生成并输出一个词法单元序列,这个词法单元序列被输出到语法分析器进行语法分析。
另外,由于词法分析器在编译器中负责读取源程序,因此除了识别词素之外,它还会完成一些其他任务,比如过滤掉源程序中的注释和空白,将编译器生成的错误消息与源程序的位置关联起来等。
总而言之,词法分析器的作用如下:1.读入源程序的输入字符,将它们组成词素,生成并输出一个词法单元序列;2.过滤掉源程序中的注释和空白;3.将编译器生成的错误消息与源程序的位置关联起来;4.其它。
词法分析过程首先,对某个正则语言L,构造能够描述其的正则表达式r;然后,需要将r 转换成一个有穷自动机。
这里有三种方法,一是直接转换成NFA,而是直接转换成DFA,三是先转换成NFA,再把NFA 转换成DFA;最后,如果将r 转换成了一个DFA,需要将此DFA 的状态数最小化。
正则表达式正则表达式可以用来描述词素的模式,一个正则表达式可以由较小的正则表达式递归的构建。
对于符号集合∑={a,b},有:-正则表达式a 表示语言{a};-正则表达式a|b 表示语言{a,b};-正则表达式(a|b)(a|b)表示语言{aa,ab,ba,bb};-正则表达式a*表示语言{ε,a,aa,aaa,…};-正则表达式(a|b)*表示语言{ε,a,b,aa,ab,ba,bb,aaa,…};-正则表达式a|a*b 表示语言{a,b,ab,aab,aaab,…}。
上面通过基本的并、连接和闭包运算递归定义了正则表达式有穷自动机一个有穷自动机可以把一个描述词素的模式变成一个词法分析器,从本质上来讲,有穷自动机是与状态转换图相类似的图,它有以下特点:有穷自动机是一个识别器,它只能对每个输入符号串简单的输出“yes”或“no”,表示是否能够识别此符号串;有穷自动机和状态转换图类似,它具有有限个数的结点,每个结点表示一个状态,并且这些状态中有一个初始状态和若干个终止状态。
编译原理 第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等都是保 留字,它们一般不用作一般标识符。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.1 词法分析(续)
字符串空间
– 字符串的存储问题 – 一般方法
• 使用缓冲区记录开始地址和长度
m a r t
mart: 1 4
m a s k w o r d
mask: 5 4 word: 9 4
– 注意检查是否有重复存储的字符串 – 字符编码问题
3.1 词法分析(续)
词法错误校正
– 目的:发现更多的错误,分析继续下去 – 手段:
3.2 确定有穷自动机(续)
有向图与状态表的区别
– DFA的两种表示形式 – 有向图:
• 直观 • 易于理解
– 状态表
• 便于计算和处理 • 便于计算机表示
总结
内容
– 词法分析功能 – 确定有穷自动机
重点
– 确定有穷自动机的概念
作业
– P60 3.1
3.1 词法分析(续)
单词内部表示
– 标识符的内部表示
$id
$id
x1
......
x1z12
......
– 指针方法 – 其它符号的内部表示 – 为什么单独处理标识符
3.1 词法分析(续)
保留字
– 什么识保留字 – 分析保留子的方法
• 保留字表,数据实现 • 非保留字表,程序实现
空格、制表符、换行符
3.2 确定有穷自动机(续)
思考:
– 标识符(带下划线)?
L 0 2
L,D _ L,D
3
3.2 确定有穷自动机(续)
接受偶数个0
0 0 0 1
3.2 确定有穷自动机(续)
思考与练习
– 奇数个0? – 偶数个0和偶数个1?
3.2 确定有穷自动机(续)
确定有穷自动机状态表
– 状态转换可以使用函数来表示
第三章 有穷自动机 与词法分析器
任课教师 王养廷
主要内容
词法分析
有穷自动机
3.1 词法分析
词法分析功能
– 源程序文件
• ASCII编码 • 文本文件 • 例如:“A1”保存为4131
– 单词
• 源程序的语法成分 • 例如:if, (, …
3.1 词法分析
词法分析功能
– Token
• 单词的内部表示,例如: 程序表示 If then begin end + ASCII码 6966 7468656e 626569676e 656e64 2b Token.class 01 02 03 04 05 Token.seman 6966 7468656e 626569676e 656e64 2b
– 检查配对
• 使用计数器 • 更准确地方法如何实现?
3.1 词法分析(续)
向前看多个字符
– 词法分析有时需要向前看多个字符,例如:
• • • • 10 10.12 10..12 有时需要看到第一个‘.’后的字符才能确定
– 处理技术
• • • • 沿着收到的字符倒退到终态 把回退字符集如缓冲区,以便下一次扫描 引入Token标志 例如:12.3e+q的分析
其中Φ表示给定一个状态和输入字符就可以唯 一确定下一个状态
3.2 确定有穷自动机(续)
自动机定义方式
– 图形法 – 转换表法 – 函数法
3.2 确定有穷自动机(续)
DFA例子(函数法)
– 符号集Σ={0, 1, 2, ...... ,9}; – 状态集合SS={S0, S1}; – 开始状态: S0 ; – 转换函数Φ:SS X Σ →SS; Φ(S0, d)= S1 , Φ(S1, d)= S1 – 终止状态集:{S1};
– 它们可以作为分隔符 – 有的语言空格符无词法意义 – 例如:下面两行等价
• beginx • begin x
– 字符串中的空格需要单独处理 – 换行可以用于行计数
3.1 词法分析(续)
括号类配对
– Pascal语言中的括号类
• • • • • • begin ......end record......end if......then [......] (......) {......}
• 转换函数Φ:SS X Σ →SS;
– 状态转换可以使用图形来表示
• 状态转换图
– 状态转换还可以使用表来表示
3.2 确定有穷自动机(续)
状态转换表示例
0 1
S0 *
S1 S2 S3 *
S1
S0 * S3 * S2
S2
S3 * S0 * S1
1 确定有穷自动机(续)
状态表说明
– 主要状态:第一列 – 输入字符:第一行 – 终结状态:带有*号 – 每个单元的状态表示某个状态接受某个字符 后的状态 – 状态表便于机器处理
3.2 确定有穷自动机
说明
– 有穷自动机(FA) – 确定有穷自动机(DFA) – 非确定有穷自动机(NFA)
3.2 确定有穷自动机(续)
定义
确定有穷自动机(DFA)有以下几个部分组 成:
• • • • • 符号集Σ(输入符号集); 状态集合SS={S0, S1, S2, S3... Sn}; 开始状态: S0 ; 转换函数Φ:SS X Σ →SS; 终止状态集:{Si1, Si2... Sik};
3.2 确定有穷自动机(续)
实数的DFA
d d 0 1 . 2 d 3 d
3.2 确定有穷自动机(续)
第二个位置上为2的正整数(包括一位)
d 0 d 1 2 3
3.2 确定有穷自动机(续)
思考
– 将上题改成不包括一位,对应的DFA是什么?
3.2 确定有穷自动机(续)
标识符
L,D L 0 2
• 作为语法分析的一个子程序,每次产生一个 Token • 作为编译器独立的一遍、生成Token序列
3.1 词法分析
词法分析功能
– 单词识别
• 从字符串中分离出单个单词
– 主要的单词
• • • • • 标识符 正整数 保留字 符号 ……
3.1 词法分析
词法分析功能
– 词法分析复杂性,例子:
DO 10 I = 1 , 100 DO 10 I = 1. 100
(
28
06
28
3.1 词法分析
词法分析功能
– 标识符
• 用户定义的符号 • 作为一类来处理
– 常量
• 可以作为一类或多类
– 保留字
• 用来分隔语法成分 • 一般每个一类 • 与保留字的区别(算法设计?)
3.1 词法分析
词法分析功能
– 词法分析输入:源程序 – 词法分析输出:Token序列 – 词法分析功能:把源程序转换成Token序列 – 词法分析器种类
• 删去已读过的字符 • 删去已读过的第一个字符
– 特别注意越行字符串的处理
3.1 词法分析(续)
词法分析结束
– 使用程序结束标志
• 例如:Pascal中的end.
– 使用文件结束标志
• 可以有效处理错误程序
3.1 词法分析(续)
使用词法分析的好处
– 使语法分析与语义分析更简练 – 便于使用自动机理论描述 – 有利于提高编译器的效率 – 有利于编译器的移植
3.2 确定有穷自动机(续)
DFA有向图表示
– – 状态 开始状态
–
–
转换边
接受(或终止)状态
3.2 符串 – 作用??
3.2 确定有穷自动机(续)
特殊例子
d
d
d
3.2 确定有穷自动机(续)
DFA举例
d d
3.2 确定有穷自动机(续)
练习
– 实数的DFA – 第二个位置上为2的所有正整数 – 标识符,由字母字符引导的数字、字母字符 串。 – 接受偶数个0的DFA – 接受奇数个1的DFA – 接受偶数个0和偶数个1的DFA