当前位置:文档之家› 编译原理(2)词法_1(正规表达式与有限自动机简介)

编译原理(2)词法_1(正规表达式与有限自动机简介)

2.4
正规表达式与有限自动机简介
正规表达式到有限自动机的构造
2.5
词法分析器的自动生成
2.3

正规表达式与优先自动机简介
2.3.1:正规表达式与正规集(定义和运算)
–状态转换图可以构造词法分析程序,但属于非形式化描述
–正规表达式(简称正规式)是词法分析的形式化表示方法 • 所谓形式化的方法,是指用一整套带有严格规定的符号 体系来描述问题的方法,优点:更加清晰和准确 –例如:形式化表示标识符,即标识符的正规式: letter(letter | digit)* 能够表示的单词集合称为正规集
西北农林科技大学本科教程
第 2 讲
主讲教师:赵建邦
本讲目标

第二章《词法分析》前三节

2.1 2.2 2.3
词法分析器的设计方法 一个简单的词法分析器 正规表达式与有限自动机简介

重点掌握

状态转换图的概念 正规表达式的概念和运算
第二章 词法分析
2.1 2.2
词法分析器的设计方法 一个简单的词法分析器
2.1.1:单词符号的分类与输出形式
–输出形式:单词符号通常表示成如下的二元式:
(单词种别,单词自身的值/内码值) 1、单词种别:即单词的种类。为了处理方便,通常让每种单 词对应一个整数码,可以最大限度地将每个单词区别开来 • 保留字:可以统一视为一种,也可一字一种(后一种较
常用)
• 标识符:统一归为一种 • 常数:可统一归为一种或按照整型、实型、布尔型等分 为几种 • 运算符和界符可统一归为一种或采用一符一种
• 则 Σ* = {ε,a,b,aa,ab,ba,bb,aaa,…}
–6.空语言:不含任何字的语言{ },用‘Ф’表示 注意区分ε、{ }和{ε}: ε是空字,是语言字的集合中的一个元素, 不是Σ的元素 { }不包含任何字,属于集合的概念 {ε}由空字组成的集合,这个集合比{ }多一个元素
2.3

2.1

词法分析器的设计方法
2.1.2:状态转换图(举例)
标识符
无符号整数
无符号数字
2.1

词法分析器的设计方法
2.1.2:状态转换图(编程)
–含分支的状态
• 对应一个switch()语句 • 或对应一组if-else语句 –含回路的状态 • 对应一个while语句 图2-4(a) 含分支的状态i
个保留字。当然,也可以专设一个保留字表来进行处理。
空白 0
字母或数字 字母 1 数字 3 5 非字母与数字
* 返回(id,id在符号表 中的位置)或返回(保 2 留字,—)
*
4
数字
非数字

返回(+,—)
6 7 其它
返回(num,num在常 数表中的位置)
*

*
8
返回(=,—) 返回(relop,EQ)
2.1
词法分析器的设计方法
词法分析器的处理结构(2种):

第一种:词法分析器和语法分析器完全分开
–词法分析器的输出(单词符号流)作为语法分析器的输入
将词法分析工作作为独立的一遍来完成,在这个过程中不
断查询和完善符号表
图2-1(a) 词法分析程序作为主程序
2.1
词法分析器的设计方法
词法分析器的处理结构(2种):
–终态对应一个return()语句
• 意味着从词法分析器返回 到调用段,一般指返回到 语法分析器 图2-4(b) 含回路的状态i
第二章 词法分析
2.1 2.2
词法分析的设计方法 一个简单的词法分析器
2.3 2.4ຫໍສະໝຸດ 正规表达式与有限自动机简介
正规表达式到有限自动机的构造
2.5
词法分析器的自动生成
10
2.1

词法分析器的设计方法
2.1.2:状态转换图(概念)
–上一小节解决了单词符号的表示,但是如何识别单词呢?
答:借助‚状态转换图‛ 在词法分析中,可以用状态转换图来识别单词。状态转 换图是状态有限的有向图,结点代表状态,用圆圈表示;结 点之间可由有向边连接,代表状态转换关系,有向边上可标
记字符,表示前一状态接受某一个字符之后的状态转移
例如,右图表示在状态i下的状态转换: 若输入字符为x,则读入x并转换到状 态j; 若输入字符为y,则读入y并转换到状 态k。
2.1

词法分析器的设计方法
2.1.2:状态转换图(表示)
–状态转换图的要求
• 状态(即结点)个数有限 • 至少一个初始状态,若干终止状态 • 每条边上标有字符(也可以是空字符) –状态转换图的表示习惯
单词符号 while if else switch case 标识符 常数 种别编码 1 2 3 4 5 6 7 助记符 while if else switch case id num 内码值 - - - - - id在符号表中的位置 num在常数表中的位 置
2.2

一个简单的词法分析器示例
2.2.1:C语言子集的单词符号表示 单词符号 种别编码 助忆符 内码值
+ * <= < == =

8 9 10 11 11 11 12 13
+ * relop relop relop =

- - - LE LT EQ - -
2.2

一个简单的词法分析器示例
2.2.2:C语言子集对应的状态转换图
–对输出程序串预处理
• 在设计的状态转换图中,首先对输入串做预处理,即剔 除多余的空白符(在实际的词法分析中,预处理还包括剔 除注释和制表换行符等编辑性字符的工作),使词法分析 工作既简单又清晰。 –将保留字作为一类特殊的标识符来处理 • 即对保留字不专设对应的状态转换图,当转换图识别出 一个标识符时就去查对表2.1的前五项,确定它是否为一
2.1
单词符号分类举例
例如:if(a>1) b=100; 如果采用每种单词对应一个整数码,对应的二元式序列? 假如五类单词的种别规定如下: 保留字if种别:2 上面的子程序输出的二元式序列: 标识符种别:10 ( 2, ) if 常量种别: 11 ( 29, ) ( “=”种别: 17 ( 10,’a’ ) a “>”种别: 23 ( 23, ) > “;”种别: 26 ( 11,’1’的二进制) 1 “(”种别: 29 ( 30, ) ) “)”种别: 30 ( 10,’b’ ) b ( 17, ) = 采用第一种表示 ( 11,’100’的二进制) 100 ( 26, ) ;


10 11
= 9 返回(;—) 返回({—) 非法字符错
图2-5 简单词法分 析的状态转换图
21

12
其他
13
2.2

一个简单的词法分析器示例
2.2.2:C语言子集对应的状态转换图
–特别注意:状态2在识别标识符和保留字时:
• 1、先看识别出的单词是否是保留字,否则是标识符 • 2、如果是标识符,查符号表中是否已有,如果表中没有 此标识符,将此标识符登录到符号表中,并返回(id,id 在符号表中的位置/入口指针);若表中已有此标识符,
正规表达式与优先自动机简介
2.3.1:正规表达式与正规集(递归定义)
– 对于给定的字母表Σ,正规式和正规集定义为:
• (1) ε和Ф都是Σ上的正规式,它们所表示的正规集分别为 {ε}和Ф。 • (2) 对于任一个符号a∈Σ,a是Σ上的一个正规式,它所表 示的正规集为{a}。 这两条规则称为基础规则 第二条:从普通的符号产生对应的正规式和正规集
• 标识符:用户自己定义的常量名、变量名、方法名等
• 常数:布尔常数(true/false)和其它常数 • 运算符: “+”、“- ”、“ * ”、“/ ”、“>”、“<” 等 • 界符:在语言中是作为语法上的分界符号使用的,如 ‚,”、‚;”、‚(”、‚)”、‚=”等
2.1

词法分析器的设计方法
• getbe()和getchar()的使用区别
• reserve():如果token保存的是保留字,则返回编码(15),否则返回0 • retract():扫描指针回退一个字符,同时将character 置空
第二章 词法分析
2.1 2.2
词法分析的设计方法 一个简单的词法分析器
2.3
2.3
2.4
正规表达式与有限自动机简介
正规表达式到有限自动机的构造
2.5
词法分析器的自动生成
2.1
词法分析器的设计方法
回顾词法分析器:

定位 –词法分析是编译的第一个阶段

任务
–从左至右逐个字符地对源程序进行扫描,产生一个个单词
(Token)符号

功能
–输入源程序,输出单词符号(流)
–不断访问、更新符号表
–1.字母表:语言元素的非空有穷集合,通常用‘Σ’表示
• 例如: Σ={a,b,c} • Σ是字母表,它由a,b,c三个元素组成 • 注意:字母表中至少包含一个元素,任何语言的字母表 规定了该语言中允许出现的一切符号。如英文的字母表
是26个字母、数字和标点符号的集合;C语言的字母表是
由字母、数字和若干专用符号组成。 –2.符号:字母表中的每一个元素,也叫字符
• 初始状态用‚
○”表示
• 非终止状态用‚○‛表示 字符 • 状态之间的跳转用‚ • 终止状态用‚◎*‛表示
‛(有向边)表示
2.1

词法分析器的设计方法
2.1.2:状态转换图(表示)
–特别说明:终止状态用‚◎*‛表示
• 某些终止状态是在读入了一个其它不属于该单词的符号 后才得到相应的单词编码的,这表明在识别单词的过程 中多读入了一个符号,所以识别出单词后应将最后多读 入的这个符号予以回退;我们对此类情况的处理是在终 态上以‚*‛作为标识。 例如:想要识别数字,输入 ‚234a” 读入‘2’:状态0->1 读入‘3’:状态1 读入‘4’:状态1 读入‘a’:状态1->2 回退,识别‚234‛
相关主题