《编译原理》第三章 词法分析器
《编译原理》第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}
西安理工大学《编译原理》编译原理作业集-第三章-修订版
第三章词法分析本章要点1.词法分析器设计,2.正规表达式与有限自动机,3.词法分析器自动生成。
本章目标:1.理解对词法分析器的任务,掌握词法分析器的设计;2.掌握正规表达式与有限自动机;3.掌握词法分析器的自动产生。
本章重点:1.词法分析器的作用和接口,用高级语言编写词法分析器等内容,它们与词法分析器的实现有关。
应重点掌握词法分析器的任务与设计,状态转换图等内容。
2.掌握下面涉及的一些概念,它们之间转换的技巧、方法或算法。
(1)非形式描述的语言↔正规式(2)正规式→ NFA(非确定的有限自动机)(3)NFA→ DFA(确定的有限自动机)(4)DFA→最简DFA本章难点(1)非形式描述的语言↔正规式(2)正规式→ NFA(非确定的有限自动机)(3)NFA→ DFA(确定的有限自动机)(4)DFA→最简DFA作业题一、单项选择题(按照组卷方案,至少15道)1. 程序语言下面的单词符号中,一般不需要超前搜索a. 关键字b. 标识符c. 常数d. 算符和界符2. 在状态转换图的实现中,一般对应一个循环语句a. 不含回路的分叉结点b. 含回路的状态结点c. 终态结点d. 都不是3. 用了表示字母,d表示数字, ={l,d},则定义标识符的正则表达式可以是:。
(a)ld*(b)ll*(c)l(l | d)*(d)ll* | d*4. 正规表达式(ε|a|b)2表示的集合是(a){ε,ab,ba,aa,bb} (b){ab,ba,aa,bb}(c){a,b,ab,aa,ba,bb} (d){ε,a,b,aa,bb,ab,ba}5. 有限状态自动机可用五元组(V T,Q,δ,q0,Q f)来描述,设有一有限状态自动机M的定义如下:V T={0,1},Q={q0,q1,q2},Q f={q2},δ的定义为:δ(q0,0)=q1δ(q1,0)=q2δ(q2,1)=q2δ(q2,0)=q2M所对应的状态转换图为。
6. 有限状态自动机可用五元组(V T,Q,δ,q0,Q f)来描述,设有一有限状态自动机M的定义如下:V T={0,1},Q={q0,q1,q2},Q f={q2},δ的定义为:δ(q0,0)=q1δ(q1,0)=q2δ(q2,1)=q2δ(q2,0)=q2M所能接受的语言可以用正则表达式表示为。
编译原理词法分析
❖ =、<、>、!:读下一个字符,判断是否为双字 符分界符,若是,组成双字符分界符,输出类码; 若不是,输出单分界符记号;
编译原理
❖ 非=、<、>、/等与双分界符首字符不同的单分界 字符:输出相应单词记号及单分界符。
1.S是一个有穷集,它的每个元素称为一个状态;
2.Σ是一个有穷字母表,它的每个元素称为一个输入 符号,所以也称Σ为输入符号表;
3.δ是在S×Σ→S上的单值映射,即,如δ (s,a)=s’, (s∈S,s’∈S)就意味着,当前状态为s,输入符为 a时,将转换为下一个状态s’,我们把s’称作s的一 个后继状态;
编译原理 在 入 准初带备整•••始的读输读有个时开入始入头穷模,始,状带:控型读位状态:可制由头置态存以器如状的所三处,处放在:果态符识部于表于输输控读正号别分输示初入入制头好组组符带状移是成成号上态动终的:向发到结字后生最状能移变后态被头每有动化一,该转向读穷个则有移后入控符输限到移一 制号入自下动个器后带动一一符控面上机个个号制,状位,状态置读态,
编译原理
词法分析 读字符
结束 Y
结束
N Y 空字
N 字母 N 数字
Y 组合标识符 Y 组合整数
查保留字Βιβλιοθήκη N 纯单分符Y 输出单分符
N
>,<,!,= Y 读字符
=
N
N
/ Y 读字符
*
N
Y
错误处理
输出保留字
Y 保留字
N 输出标识符
组合整数
读字符
Y 输出双分符
输出单分符 N 输出单分符/
注释处理
读字符
《编译原理》教学课件 第3章-词法分析
单词的定义 • 正则表达式的局限性。
正则表达式
• 基本概念: • 字母表:非空有限集,,其元素称为符号或字母. • 符号串:符号的有限序列,也称为‘字’。或表示
空串 空串集{}不同于空集 。
• 符号串长度:符号串中字符的个数.|| • 符号串连接:和都是符号串,则为符号串的连接
非确定有限自动机NFA
• 定义1:一个非确定有限自动机(NFA)A是 一个五元组A=(,SS,S0,f,TS).其中
• 是字母表
• SS是状态集
• S0是初始状态集 • f是转换函数,但不要求是单值的
•
f: SS (∪{}) 2SS
• TS是终止状态集
非确定有限自动机NFA
• 定义2:设A是一个NFA,A= (,SS,S0,f,TS) • 则定义L(A)为从任意初始状态到任意终止状
❖ 空格符和制表符以及换行符的处理 1.无用的空格符和制表符要删掉; 2.字符串内的空格不能删; 3.换行符不能删。用于错误定位
❖ 复合型特殊符,如“:=”的处理 读到“:”时不能判断是否为冒号,必须读下 一字符。
❖ 括号类配对预检
• 括号类: begin …end ,if … then,[ ],{ },( )
描述程序设计语言中的单词字,进一步为词法 分析程序的自动构造寻找特殊的方法和工具。 主要内容: • 确定有限自动机DFA • 确定有限自动机DFA的实现 • 非确定有限自动机NFA • NFA到DFA的转换 • DFA的化简
确定有限自动机DFA
• 确定有限自动机(DFA:Deterministric Finite Automata ) 为一个五元组
《编译原理-刘善梅》第3章 词法分析4.ppt
对于词法分析器的要求 词法分析器的设计 正规表达式与有穷自动机 词法分析器的自动产生-LEX
词法分析
词法分析的任务:从左至右逐个字符地 对源程序进行扫描,产生一个个单词符 号。
词法分析器(Lexical Analyzer) 又称扫描 器(Scanner):执行词法分析的程序
a
➢ 状态之间用箭弧连结,箭弧 1
2
上的标记(字符)代表射出结 状态下可能出现的输入字符
数字 3
或字符类。
➢ 一张转换图只包含有限个状态,其中 有一个为初态,至少要有一个终态。
一个状态转换图可用于识别(或接受)一定 的字符串。
数字
数字
其他
*
1
2
3
识别整常数的状态转换图
字母或数字
字母
其他
*
1
2
3
识别标识符的状态转换图
else {…错误处理…;}
3 状态转换图ห้องสมุดไป่ตู้实现
2)对含回路的状态结,可对应一段由WHILE语句 构成的程序.
字母或数字
i 其它 j
GetChar( ); while (IsLetter( ) or IsDigit( ))
GetChar( ); …状态j的对应程序段…
3 状态转换图的实现
3)终态结表示识别出某种单词符号,因此,对应 语句为 RETURN (C,VAL)
二、词法分析器作为一个独立子程序
词法分析是作为一个独立的阶段,是否 应当将其处理为一遍呢?
作为独立阶段的优点:结构简洁、清晰和条 理化,有利于集中考虑词法分析一些枝节问 题。
不作为一遍:将其处理为一个子程序。
词法分析器
单词符号
第3章 词法分析 (编译原理 陈火旺)
标识符的符号表入口地址作为其单词符号的属性值,常
每个基本字占一个单词种别,单词符号的属性值缺省。
对于界符,运算符通常一个符号一个种别,单词符号的
属性值缺省
例: 参见P42.表3.1 单词符号及种别编码
10
3.1.3 词法分析器作为独立子程序
词法分析可采用如下两种处理结构:
把词法分析程序作为主程序。将词法分析作为
19
3.2.1 正规文法、正规式与正规集
正规集:由正规文法产生的语言所构成的集合。
注:正规集是集合,可有穷也可无穷。 可通过正规式来形式化表示。
对于一个正规文法的语言提炼出一个简洁的公式,用这个
式子来对它进行形式化的表示,这个式子叫正规式。
正规式:也称正则表达式,是说明单词的模式的一种重要的 表示法(记号);是定义正规集的数学工具;用来描述单词 符号。
在设计一个编译程序时,通常是把对源程序的结构分析分为词 法分析和语法分析两个相对独立的阶段来完成。
第一,描述单词的结构比描述源程序的其它语法结构要简单
得多,仅使用3型文法也就基本够用了。
第二,由于把词法分析和语法分析分开,可使编译程序各部
分的功能更为单一,整个编译程序的结构也更加清晰,从而 有利于编译程序的编写和调整。 上述词法分析和语法分析两个阶段的划分,仅仅是对整个编译 程序的逻辑功能而言,而不一定指的是编译程序的执行流程。
25
例3.2 判断下述正规式之间是否等价: (1)b(ab)*与(ba)*b (2)(ab)*与a*b* 解: (1) b(ab)*对应的正规集是b后面出现任意多个ab对
L(b(ab)*)={b,bab,babab, ……}
编译原理第三章练习题答案
编译原理第三章练习题答案一、选择题1. 在编译原理中,词法分析器的作用是什么?A. 将源代码转换为汇编代码B. 将源代码转换为中间代码C. 识别源代码中的词法单元D. 检查源代码的语法正确性答案:C2. 词法单元中,标识符和关键字的区别是什么?A. 标识符可以重定义,关键字不可以B. 标识符和关键字都是常量C. 标识符是用户自定义的,关键字是语言预定义的D. 标识符和关键字都是变量名答案:C3. 下列哪个不是词法分析器生成的属性?A. 行号B. 列号C. 词法单元的类型D. 词法单元的值答案:A4. 词法分析器通常使用哪种数据结构来存储词法单元?A. 栈B. 队列C. 链表D. 数组答案:C5. 词法分析器的实现方法有哪些?A. 手工编写正则表达式B. 使用词法分析器生成器C. 编写扫描程序D. 所有上述方法答案:D二、简答题1. 简述词法分析器的基本工作流程。
答案:词法分析器的基本工作流程包括:读取源代码字符,根据正则表达式匹配词法单元,生成词法单元的类型和值,并将它们作为输出。
2. 什么是正规文法?它在词法分析中有什么作用?答案:正规文法是一种形式文法,它使用正则表达式来定义语言的词法结构。
在词法分析中,正规文法用于描述程序设计语言的词法规则,帮助词法分析器识别和生成词法单元。
三、应用题1. 给定一个简单的词法分析器,它需要识别以下词法单元:标识符、关键字(如if、while)、整数、运算符(如+、-、*、/)、分隔符(如逗号、分号)。
请描述该词法分析器的实现步骤。
答案:实现步骤如下:- 定义词法单元的类别和对应的正则表达式。
- 读取源代码字符,逐个字符进行匹配。
- 使用状态机或有限自动机来识别词法单元。
- 根据匹配结果生成相应的词法单元类型和值。
- 输出识别的词法单元。
2. 设计一个简单的词法分析器,它可以识别以下C语言关键字:int, float, if, else, while, return。
编译原理第三版 第三章 词法分析
超前搜索
例:FORTRAN语言中关键字的识别: DO99K=1,10 识别DO为关键字要搜 DO99K=1.10 索到“,” FORTRAN语言中常数的识别:
5.EQ.M, 5.E08
识别5为常数要搜索到Q
2、状态转换图
大多数程序设计语言中单词符号的词法规则可 以用正规文法描述。如: <标识符>→ 字母|<标识符>字母|<标识符>数字 <整数>→数字|<整数>数字 <运算符>→+|-|×|÷„ <界符>→; |, |( | )|„
#
3.3 正规表达式与有限自动机
目的: 形式化地描述词法规则和词法分析程序 词法分析程序的自动生成 主要内容 正规式与正规集 确定有限自动机 (DFA) 非确定有限自动机(NFA) 正规式与有限自动机的等价性 确定有限自动机的化简
正规文法
多数程序设计语言单词的语法都能用正规文法 (3型文法)描述 正规文法回顾 文法的任一产生式α→β的形式都为
单词符号的种类
(3) 常数 常数的类型一般有整型、实型、布 尔型、字符型等。
(4) 运算符 如 +,-,*,/等,对具体语言个 数是确定的。 (5) 界符 如 , ;()等,对具体语言个数是 确定的。
单词符号的表示形式
词法分析器所输出的单词符号常常表示成如下的 二元式:<单词种别,单词符号的属性值> 单词种别:由语法分析阶段使用的抽象符号。如: 用整数编码。 最简单的编码方案为一类一码,种别编码可设为: 1,2,3,4,5。 另一种编码方案(如本教材中): 标识符:列为一种,用一个整数编码表示; 常数:按类型分种编码; 关键字、运算符、界符:采用一字一种编码。
编译原理chapter3 词法分析
一 设计一个奇偶校验器
DFA是由集合,序列和函数定义的数学模型, 它对于 上的w,判定是可接受的还是不可 接受的。例如,设计一个DFA m ,奇偶校验 器,首先,w是由0,1组成的字符串,因此, 1. ={0 ,1}且w在一条输入带上。
0 1 0 1 1$
读头
精品文档
11
2. 状态集:它记忆已读入w子串的状态,m是 奇偶校验器,它应该记住,初始序列是奇数 个1还是偶数个1。因此,m有even和odd两个 状态. 3 .even为开始状态。
词法分析器
‘while’,‘i’,‘<>’,‘j’, ‘do’, ‘if’,‘i’,‘>’,‘j’,‘then’, 'i', ':=’ , 'i', ’-’ , 'j', 'else', 'j', ':=', 'j', '-', ‘i'
精品文档
4
词类和属性
computator n. Calcculating machine.
3.1.1 词法分析程序的功能 源程序 单词词序法列分析器
3.1.2 单词的词类和属性 (词类符号,单词的属性值)
3.1.3 词法分析程序作为一个独立子程序 (1)语法分析程序的子程序; (2)组 织成一遍扫描。
精品文档
3
While i<>j do if i>j then i:=i-j else j:=j-I
三 一个DFA有三种表示:
(1)象上面,用转换函数;
精品文档
14
转移矩阵
状态转换图
a
b
0
1
2
a
编译原理词法分析器
编译原理词法分析器编译原理是计算机科学中的重要领域,而词法分析器则是编译器的第一个阶段。
它的主要任务是将源代码转化为一个个词法单元,以便接下来的语法分析和语义分析等阶段进行处理。
在本文中,我们将深入探讨词法分析器的原理和实现。
一、什么是词法分析器词法分析器(Lexical Analyzer)是编译器中实现词法分析的部分。
它负责从源代码中提取出各个合法的词法单元,并进行分类和标记。
词法单元通常包括关键字、标识符、运算符、分隔符和常量等。
二、词法分析器的原理词法分析器的工作原理可以概括为以下几个步骤:1. 预处理:词法分析器首先会对源代码进行预处理,去除注释、替换宏定义等。
2. 分割:将预处理后的源代码分割成一个个字符。
3. 匹配:根据预定义的词法规则,将字符序列匹配到对应的词法单元上。
4. 标记:对每个词法单元都打上相应的标记,以便后续的语法分析。
三、词法分析器的实现1. 正则表达式:词法分析器通常使用正则表达式定义词法规则,用以匹配词法单元。
例如,使用正则表达式"\d+"可以匹配一个或多个数字。
2. 有限自动机:词法分析器可以通过构造有限自动机来进行词法分析。
有限自动机可以根据当前状态和输入字符进行状态转移,最终得到一个词法单元的序列。
3. 符号表:词法分析器使用符号表来存储已经识别出的标识符和关键字,并为每个标识符分配一个唯一的标识符号。
四、应用举例以C语言为例,假设我们要编写一个词法分析器来分析C源代码。
下面是一个简单的示例代码:```c#include <stdio.h>int main() {int a = 10;printf("Hello, World!\n");return 0;}```我们可以使用词法分析器将其分解为以下词法单元序列:1. 关键字:include、stdio、int、main、return2. 标识符:a3. 运算符:=4. 常量:105. 分隔符:()、{}6. 函数名:printf7. 字符串常量:"Hello, World!\n"通过词法分析器的处理,我们可以将源代码转化为一个个词法单元,为后续的语法分析提供准备。
编译原理之词法分析
3.1.3 词法记号的属性
属性值用二元组序列表示
position := initial + rate * 60的记号和属性值: id,指向符号表中position条目的指针 assign _ op, id,指向符号表中initial条目的指针 add_op,+ id,指向符号表中rate条目的指针 mul_ op, * num,整数值60
3.3.4 正规定义
• 正规定义的例子
Pascal语言的标识符集合 letter A | B | … | Z | a | b | … | z digit 0 | 1 | … | 9 id letter(letter|digit)*
3.3.4 正规定义
• 正规定义的例子
Pascal无符号数集合,例1946,11.28,63.6E8,1.999E6 digit 0 | 1 | … | 9 digits digit digit* optional_fraction .digits| optional_exponent (E ( + | | ) digits ) | num digits optional_fraction optional_exponent 简化表示 num digit+ (.digit+)? (E(+|)? digit+)?
• 例
L:{ A, B, …, Z, a, b, …, z },D:{ 0, 1, …, 9 } L∪D,LD,L6,L*,L(L∪D )*,D+
3.3 词法记号的描述
例 令L表示集合{ A, B, …, Z, a, b, …, z },令D表 示集合{ 0, 1, …, 9 }。下面是用表运算作用于L 和D所得到的新语言的例子。
编译原理
13
3.9直接从正则式到DFA
构造算法
实例 例3.37
得到的DFA状态比通过NFA得到的DFA状态少!
14
3.10 DFA最简化(3.9.6-3.9.7)
DFA最简化原理
最简DFA唯一性:每一个正则式可以由一个状态数最少
的DFA识别,且这个DFA唯一。 可行性:DFA存在不可区别状态,可以合并。 化简条件:确保DFA是全函数
8
3.9直接从正则式到DFA
构造原理
转换表:聚焦重要状态之间的转移 开始状态:可能出现在给定正则表达式描述的语言中任
何一个串第一个符号位置的所有重要状态。 接受状态:和结尾#相关的位置
9
3.9直接从正则式到DFA
构造算法
定义四个函数:nullable、firstpos、lastpos、
C b a B a b
开始
A
a
b
a
D
19
例 题 1
叙述下面的正则式描述的语言,并画出接受该语言 的最简DFA的状态转换图 (1|01)* 0*
描述的语言:所有不含子串001的0和1的串
1 0
1
.
start 1 刚读过的不是0 0 2 连续读过一个0 0 3 连续读过 不少于两个0
20
例 题 2
编译原理
第三章 词法分析
1
计算机科学与技术学院
3.8词法分析器生成工具的设计
词法分析器模型 图3.49
词法分析器工作方式
DFA模拟器 图3.27
NFA模拟器 图3.27
DFA转换表
NFA转换表
《编译原理》第三章 词法分析器
有限自动机模型
Finite Automata (FA):
一个有限自动机的模型如下所示:
... ... head finite control input tape
输入带被分成一个个的小单元来装输入符号, 其右边是无限延伸的。 有限状态控制器由有限个状态组成,并根据读 入字符将当前状态转换成下一个状态
有限自动机与正规式的等价性证明
• 证明一: 对于∑上的NFA M,我们来构造∑上的正规式r, 使得L(r)=L(M)。 首先,我们将状态图的概念拓广,令每条弧可 用正规式作标记。并在M的转换图上加进两个 结点,一个为X,一个为Y。从X用ε弧连接到Y, 从而形成一个新的NFA,记为M’,它只有一个初 态X和一个终态Y。显然L(M)=L(M’)。即,这 两个NFA是等价的。 现在来逐步消去M’中的所有结点,直至只剩下 X和Y为止。
有限自动机接受的语言
The language accepted by FA
一个FA 能够接受的语言定义如下:
• 对于一个 DFA M, 可接受的语言表示为: L(M)={ x | x∈Σ* and f(s0 , x)∈Z} • 对于一个 NFA M, 其接受的语言为: L(M)={x | x∈Σ*and f(s0, x)∩Z≠Φ} • 两个 FA M and M’ 是等价的当且仅当 L(M) = L(M’)
M
M
a
M
假设对于任意 正规式 r1 and r2, 如果 |r1| < k 而 且 |r2| < k, 那么就于一个NFA M1 and M2 对应 于r1 和 r2. 所以对于任意 RE r, |r| = k, 我们有:
• 这个自动机所接受的语言是所有被3整除 以后余数为2的二0, q1, q2, q3}, {0, 1}, f1, q0 {q3} ) . 其中f1如下所示 :
编译原理课件(三)词法分析
为了讨论词法分析器的自动生成,还需要将转换
图的概念形式化。
为此我们引入:正规式,正规集,自动机等概
念。
3.3.1 正规式与正规集
1. ε 和都是 Σ 上的正规式,他们所表示的正规集分别为{ε } 和 ; 2. 任何a Σ , a是Σ 上的一个正规式,它所表示的正规集为{a};
若M的初态结点同时又是终态结点,则为空字可以为M
所识别。DFA M所能识别的字的全体记为L(M).
DFA及其所识别的语言描述
[M=({0,1,2,3},{a,b},,0,{3}) 其中: (0,a)=1; (0,b)=2 (1,a)=3; (1,b)=2 (2,a)=1; (2,b)=3 (3,a)=3; (3,b)=3 问:L(M)=?
输入字符 状态 s1 s2 s1 s2 s2 s1 a b
DFA的(确定的)状态转换图表示
• 假定DFA M 含有m个状态n个输入字符,
– 那么,这张图含有m个状态结点,
– 每个结点顶多有n条箭弧射出和别的结点相连接,
– 每条箭弧用上的一个不同字符作标记, – 整张图含有唯一的初态和若干个(可以是0个)终 态结点。
留字i表进行。
1 DO99K=1,10 2 IF(5.EQ.M)I=10 3 DO99K=1.10 4 IF(5)=55
标识符的识别
• 标识符的定义:字母开头,字母和数字的 组合 • 标识符后通常有界符
常数的识别
• 算术常数有时需要超前搜索
– 5.EQ. M
• 逻辑常数:.T. , .F., 有界符,容易识 别
3.1.2 词法分析器的构造方式-词法分析器 作为独立子程序
词法分析器安排成语法分析的子程序。 好处在于:编译器结构清晰。
编译原理第二版第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*上的正规集
编译原理第三章词法分析
z19
step1 : 对语言的各类单词分别构造状态图;
step1
L
1
2
other
*
3 其中: other表示非L| D | _字符
z8
3.2.1 单词与属性字
注意:
(1) 同一个字符开头+后续字符->跨多个单词类;
(2) 非单词成分和预处理成分;
•例:源程序注释;/* …….*/
预处理指令:
•# define… # include…
z9
3.2.1 单词与属性字
2. 属性字 对所识别的单词的数据结构表示。
控制线
数据线
X : 固定长度的存储空间 ; z16
预处理程序(作用)
(1) 减少内存空间占用;
(2) 减轻扫描器实质性处理的负担;
预处理程序主要任务:
(1) 滤掉源程序中的非单词成分(如无用空格;换行
符等);
•滤掉注释;
(2) 实际的预处理工作
•宏替换; •文件包含的嵌入;
L1= ( T,C)
属性字 Token
Code
刻画单词类别(单词性质)
如:标识符;运算符;…
单词的内码值(可空)
z10
说明
单词类别通常用整数编码 单词类别提供给语法分析程序使用 单词符号属性信息记录单词符号的特征或特性 单词的属性值提供给语义分析程序使用
编码形式:
一类一种:关键字、标识符、常数、运算符、界符 一字一种:关键字、运算符、分界符各一码
【编译原理】第三章词法分析
【编译原理】第三章词法分析⼀,词法分析器的作⽤词法分析是编译的第⼀阶段。
词法分析器主要任务是读⼊源程序的输⼊字符、将他们组成词素,⽣成并输出⼀个词法单元序列,每个词法单元对应于⼀个词素。
分析部分:词法分析、语法分析(简化编译器设计、提⾼编译器效率、增强编译器可移植性)1)词法单元:词法单元名和可选的属性值组成。
关键字、操作符……2)模式:词法单元词素可能具有的形式,当词法单元是关键字时,模式就是这个关键字的字符序列3)词素:源程序中的⼀个字符序列,它和某个词法单元模式匹配。
4)词法错误:识别出某个错误词素,继续判断下⼀个词素⼆,输⼊缓冲1)我们⾄少向前看⼀个字符,才能判断当前词素是否到头。
2)对付⼤型源程序,需要处理⼤量字符。
处理往往需要很多时间,我们采⽤两个交替读⼊的缓冲区。
(详见73)三,词法单元的规约1)我们会不会⽤完缓冲区?通常对于⽐较长的字符串我们采⽤ ”+“的形式链接起来。
2)正则表达式:letter_(letter_ | digit) * 表⽰字母开头 0个或多个字母或数字3)正则表达式例⼦a |b {a, b}(a | b) (a | b ) {aa, ab, ba, bb}aa | ab | ba | bb {aa, ab, ba, bb}a* 由字母a构成的所有串集(a | b)* 由a和b构成的所有串集复杂的例⼦( 00 | 11 | ( (01 | 10) (00 | 11) * (01 | 10) ) ) * 010011010000100000101110013)正则表达式扩展1>⼀个或多个实例⼀元后缀算符“+”的意思是“⼀个或多个实例”,即正规式a+表⽰⼀个或多个a的所有串的集合。
算符+和算符*有同样的优先级和结合性。
代数恒等式 r* = r+ | 和r+ = rr*表达了这两个算符之间的关系。
2>零个或⼀个实例⼀元后缀算符?的意思是“零个或⼀个实例”,r?是r | 的缩写。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1
转换函数
转换图
非确定的有限自动机
Nondeterministic Finite Automata (NFA):
一个 NFA 也是一个五元(quintuple) M = ( S, Σ , f, s0 , Z), 其中
• S 是一个有限状态集; • Σ 是一个字母表, 它的每个函数称为一个输入 符号 • f : S×Σ*→ρ(S), 转换函数; • s0 ∈S, 非空初态集; • Z ⊆S, 终态集.
• 这个自动机所接受的语言是所有被3整除 以后余数为2的二进制串序列
例 1:
M1= ( {q0, q1, q2, q3}, {0, 1}, f1, q0 {q3} ) . 其中f1如下所示 :
f1:
q0 q1 q2 q3 0 q2 q3 q0 q1 1 q1 q0 q3 q2 q2 0 q0
1 q1 1 0 1 q3 1 0 0
有限自动机与正规式的等价性证明
• 替换规则如图所示:
V1 V1 V2 V1 V2 V3 V1V2*V3 V2 V1V2 V1︱V2
正规表达式与非确定的有限自动机的等价性
Equivalence of RE and NFA:
RE ==> NFA: 我们对于RE进行归纳证明: 基础:
ε 对应 φ 对应 a 对应
举例
• 如下述C++代码段: while (i >= j) i-- ; 经过词法分析器处理后,它将转换为如下的单词 符号序列: <while , -> < ( ,- > <id ,指向i的符号表项的指针> < >= ,- > <id ,指向j的符号表项的指针> …… 注:在书中我们假定关键字,运算符和界符都是一符 一种种别,标识符单列一种
输入、预处理
• 工作的第一步是输入源程序文本。输入 串一般是放在一个缓冲区中,这个缓冲 区称输入缓冲区。 • 一个预处理子程序,会对输入串进行一 些预处理的工作,处理出一串确定长度 的输入字符,并将其装进词法分析器所 指定的缓冲区中(扫描缓冲区)
单词符号的识别:超前搜索
• 关键字的识别 在一些语言中,关键字和用户自定义的标 识符或标号之间没有特殊的界符作间隔,这 使得关键字的识别甚为麻烦。如: 1、 DO99K=1,10 2、 IF(5.EQ.M) I=10 3、 DO99K=1.10 4、 IF(5)=55 这四个语句都是正确的FORTRAN语句.但 意义却不同.为了区别,我们必须超前扫描 许多个字符,超前到能够肯定词性的地方 为止。
状态转换图
识别标识符和整数的转换图分别如下所示:
字母/数字 字母 0 1 其它 2 7 * 0 数字 数字 1 其它 2 *
• 大多数程序语言的单词符号都可以用转换 图来予以识别
Regular Expressions and Finite Automata
正规表达式与有限自动机
• 为了更好地使用状态转换图构造词法分 析程序,为了讨论词法分析程序的自动生 成,需要将上述转换图的概念加以形式化.
正规表达式
Regular Expressions( RE):
• 3.假定 α 和 β 都是Σ上的正规式, 它们的正规集 分别为A和B, 那么α﹒β , α | β, 和 α* 也都是正 规式, 它们所表示的正规集分别为 AB, AUB和 A* ; • 4.仅由有限次使用上述三步骤而定义的表达式才 是Σ上的正规式 ,仅由这些正规式所表示的字集 才是Σ上的正规集。 • 正规表达式满足交换律、结合律、分配律。任意 正规式与空字的连接后仍为该正规事本身。
词法分析器的设计
• 在设计中,把词法分析器安排为一个独立阶段 可以使整个编译程序的结构更简洁,清晰和条理 化.而且它也用更有效的特殊方法和工具进行处 理,也就是我们后面要介绍的正规文法和有限自 动机. 但是,这并不意味着我们也必须把词法分析器 作为独立的一遍。我们可以把词法分析器安排 成一个子程序,每当语法分析器需要一个单词符 号时就调用这个子程序,词法分析器就从输入串 识别出一个单词符号,把它交给语法分析器.
有限自动机举例
Example of Finite Automaton
Example 1:
q0 0 0 1 q2 1 0 q3 1 1 q1 0
• 这个自动机接受的语言就是所有含有奇 数个0和奇数个1的字符串
有限自动机举例
Example of Finite Automaton
Example 2:
0 start 1 1 one zero 1 0 0 two 0 1
Lexical Analyzer
词法分析器
内 容
2.1 词法分析器的任务 2.2 正规表达式和有限自动机 2.3 词法分析器的构造 2.4 词法分析器的自动产生
词法分析器的任务
• 词法分析器的任务就是把一个源程序的 输入串进行词法分析,然后分解为一个 个的单词符号。 • 程序语言的单词符号一般可分为下列五 种:(1)基本字、(2)标识符、(3)常数、 (4)运算符、(5)界符。 • 词法分析器所输出的单词符号常常表示 称如下的二元式: (单词种别、单词自身的值)
正规表达式
Regular Expressions( RE):
• 为了更好地使用状态转换图构造词法分析 程序,为了讨论词法分析程序的自动生成,需要 将上述转换图的概念加以形式化. • 字母表Σ上的正规表达式定义如下: • 1. ε 和 φ 都是Σ的正规式,他们所表示的正规 集分别为{ε}和Φ; • 2.任何a ∈Σ , a 是Σ上的一个正规式,它所表示 的正规集为{ a };
确定的有限自动机
Deterministic Finite Automata(DFA)
一个DFA M是一个五元式(quintuple) M = ( S, Σ , f, s0 , Z), 其中
• S 是一个状态的有限集; • Σ 是一个有穷字母表,是输入符号的集合; • f : S×Σ →S, 是一个转换函数; • s0 ∈S,是唯一的一个初态; • Z ⊆S, 是一个终态集.
正规表达式举例
Example of Regular Expressions:
letter ::= a | b | ...| z (or [a - z] in short) 字母序列 字母序列. digit ::= 0 |1 | ... | 9 (or [0 - 9] in short) 数字序列 数字序列. identifier ::= letter ( letter | digit )* 表示符序列. 表示符序列. integer ::= digit (digit)* 整数序列 sign ::= + | 符号序列 signedinteger ::= sign integer 有符号整数序列 decimal ::= signedinteger . integer | signinteger . | sign . integer 小数序列 exponential ::= ( decimal | signinteger) E signedinteger 指数小数序列 real ::= decimal | exponential 实数序列
确定的有限自动机与非确定的有限自动机的区别
The difference between DFA & NFA:
DFA and NFA 的转换函数的定义是不同:
DFA f: S×Σ →S NFA f: S×Σ*→ρ(S)
意思是说: DFA 只有一个后继状态而 且输入为空的话就不能发生状态的转换 , 但是 NFA的一个状态可以有0个或者1个以 上的后继状态,而且能空转换.
有限自动机
Finite Automaton
• 对于∑*中的任何字α,若存在一条从初 态结点到某一终态结点的通路,且这条 通路上所有弧的标记符连接成的字等于α, 则称可为DFA M所识别(读出或接受)。 • 若M的初态结点同时又是终态结点,则 空字ε可为M所识别(或接受)。 • DFA M所能识别的字的全体记为L(M), 称为这个自动机所能接受的语言。
词法分析器的任务
• 单词种别通常用整数编码.它主要取决于处理上 的方便. • 如果一个种别只含一个单词符号,那么,对于这个 单词符号,种别编码就完全代表它自身了.若一个 种别含有多个单词符号,那么,就还应给出有关单 词符号的属性信息. • 单词符号的属性是指单词符号的特性或特征.属 性值则是反应特性或特征的值.例如某个标识符, 常将存放它得有关信息得符号表项得指针作为其 属性值. • 所以词法分析器的任务就是将一个源程序的输入 串分解成为一个二元式的序列。
转换函数
转换图
例2:
M= ({start, zero, one, two}, {0, 1}, f2, start, {two}) 其中f2 如下所示:
f2:
start zero one two
0 0 zero zero two one 1 one one zero two 0 start 1 zero 1 1 two 0 0 one
有限自动机
Finite Automaton
• 一个有限自动机可表示成一张状态转换 图。 • 假定DFA M含有m个状态和n个输入字符, DFA M m n 那么,这个图含有m个状态结点,每个 结点顶多有n条箭弧射出和别的结点相连 接,每条箭弧用∑中的一个不同输入字 符作为标记,整张图含有唯一的一个初 态结点和若干个(可以是0个)终态结点
有限自动机模型
Finite Automata (FA):
一个有限自动机的模型如下所示:
... ... head finite control input tape
输入带被分成一个个的小单元来装输入符号, 其右边是无限延伸的。 有限状态控制器由有限个状态组成,并根据读 入字符将当前状态转换成下一个状态