第3章--词法分析
《编译原理》第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}
my第03章-词法分析
如果一个种别只含有一个单词符号,那么对 于这个单词符号,种别编码就完全代表它自身 了。若一个种别含有多个单词符号,那麽,对 于它的每个单词符号,除了给出种别编码之外, 还应给出有关单词符号的属性信息。 单词符号的属性是指单词符号的特征或特性。 属性值则是反映特性或特征的值。例如,对于 某个标识符,常将存放它有关信息的符号表项 的指针作为其属性值;对于某个常数,则将存 放它的常数表项的指针作为其属性值。
假定每半个区可容120个字符,而这 两个半区又是互补的。如果搜索指示器 从单词起点出发搜索到半区的边缘但尚 未达到单词的终点,那么就调用预处理 子程序,令其把后续的120个字符装入另 半区。我们认定在另半区一定可以达到 单词的终点。这意味着得标示符和常数 的长度实际上必须加以限制,否则即使 缓冲区再大也无济于事。
第三章 词法分析
3.2 词法分析器的设计 3.2.1 输入、预处理 词法分析器工作的第一步是输入源程序文本。输入串一 般放在一个缓冲区中,这个缓冲区称输入缓冲区。词法分 析器的工作可以直接在这个缓冲区中进行。但在许多情况 下,把输入串预处理一下,对单词符号的识别工作将是比 较方便的。 预处理工作包括对空白符、跳格符、回车符和换行符等 编辑性字符的处理,及删除注解等。 我们可以设想构造一个预处理子程序,他完成上面的工 作。每当词法分析器调用它时就处理出一串确定长度的输 入字符,并将其装入词法分析器所指定的缓冲区中(称为 扫描缓冲区)。这样分析器就可以在此缓冲区中直接进行 单词符号的识别工作。
a 0 b 2 b a a b 3 a
1
b
第三章 词法分析
替换规则
如:正规式:R=(a*b)*ba(a|b)*
第三章 词法分析
习题:画出状态转换图
程序设计语言编译原理(第三版)第3章
程序设计语言编译原理(第三版)第3章第3章词法分析任务:从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串。
§3.1§3.2§3.3§3.4对于词法分析器的要求词法分析器的设计正规表达式与有限自动机词法分析器的自动产生(LE某)—略1§3.1对于词法分析器的要求一.功能和输出形式二.接口设计§3.1对于词法分析器的要求一.功能和输出形式1.功能:输入源程序,输出单词符号2.单词符号的分类(1)关键字:由程序语言定义的具有固定意义的标识符,也称为保留字或基本字。
例如:Pacal语言中begin(2)标识符:用来表示各种名字。
endifwhile等。
如变量名、数组名、过程名等。
(3)常数:整型、实型、布尔型、文字型等例:100(5)界符:,;3.14159()true等ample(4)运算符:+、-、某、/3§3.1对于词法分析器的要求3.输出的单词符号形式二元式:(单词种别,单词符号的属性值)通常用“整数编码”“单词符号的特征或特性”单词符号的编码:标识符:一般统归为一种常数:常按整型、实型、布尔型等分类关键字:全体视为一种/一字一种运算符:一符一种界符:一符一种4§3.1对于词法分析器的要求例:考虑下述C++代码段:while(i>=j)i--;经词法分析器处理后,它将被转换为如下的单词符号序列:<while,-><(,-><id,指向i的符号表项的指针><>=,-><id,指向j的符号表项的指针><),-><id,指向i的符号表项的指针><--,-><;,->§3.1对于词法分析器的要求二.接口设计1.词法分析器作为独立的一遍词法分析字符流(源程序)单词序列(输出在一个中间文件上)2.词法分析器作为一个独立的子程序,但并不一定作为独立的一遍语法分析器单词(至少一个)调用(取下一个单词)词法分析器优点:使整个编译程序的结构更简洁、清晰和条理化.6§3.2词法分析器的设计一.输入和预处理二.单词符号的识别三.状态转换图及其实现§3.2词法分析器的设计一.输入、预处理1.预处理:剔掉空白符、跳格符、回车符、换行符、注解部分等.原因:编辑性字符除了出现在文字常数中之外,在别处的任何出现都无意义.#注解部分不是程序的必要组成部分,它的作用仅在于改善程序的易读性和易理解性.8§3.2词法分析器的设计2.预处理子程序:每当词法分析器调用时,就处理出一串确定长度(如120个字符)的输入字符,并将其装进词法分析器所确定的扫描缓冲区中。
第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页
第三章 词法分析精选版演示课件.ppt
gjgj
11
串和语言(3)
• 串的运算
– 连接(concatenation):x和y的连接时把y附加到x 的后面形成的串,记作xy。
• x=dog,y=house,xy=doghouse
– 指数运算(幂运算):s0=ε,s1=s,si=si-1s;
• x=dog,x0=ε,x1=dog,x3=dogdogdog
第三章 词法分析
赵建华 南京大学计算机系
2009年2月
gjgj
1
内容
• 词法分析器的作用 • 词法单元的规约 • 词法单元的识别 • 词法分析器生成工具Lex • 有穷自动机 • 从正则表达式到自动机 • 词法分析器生成工具的设计方法
gjgj
2
词法分析器的作用
• 读入源程序字符流、组成词素,输出词法单元序列。 • 过滤空白、换行、制表符、注释等。 • 将词素添加到符号表中。 • 在逻辑上独立于语法分析,但是通常和语法分析器
器通过单元名即可确定词法单元序列的结构。
– 属性值通常用于语义分析之后的阶段
• 模式
– 描述了一类词法单元的词素可能具有的形式
• 词素
– 源程序中的字符序列 – 它和某个词法单元的模式匹配,被词法分析器识别
为该词法单
• printf(“Total = % d\n”, score);
– printf, score和标识符(id)的模式匹配 – “Total = % d\n”和literal的模式匹配
gjgj
6
词法单元的属性
• 一个模式匹配多个词素时,必须通过属性 来传递附加的信息。属性值将被用于语义 分析、代码生成等阶段。
• 不同的目的需要不同的属性。因此,属性 值通常是一个结构化数据。
编译原理 第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章 词法分析与有穷自动机
■有穷自动机的状态转移图表示方法
词法分析
第三章 词法分析
常常把词法分析程序作为独立的一遍或作 为被语法分析程序所调用的子程序。
1、作为独立的一遍:
语法分析前进行词法分析,把单词符号 串形成中间文件存贮。
2019/11/21
中南大学软件学院 陈志刚
6
3.1 词法分析概述
第三章 词法分析
三、词法分析程序的安排
2019/11/21
中南大学软件学院 陈志刚
27
六、转换系统
第三章 词法分析
定义:转换系统是具有下列三个特征的状态转换 图,即 1) 开始状态S和终止状态Z 唯一; 2) 无弧进入S,也无弧自Z射出;
3)可能存在标记为空串(ε)的弧。
转换系统与状态转换图的区别: ε弧
ε S1
Z1 ε
S
A
Z
2019/11/21
中南大学软件学院 陈志刚
14
3.1 词法分析概述
五、词法分析程序的输出形式
解:输出的单词串为:
第三章 词法分析
2019/11/21
中南大学软件学院 陈志刚
15
第三章 词法分析
3.2 词法分析程序的设计
一、状态转换图
状态转换图是一张有限方向图。用结点代表状态, 状态之间用箭弧连接,箭弧上的标记(字符)代表 在射出结状态下可能出现的输入字符或字符类。
1 非字母或数字 2
例2:
0
1
U
数字
3
非数字
4
=
5
0 0
V
1
2019/11/21
01
+
6
Z
例3:
*
7
非*
8
编译原理 第3章
3.1.3 识别标识符的若干约定和策略
定义标识符的语法规则为 <标识符>→<字母>∣<标识符><字母>∣<标识符><数字> 从语法上来说,标识符的长度似乎可以任意。 然而,考虑实现技术,许多语言都对标识符的最大允许长度作 了限制。
编译原理
7
设计扫描器时,按如下原则行事: 1. 如果一个标识符中的字符个数超过最大允许长度,则把尾部 多出的字符截去; 2. 对于字符个数不超过最大允许长度的标识符,则按“尽可能 长”的策略来识别标识符。
图3.5 状态图
首先,在开始状态R下扫描的第一个符号是0,转到状态 V,表示0是句柄,归约到V。接下来,在状态V扫描1, 转到状态S,此时句柄为V1,归约成S。再往下扫描1,由 状态S转到状态U,表示句柄为S1归约为U。最后,扫描0, 转到状态S,此时句柄为U0,归约为S,
编译原理 27
图3.6(a)列出分析的每一步。形成图3.6(b)所示的语法 树。 自底向上的分析。
读入a1,沿矢线方向到下一状态,在此状态时扫 描a2,……, 直至W中全部字符读完且进入终态F,则W已被接受。
编译原理 19
例:下面的状态图对于串baabba的识别 S→aA|bB,A→bB|aD|a,B→aA|bD|b,D→aD|bD|a|b
a
A a a
a
S b
b
B
a
D b a,b b Z
编译原理
16
E d
d 0
d
d
d 5 d 6
1
.
d
2
E
4
±
. 图3.4文法G<无符号数>的状态图
第三章 词语分析释义法
七、类推造词法 就是依据一个既有合成词的结构方式, 就是依据一个既有合成词的结构方式,在 保留其中一个语素的前提下, 保留其中一个语素的前提下,以同属类义范 畴的语素替换其它语素, 畴的语素替换其它语素,从而产生不同新词 的造词方法。 的造词方法。 歌迷 影迷 球迷 书迷 电视迷 舞迷(“烟迷”、 舞迷( 烟迷” 酒迷” “酒迷”) 酒吧(哭吧) 氧吧 陶吧 网吧 茶吧 水吧 酒吧(哭吧) 文盲 色盲 乐盲 舞盲
第一节 造词分析释义法 造词法就是创造新词的方式和方法。 造词法就是创造新词的方式和方法。通 过造词法的分析, 过造词法的分析,不仅可以使学习者了ห้องสมุดไป่ตู้ 词的产生机制,便于他们的理解和记忆, 词的产生机制,便于他们的理解和记忆, 同时也可以提高他们的学习兴趣。 同时也可以提高他们的学习兴趣。汉语的 造词法到底有多少种类, 造词法到底有多少种类,至今还没有公认 的完善的系统, 的完善的系统,教材中大致归纳了以下几 种。
语素的性质不同,语素的意义也就不同, 语素的性质不同,语素的意义也就不同, 老师” 老人”中的“ 如“老师”和“老人”中的“老”,前者 是词缀,后者为词根语素,表示“年龄大” 是词缀,后者为词根语素,表示“年龄大” 的意思。 的意思。 结构关系是词义的基础。另外, (二)结构关系是词义的基础。另外,结构 关系在词法和句法内的一致性也给词义理 解和短语的学习与分析带来了便利。 解和短语的学习与分析带来了便利。 自学” 蚕食” 司机” 如“自学”和“蚕食”;“司机”和“流 炒菜” 述宾、偏正) 水”;“炒菜”(述宾、偏正) (三)对学习者进行语素观念和构词意识等 的培养,有助于他们用已知知识推测 推测新词 的培养,有助于他们用已知知识推测新词 语意义的能力的形成, 语意义的能力的形成,有助于他们有效地 辨识、记忆和使用词语, 辨识、记忆和使用词语,提高他们自我扩 充词汇的能力。 充词汇的能力。
词法分析(一)
2012-12-5
莆田学院许振和
1
本章要求
主要内容:词法分析的任务,手工 实现词法分析程序,正规式与有穷 自动机,词法分析程序的自动生成 重点掌握:词法分析器的功能和接 口,用状态转换图设计和实现词法 分析程序,正规文法、正规式和有 穷状态自动机的概念及相互转换
2012-12-5
2012-12-5 莆田学院许振和
12
5. 词法错误处理
词法分析器根据各类单词的构词规则分离、 识别单词符号,所以它只对源程序进行非常局部 的检查,仅能发现非法的单词符号。 词法分析器也可以采用下列可能的错误恢 复动作:
(1)删除一个多余的字符; (2)插人一个遗漏的字符; (3)用一个正确的符号代替一个不正确的符号; (4)交换两个相邻的字符。
2012-12-5
莆田学院许振和
23
某简单语言的词法 分析程序的实现 状态转换图的实 现:使用一个 switch case 语 句:每条分支对 应一个case语句 段
2012-12-5
莆田学院许振和
24
词法分析器的自动生成
正规式 正规文法 有穷自动机
见第3章 词法分析(二)
2012-12-5 莆田学院许振和
/ 处理注释和除 号hand_com() 除 号 Y Y
其它特殊符号 识别界符 recog_del()
在界符表中? isdelimete(s) N 出错处理 error()
Y
插入token表
2012-12-5
ins_token(s,token) 莆田学院许振和
19
识别单词前作如下假定:
关键字就是保留字
第三章词法分析
戴新宇南京大学计算机科学与技术系Outline词法分析的作用词法单元的规约(正则表达式) 词法单元的识别(状态转换图) 有穷自动机词法分析器生成工具及设计词法分析器作用词法分析是读入源程序的输入字符、将它们组成词素,生成并输出一个词法单元序列,每个词法单元对应于一个词素。
常见的做法是:由语法分析器调用,需要的时候不断读取、生成词法单元可以避免额外的输入输出在识别出词法单元之外,还会完成一些不需要生成词法单元的简单处理,比如删除注释、将多个连续的空白字符压缩成一个字符等。
词法分析和语法分析通常,将编译过程的分析划分成两个阶段的原因: 简化编译器的设计,任务分解提高编译器的效率增强编译器的可移植性词法分析相关概念词法单元(Token):包含单元名(Token-name)和可选的属性值(attribute-value) 单元名是表示某种词法单位抽象符号。
语法分析器通过单元名即可确定词法单元序列的结构。
词素(Lexeme)源程序中的字符序列,它和某类词法单元的模式匹配,被词法分析器识别为该词法单元的实例。
模式(Pattern)词法单元的词素可能具有的形式。
可以用正则表达式来表示。
词法单元示例词法单元的属性一个模式匹配多个词素时,必须通过属性来传递附加的信息。
属性值将被用于语义分析、代码生成等阶段。
不同的目的需要不同的属性。
因此,属性值通常是一个结构化数据。
词法单元id的属性词素、类型、第一次出现的位置、…词法单元示例(名和属性值)词法分析器的构造实现两种方法:基于词法单元的词法结构图或其它描述,手工编写代码扫描输入中的每个词素,并返回识别到的词法单元信息。
使用词法分析器生成工具(如lex flex)。
给出描述词素的模式,利用工具编译为具有词法分析器功能的代码。
高效且简单。
正则表达式一种描述词素模式的重要表示方法Outline词法分析的作用词法单元的规约(正则表达式) 词法单元的识别(状态转换图) 有穷自动机词法分析器生成工具及设计相关概念字母表:一个有限的符号集合二进制{0,1}ASCIIUnicode典型的字母表包括字母、数位和标点符号串:字母表中符号组成的一个有穷序列 串s的长度|s|空串ε,长度为0的串语言:给定字母表上一个任意的可数的串的集合 语法正确的C程序的集合,英语,汉语相关概念(2)和串有关的术语(banana)前缀:从串的尾部删除0个或多个符号后得到的串。
第3章词法分析
例:语言L[G]={abn|n>=1},其正规文 语言L[G]={ab |n>=1},其正规文 法为G[A]: 法为G[A]: A→aB A→aB B→bB| B→bB| b 画出状态转换图
例:部分单词的状态图
Letter,digit
s
letter digit
其它 (IDN,入口) ,入口) digit 其它 (NUM,值) , (ASG,_) , ) =
3.2 状态转换图
•识别标识符的流程图 识别标识符的流程图 开始
出口 N N 数字 Y
字母 N 出口
Y
取字符
字母 Y
结点:状态用○表示;终态用◎表示 结点:状态用○表示;终态用◎ 有向弧 弧标记 初态 开始 1 letter 2 ── 箭头 ── 输入字符 Letter,d号的表示
• 常用单词种别 常用单词种别——分类 分类
–各关键字(保留字、基本字) 各关键字(保留字、基本字) 各关键字 –各种运算符 各种运算符 –各种分界符 各种分界符——各用一个种别码标识(特定符号类) 各用一个种别码标识( 各种分界符 各用一个种别码标识 特定符号类) –其它标识符 其它标识符——用一个种别码标示(非特定符号类) 用一个种别码标示( 其它标识符 用一个种别码标示 非特定符号类) –常数 常数——用一个种别码标示(非特定符号类) 用一个种别码标示( 常数 用一个种别码标示 非特定符号类)
• 例:文法 文法G[Z]: : • Z→ Z→Za| Aa| Bb • A→ A→Ba | a • B→ B→Ab| b • 画出状态转换图
2、从右线性正规文法出发,构造状态图 从右线性正规文法出发, 以每个非终结符为状态结点, 1. 以每个非终结符为状态结点 , 开始符号 对应初态S 对应初态S ; 2.增设一个终态 Z; 3. 对于规则 A→aB , 画从状态 A 到 B 的 A→aB, 弧,标为 a; A→a, 4. 对于规则 A→a , 画从状态 A 到终态 Z 的弧, 的弧,标为 a。
编译原理-第3章 词法分析--习题答案
第3章词法分析习题答案1.判断下面的陈述是否正确。
(1)有穷自动机接受的语言是正规语言。
(√)(2)若r1和r2是Σ上的正规式,则r1|r2也是Σ上的正规式。
(√)(3)设M是一个NFA,并且L(M)={x,y,z},则M的状态数至少为4个。
(× )(4)设Σ={a,b},则Σ上所有以b为首的符号串构成的正规集的正规式为b*(a|b)*。
(× )(5)对任何一个NFA M,都存在一个DFA M',使得L(M')=L(M)。
(√)(6)对一个右线性文法G,必存在一个左线性文法G',使得L(G)=L(G'),反之亦然。
(√) (7)一个DFA,可以通过多条路识别一个符号串。
(× )(8)一个NFA,可以通过多条路识别一个符号串。
(√)(9)如果一个有穷自动机可以接受空符号串,则它的状态图一定含有 边。
(× )(10)DFA具有翻译单词的能力。
(× )2.指与出正规式匹配的串.(1)(ab|b)*c 与后面的那些串匹配?ababbc abab c babc aaabc(2)ab*c*(a|b)c 与后面的那些串匹配? acac acbbc abbcac abc acc(3)(a|b)a*(ba)* 与后面的那些串匹配? ba bba aa baa ababa答案(1) ababbc c babc(2) acac abbcac abc(3) ba bba aa baa ababa3. 为下边所描述的串写正规式,字母表是{0, 1}.(1)以01 结尾的所有串(2)只包含一个0的所有串(3) 包含偶数个1但不含0的所有串(4)包含偶数个1且含任意数目0的所有串(5)包含01子串的所有串(6)不包含01子串的所有串答案注意 正规式不唯一(1)(0|1)*01(2)1*01*(3)(11)*(4)(0*10*10*)*(5)(0|1)*01(0|1)*(6)1*0*4.请描述下面正规式定义的串. 字母表{x, y}.(1) x(x|y)*x(2)x*(yx)*x*(3) (x|y)*(xx|yy) (x|y)*答案(1)必须以 x 开头和x结尾的串(2)每个 y 至少有一个 x 跟在后边的串 (3)所有含两个相继的x或两个相继的y的串5.处于/* 和 */之间的串构成注解,注解中间没有*/。
第3章编译原理答案(主编张晶)
others *
1/
2*
3* 4/ others
5
others others
all
6 all
others *
1/
2*
3* 4/ others
5
状态1:注释开始状态。 状态2:进入注释体前的中间状态。 状态3:表明目前正在注释体中的状态。 状态4:离开注释前的中间状态。 状态5:注释结束状态,即接受状态。
(1)分析和识别单词及属性, 包括识别语言的关键字、标识符、常数、运算符等;
(2)跳过各种分隔符,如空格,回车,制表符等; (3)删除注释; (4)进行词法检查,报告所发现的错误; (5)建立符号表。
main( )/*ADD*/ {int x=10,y=20,sum; sum=x+y; }
词法分析
正则表达式也是描述单词的重要工具。
【例2】设Σ={a,b}
正规式 ba* a(a|b)* (a|b)*abb (a|b)*(aa|bb) (a|b)* (aa|ab|ba|bb) * (a|b)(a|b)(a|b) *
正规集 所有以b为首后跟任意多个a的符号串 所有以a为首的符号串 所有以abb为尾的a,b符号串 所有含有两个相继的a或相继的b的符号串 空串和任何长度为偶数的符号串 任何长度大于等于2的符号串
转换
正规文法
main、(、)、{、int、 x、=、10、,、y、=、 20、,、sum、;、sum、 =、x、+、y、;、}
词法分析程序的设计与实现?
词法规则
状态图
词法分析程序
为识别单词而专门设计的有向图, 是设计词法分析程序的一种好途径。
(1)根据词法规则写出正规文法; (2)将正规文法转换成状态图; (3)将状态图转换成流程图。
6.第三章词法分析(2)
DFA表示为状态转换图:例
例1的DFA M=({0,1,2,3},{a,b}, δ,0,{3})
δ 所对应的状态转换图如 P48.图3.5
a
1
b a
a
0
b
3
b
a,b
2
以后,将不加区别的使用DFA和状态转 换图。
12
DFA识别(读出,接受)字α
DFA识别字α 对于*中的任何一个字,若存 在一条从初态结点到某一终态结点的通路,且 这条通路上所有箭弧的标记符连接成的字等于 ,则称为DFA M所识别。 例: 图3.5的DFA识别字abbab, 因为存在路 径 012333;但不接受字ababa, 因为不存 在识别路径。 a a 1 a,b 3 b a 0
状态 0 1 2 3
a 1 3 1 3
b 2 2 3 3
10
DFA表示为 --- 状态转换图
DFA也可以表示成一张确定的状态转换图。 假定DFA M含有m个状态n个输入字符,那末 这张图: 含有m个状态结点 每个结点顶多有 n条箭弧射出和别的结点相 连接 每条箭弧用上的一个不同字符作标记 整张图含有唯一的初态和若干个 ( 可以是 0 个)终态结点。 某个结点可以既是初态同时又是终态。
任务:从左到右一个字符一个字符地读入源程 序,对构成源程序的字符流进行扫描和分解, 从而识别出一个个单词符号。
逻辑上紧密相连的一组字符, 这些字符具有集体含义。
单词:标识符,保留字,常数,算符,界符 词法分析阶段的工作所依循的是语言的词法规 则。描述词法规则的有效工具是正规式和有限 自动机。
第3章 词法分析(II)
词法分析(Lexical Analysis) 词法的表示 词法分析器的设计与实现
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 状态转换图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章 词法分析知识结构:功能 词法分析器的要求 单词符号分类 词法分析 单词内部形式器的设计 设计方发词法分析器的设计 状态图词法分析器组成正规表达式单词描述工具 正规集词法分析器 正规文法确定有限自动机(DFA )单词识别工具 非确定有限自动机(NFA )DFA 的最小化正规式与FA 的等价转换等价转换正规文法与FA 的等价转换第一节 对词法分析器的要求一、词法分析器的功能输入源程序,输出单词符号(二元式表示)。
关键字:是由程序语言定义的具有固定意义的标识符。
标识符:用来表示各种名字,如变量等。
常数:常数的类型有整型,实型等。
运算符:算术运算符,关系运算符,逻辑运算符。
界限符:逗号,分号等。
三、单词符号内部的表示形式内部的单词符号TOKEN字(二元式),TOKEN字占用机器字的长度,依据信息量的多少而定。
1、TOKEN字结构CLASS:用整数表示。
VALUE:表示单词符号的属性(符号表指针)。
2、TOKEN的作用CLASS:用于语法分析器对源程序结构的分析。
VALUE:用于语义分析器对源程序具体操作的分析。
3、单词种别码划分原则CLASS:关键字,运算符,界限符(编译程序定义的符号)使用一字一种编码。
VALUE值省略。
VALUE:标识符,常数(用户定义的符号),存放符号表常数表的指针。
标识符,常数每一类为一种编码。
例:BEGIN A:= B END;词法分析结果:符号表(BEGIN,---- )Array(A ,K1 ) K1(:= ,--- )(B ,K3 ) K3(END ,--- )(;,--- )四、词法分析器的结构1、一遍扫描(交互式结构)。
2、多遍扫描(独立式结构)。
第二节词法分析器的设计一、设计步骤1、确定词法分析器的接口关系;2、确定单词分类和TOKEN字的结构;3、对每一类单词构造状态转换图;4、根据状态转换图设计算法。
二、功能描述1、组织源程序输入;2、按词法规则拼读单词符号,并转换成二元式;3、删除注解行,空格和无用符号;4、检查词法错误。
三、设计方法1、输入(读取原文件)原文件存储方式:一种方式将原文件一次读入内存,另一种方式利用缓冲区技术将原文件分批读入内存。
缓冲区的设置:输入(扫描)缓冲区,存放输入的原文件(双缓冲区)。
2、预处理功能描述:删除无用符号,出错信息的列表打印。
单词符号的识别:⑴语句格式①标识符不能被无效字符隔开。
②标识符与关键字,关键字与关键字之间用空格符隔开。
②标识符的个数不能超过限定的个数。
⑵单词符号的格式①标识符,关键字的首字符必须是字母。
②常数的首字符必须是数字。
3、识别算法(P39)标识符的识别;常数的识别;算符的识别;界符的识别。
四、状态转换图1、状态转换图的表示形式是一张有向图,结点代表状态(用○表示),结点间用箭弧线连接( ),箭弧线上的符号,表示射出结点到达射入结点可能识别的输入符号,终态结点代表分析结束。
初态⇒⑴ ⇒⊙初始状态,表示识别符号串的开始。
⑵双圈◎终态,表示识别符号串的结束。
⑶◎*表示多读入一个字符。
例1:标识符的状态转换图状态转换矩阵字母,数字例2:标识符“AB1”的识别 例4 状态转换矩阵 数字2、识别过程从初态开始,逐步读入字符,转到下一个状态(或出错),直至终态(或不能到达终态出错)。
例3:字符串“AB+12”的识别识别出单词AB,多读入一个字符 +。
由另一张状态转换图识别单词符号 +。
继续识别剩余字符12(数字):上述识别过程把AB +12字符串分解为三个单词符号“AB ”、“ + ” 、“12”。
3、状态转换图的实现状态转换图非常容易用程序实现,每一个状态对应一段程序。
⑴不含回路的分叉状态结点的程序设计利用多分支语句CASE 或选择语句IF...THEN...ELSE...。
⑵含回路状态结点的程序设计利用循环语句WHILE...DO。
⑶词法分析程序的组成状态转换图是一种特殊的流程,它可直观清晰地描述单词符号的识别过程,只要把每一个结点加入语义动作,就构成了词法分析程序。
4、词法分析程序的组成(八个模块)主控模块;初始化模块;判定源程序文件是否存在模块;从源程序文件中读一个字模快;拼读一个单词模块;查关键字模块;输出单词模块;错误处理模块。
第三节正规式、正规集、正规文法一、正规式的定义∑中的符号为正规式的基本符号,单个符号或由符号与运算符组成的表达式称正规式。
运算符优先级:重复用“ * ”表示;连接用“•”表示或省略;选择用“∣”表示。
例:a,ab *,a∣b ,(a∣b)c都是正规式。
二、正规集由正规表达式所表示的字符串的集合称为正规集。
如正规式用V表示,正规集L(V)表示。
三、正规文法正规文法是上下文无关文法的一种特殊情况,所有产生式的右部至多含有一个非终结符号,左线性文法,右线性文法都属于正规文法。
左线性文法:A →B αA → α右线性文法:A → αBA → α 其中:A ,B ∈V N ,α∈V * T * T四、正规式与正规集的递归定义1、正规式与正规集的递归定义P46⑴ε和Ф都是Σ上的正规式,正规集为{ε}和Ф。
⑵任何a ∈Σ,a 是∑上的正规式,正规集为{a}。
⑶假定U 和V 是∑上的正规式,正规集为L(U),L(V)U ∪V 是正规式,正规集为L(U)∪L(V)。
UV 是正规式,正规集为L(U)L(V)。
(U)*是正规式,正规集为 (L(U))*。
例1:令Σ= {a, b},则⑴正规式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 | b)*=(a*b*)*,即所有a和b的符号串集合。
⑸(a | b)*(aa| bb)(a | b)*的正规集是所有含有两个相继a或两个相继b的字符串集合。
例2:∑ ={a, b, c……z,0, 1,……9}正规式(a | b…|z)(a | b|…z|0|1|…|9)*代表标识符。
2、正规式与正规集的等价性若两个正规式代表的正规集相同,则认为正规式等价。
U=V,表示L(U)=L(V)例3:U=10**, L(U)={1}{0}*V=10*, L(V)={1}{0}*则10**=10*例4:b(ab)*= (ba)*b (ab)*≠a*b*(a|b)*= (a*b*)*(a|b)*≠(a*|b*)3、正规式的代数定律(1)U∣V=V∣U 交换律(2)U∣V∣W=(U∣V)∣W 结合律(3)U(VW)=(UV)W 结合律(4)U(V∣W)=UV∣UW 分配律(5)εU = Uε= U(6)U *=U+∣ε(7)U **=U*(8)U +=U*U=UU*例1:选择规则U∣V,则描述的正规集L(U∣V)=L(U)∪L(V)。
令 U=a,V=b:则 L(U∣V)= L(U)∪L(V)=L(a)∪L(b)={a}∪{b}={a,b}例2:连接规则UV,则描述的正规集L(UV)=L(U)L(V)。
令 U=a∣b,V=c:则 L(UV)= L(U)L(V)=L(a∣b )L(c)= {a,b}{c}={ac,bc}例3:重复规则U *,则描述的正规集L(U*)=(L(U))*。
U *={ε}∪U1∪U2∪...∪UnU=(a∣ab)L(U *)=(L(U))*=(L(a∣ab))*=(L(a)∪L(ab))* ={a,ab}*={a,ab}0∪{a,ab}1∪{a,ab}2∪⋯={ε}∪{a,ab}∪{a,ab}{a,ab}∪⋯={ε,a,ab,aa,aab,aba,abab,⋯ }五、正规式与正规文法的转换正规式与正规文法都有相同的表达能力,用以描述语言(单词符号)的结构,使得所描述的语言是等价的(即L(V)=L(G))。
1、正规式与正规文法的特点正规式描述的语言结构清晰,简洁;而正规文法描述的语言于识别。
2、正规定义式d1→ r1d2→ r2...其中:d i 为定义式的名字;r i是∑∪{d1,d2,...,d i-1}构成的正规式;r i中不含有d i,d i+1,...。
3、正规式与正规文法的转换算法例:高级语言标识符的正规式字母(字母∣数字)*⑴根据正规定义式规则,给正规式分量、正规式定义名称字母→ A ∣ B ∣ C数字→ 0 ∣ 1 ∣ 2id →字母(字母∣数字)*⑵对定义式的子表达式定义名称rid →(字母∣数字)*⑶对定义式的子表达式展开(字母∣数字)*= ε∣(字母∣数字)+= ε∣(字母∣数字)(字母∣数字)*= ε∣字母(字母∣数字)*∣数字(字母∣数字)*⑷把展开式代入定义式rid →ε∣字母(字母∣数字)*∣数字(字母∣数字)*⑸把rdi →(字母∣数字)*代入定义式id、rid,将得到正规文法:id →字母ridrid →ε∣字母rid∣数字rid其中:id,rid ∈ V N;字母,数字∈V T。
六、正规文法与正规式的转换建立正规文法的联立方程组,求描述同一语言的正规式。
1、右线性文法到正规式,使得L(G)=L(V)。
产生式 X → rX ∣ t,其中 r,t∈ V T X∈V N。
论断1:方程 X=rX + t ,有形如 X=r *t的解。
例:文法GS →aS ∣bA ∣bA →aS⑴立联立方程组S = aS + bA + b ①A = aS ②⑵②式,代入①式S = aS + baS + bS =(a + ab)S + b ⑶由论断得方程解S =(a + ab)*b= (a∣ab)*b对于同一方程式采用不同的结合方式,可以得到不同形式的正规式,但是所描述的语言(正规集)是等价的。
S = aS + baS + b= aS +(baS + b)= a *(baS + b)= a *baS + a*b= (a *ba)*a*b所以(a *ba)*a*b = (a∣ab)*b。
2、左线性文法与正规式的转换算法产生式 X → Xr ∣ t,其中 r,t∈ V T X∈V N。
论断2:方程 X=Xr + t ,有形如 X=tr *的解。
例:文法Gid → id 字母∣ id 数字∣字母其中:id ∈ V N;字母,数字∈V T。
建立方程id = id 字母 + id 数字 + 字母= id(字母 + 数字)+ 字母= 字母(字母∣数字)*3、正规文法与正规式的转换规则⑴产生式 A→xB,B→y 对应的正规式 A=xy;⑵产生式 A→xA∣y 对应的正规式 A=x * y;⑶产生式 A→x ,A→y 对应的正规式 A=x∣y例:文法GS→aA,S→aA→aA,A→dA,A→a,A→d⑴根据规则⑶先有正规式S = aA∣aA = (aA∣dA)∣(a∣d)⑵再将A的正规式变换为A = (a∣d)A∣(a∣d)⑶根据规则⑵将A的正规式变换为A = (a∣d)*(a∣d)⑷再将A式的结果代入S的正规式S = a(a∣d)*(a∣d)∣a⑸再利用正规式的代数性质得到的正规表达式为S = a((a∣d)*(a∣d)∣ε)因为(a∣d)*(a∣d)=(a∣d)+,所以S = a(a∣d)+∣a= a((a∣d)+∣ε)。