编译原理(2)词法_1(正规表达式与有限自动机简介)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;
(
10 11
= 9 返回(;—) 返回({—) 非法字符错
图2-5 简单词法分 析的状态转换图
21
{
12
其他
13
2.2
一个简单的词法分析器示例
2.2.2:C语言子集对应的状态转换图
–特别注意:状态2在识别标识符和保留字时:
• 1、先看识别出的单词是否是保留字,否则是标识符 • 2、如果是标识符,查符号表中是否已有,如果表中没有 此标识符,将此标识符登录到符号表中,并返回(id,id 在符号表中的位置/入口指针);若表中已有此标识符,
–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‛
2.1
词法分析器的设计方法
2.1.2:状态转换图(举例)
标识符
无符号整数
无符号数字
2.1
词法分析器的设计方法
2.1.2:状态转换图(编程)
–含分支的状态
• 对应一个switch()语句 • 或对应一组if-else语句 –含回路的状态 • 对应一个while语句 图2-4(a) 含分支的状态i
• 则 Σ* = {ε,a,b,aa,ab,ba,bb,aaa,…}
–6.空语言:不含任何字的语言{ },用‘Ф’表示 注意区分ε、{ }和{ε}: ε是空字,是语言字的集合中的一个元素, 不是Σ的元素 { }不包含任何字,属于集合的概念 {ε}由空字组成的集合,这个集合比{ }多一个元素
2.3
2.3
2.4
正规表达式与有限自动机简介
正规表达式到有限自动机的构造
2.5
词法分析器的自动生成
2.1
词法分析器的设计方法
回顾词法分析器:
定位 –词法分析是编译的第一个阶段
任务
–从左至右逐个字符地对源程序进行扫描,产生一个个单词
(Token)符号
功能
–输入源程序,输出单词符号(流)
–不断访问、更新符号表
给出重名错误信息。
2.2
一个简单的词法分析器示例
2.2.3:状态转换图的实现
–实现方法:让每个状态对应一小段程序
–含分支多的状态对应switch()语句,分支少的对应if-else –含回路的状态对应一个while语句 –注意:结合图2-5,读懂课本P14-P16的代码 • character:单个字符,token:单词符号的字符串
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, ) ;
2.1
词法分析器的设计方法
2.1.1:单词符号的分类与输出形式
2、单词自身的值
• 如果一个种别只含一个单词符号,对于这个单词符号, 种别编码就完全代表它自身的值 • 如果一个种别含有多个单词符号,除了给出种别编码之 外,还应给出单词符号自身的值,以便区分同一种类的
单词
注意,标识符自身的值就是标识符自身的字符串,而常数 自身的值是常数本身的二进制数值(第一种)。 也可用指向某类表格中一个特定项目的指针来区分同类中 的不同单词。例如,对于标识符,可以用它在符号表的入 口指针作为它自身的值;而常数也可用它在常数表的入口 指针作为它自身的值(第二种)。
2.2
一个简单的词法分析器示例
大多数程序语言的单词符号都可以用状态转换图予以识别
构造一个C语言子集的词法分析器:
–定义C语言子集的单词符号及内码值
–C语言子集对应的状态转换图 –状态转换图的代码实现
2.2
一个简单的词法分析器示例
2.2.1:C语言子集的单词符号表示
–使用种别编码不利于记忆,故使用助记符和种别编码对应
2.1
词法分析器的设计方法
词法分析器的处理结构(2种):
第一种:词法分析器和语法分析器完全分开
–词法分析器的输出(单词符号流)作为语法分析器的输入
将词法分析工作作为独立的一遍来完成,在这个过程中不
断查询和完善符号表
图2-1(a) 词法分析程序作为主程序
2.1
词法分析器的设计方法
词法分析器的处理结构(2种):
第二种:词法分析器作为语法分析器调用的子程序
–每当语法分析器需要一个单词时便调用词法分析器
–词法分析和语法分析交替进行
图2-1 (b) 词法分析程序作为子程序
2.1
词法分析器的设计方法
2.1.1:单词符号的分类与输出形式
–分类:单词符号是程序语言的基本语法单位,具有确定的
语法意义。程序语言的单词符号通常可分为下面五种: • 保留字:如C语言中的if、else、while和do等 –几乎所有的程序语言都禁止用户使用保留字作为标 识符
西北农林科技大学本科教程
第 2 讲
主讲教师:赵建邦
本讲目标
第二章《词法分析》前三节
2.1 2.2 2.3
词法分析器的设计方法 一个简单的词法分析器 正规表达式与有限自动机简介
重点掌握
状态转换图的概念 正规表达式的概念和运算
第二章 词法分析
2.1 2.2
词法分析器的设计方法 一个简单的词法分析器
2.3
正规表达式与优先自动机简介
• (3) 如果R和S是Σ上的正规式,它们所表示的正规集分别为L(R)
例如,右图表示在状态i下的状态转换: 若输入字符为x,则读入x并转换到状 态j; 若输入字符为y,则读入y并转换到状 态k。
2.1
词法分析器的设计方法
2.1.2:状态转换图(表示)
–状态转换图的要求
• 状态(即结点)个数有限 • 至少一个初始状态,若干终止状态 • 每条边上标有字符(也可以是空字符) –状态转换图的表示习惯
正规表达式与优先自动机简介
2.3.1:正规表达式与正规集(递归定义)
– 对于给定的字母表Σ,正规式和正规集定义为:
• (1) ε和Ф都是Σ上的正规式,它们所表示的正规集分别为 {ε}和Ф。 • (2) 对于任一个符号a∈Σ,a是Σ上的一个正规式,它所表 示的正规集为{a}。 这两条规则称为基础规则 第二条:从普通的符号产生对应的正规式和正规集
2.1.1:单词符号的分类与输出形式
–输出形式:单词符号通常表示成如下的二元式:
(单词种别,单词自身的值/内码值) 1、单词种别:即单词的种类。为了处理方便,通常让每种单 词对应一个整数码,可以最大限度地将每个单词区别开来 • 保留字:可以统一视为一种,也可一字一种(后一种较
常用)
• 标识符:统一归为一种 • 常数:可统一归为一种或按照整型、实型、布尔型等分 为几种 • 运算符和界符可统一归为一种或采用一符一种
单词符号 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语言子集的单词符号表示 单词符号 种别编码 助忆符 内码值
10
2.1
词法分析器的设计方法
2.1.2:状态转换图(概念)
–上一小节解决了单词符号的表示,但是如何识别单词呢?
答:借助‚状态转换图‛ 在词法分析中,可以用状态转换图来识别单词。状态转 换图是状态有限的有向图,结点代表状态,用圆圈表示;结 点之间可由有向边连接,代表状态转换关系,有向边上可标
记字符,表示前一状态接受某一个字符之后的状态转移
个保留字。当然,也可以专设一个保留字表来进行处理。
空白 0
字母或数字 字母 1 数字 3 5 非字母与数字
* 返回(id,id在符号表 中的位置)或返回(保 2 留字,—)
*
4
数字
非数字
+
返回(+,—)
6 7 其它
返回(num,num在常 数表中的位置)
*
=
*
8
返回(=,—) 返回(relop,EQ)
2.4
正规表达式与有限自动机简介
正规表达式到有限自动机的构造
2.5
词法分析器的自动生成
2.3
正规表达式与优先自动机简介
2.3.1:正规表达式与正规集(定义和运算)
–状态转换图可以构造词法分析程序,但属于非形式化描述
–正规表达式(简称正规式)是词法分析的形式化表示方法 • 所谓形式化的方法,是指用一整套带有严格规定的符号 体系来描述问题的方法,优点:更加清晰和准确 –例如:形式化表示标识符,即标识符的正规式: letter(letter | digit)* 能够表示的单词集合称为正规集
这里,字母字符用letter表示,数字字符用digit表示 • letter与(letter | digit)*的并置表示连接 • 括号中的‚ | ‛表示letter或digit两者选一 • “*”表示零次或多次引用,长度为0,1,2,……
2.3
正规表达式与优先自动机简介
2.3.1:正规表达式与正规集(相关基础概念)
2.3
正规表达式与优先自动机简介
2.3.1:正规表达式与正规集(相关基础概念)
–3.符号串:由符号组成的有穷序列(可以是0个),也叫字
• 如Σ={a,b},则ε,a,b,aa,ab,aaa,bbb,……都是字 –4.空字:长度为0的字,用‘ε’表示 –5.字的全体:所有字组成的集合,用‚ Σ* ‛表示 • 例如:如果Σ={a,b}
–终态对应一个return()语句
• 意味着从词法分析器返回 到调用段,一般指返回到 语法分析器 图2-4(b) 含回路的状态i
第二章 词法分析
2.1 2.2
词法分析的设计方法 一个简单的词法分析器
2.3
wk.baidu.com.4
正规表达式与有限自动机简介
正规表达式到有限自动机的构造
2.5
词法分析器的自动生成
• getbe()和getchar()的使用区别
• reserve():如果token保存的是保留字,则返回编码(15),否则返回0 • retract():扫描指针回退一个字符,同时将character 置空
第二章 词法分析
2.1 2.2
词法分析的设计方法 一个简单的词法分析器
2.3
• 标识符:用户自己定义的常量名、变量名、方法名等
• 常数:布尔常数(true/false)和其它常数 • 运算符: “+”、“- ”、“ * ”、“/ ”、“>”、“<” 等 • 界符:在语言中是作为语法上的分界符号使用的,如 ‚,”、‚;”、‚(”、‚)”、‚=”等
2.1
词法分析器的设计方法
+ * <= < == =
;
8 9 10 11 11 11 12 13
+ * relop relop relop =
;
- - - LE LT EQ - -
2.2
一个简单的词法分析器示例
2.2.2:C语言子集对应的状态转换图
–对输出程序串预处理
• 在设计的状态转换图中,首先对输入串做预处理,即剔 除多余的空白符(在实际的词法分析中,预处理还包括剔 除注释和制表换行符等编辑性字符的工作),使词法分析 工作既简单又清晰。 –将保留字作为一类特殊的标识符来处理 • 即对保留字不专设对应的状态转换图,当转换图识别出 一个标识符时就去查对表2.1的前五项,确定它是否为一