文章目录
一、词法分析器的设计方法
1.词法分析器的处理结构
- 第一种:词法分析器和语法分析器完全分开
- 第二种:词法分析器作为语法分析器调用的子程序
2.单词符号的分类与输出形式
(1)分类
单词符号是程序语言的基本语法单位,具有确定的
语法意义。程序语言的单词符号通常可分为下面五种:
• 保留字:如C语言中的if、else、while和do等
–几乎所有的程序语言都禁止用户使用保留字作为标
识符
• 标识符:用户自己定义的常量名、变量名、方法名等
• 常数:布尔常数(true/false)、整型、实型等
• 运算符: “+”、“- ”、“ * ”、“/ ”、“>”、“<”等
• 界符:在语言中是作为语法上的分界符号使用的,如
“,”、“;”、“(”、“)”、“=”等
(2)输出形式
单词符号通常表示成如下的二元式:(单词种别,单词自身的值/入口指针)
3.状态转换图
(1)概念
在词法分析中,可以用状态转换图来识别单词。状态转
换图是状态有限的有向图,结点代表状态,用圆圈表示;结
点之间可由有向边连接,代表状态转换关系,有向边上可标
记字符,表示前一状态接受某一个字符之后的状态转移

(2)表示
• 初始状态用“ ○”表示
• 非终止状态用“○”表示
• 状态之间的跳转用“ ”(有向边)表示
• 终止状态用“◎”或“◎*”表示(‘*’表示将最后多读入的符号退回)
(3)编程
- 含分支的状态
• 对应一个switch()语句
• 或对应一组if-else语句 - 含回路的状态
• 对应一个while语句 - 终态对应一个return语句
• 意味着从词法分析器返回
到调用段,一般指返回到
语法分析器
二、一个简单的词法分析器
(1)C语言子集对应的状态转换图
- 对输入程序串预处理,即剔除多余的空白符(在实际的词法分析中,预处理还包括剔除注释和制表换行符等编辑性字符的工作)
- 将保留字作为一类特殊的标识符来处理
(2)状态转换图的实现
- 实现方法:让每个状态对应一小段程序
三、正规表达式与有限自动机
(1)前置概念
- 正规表达式(简称正规式)是词法分析的形式化表示方法

- 字母表:语言元素的非空有穷集合,通常用‘Σ’表示
- 符号:字母表中的每一个元素,也叫字符
- 符号串:由符号组成的有穷序列(可以是0个),也叫字
- 空字:长度为0的字,用‘ε’表示
- 字的全体:所有字组成的集合,用“ Σ* ”表示
- 空语言:不含任何字的语言{ },用‘Ф’表示
(2)正规式和正规集
-
对于给定的字母表Σ,正规式和正规集定义为:
• (1) ε和Ф都是Σ上的正规式,它们所表示的正规集分别为
{ε}和Ф。
• (2) 对于任一个符号a∈Σ,a是Σ上的一个正规式,它所表
示的正规集为{a}。 -
如果R和S是Σ上的正规式,它们所表示的正规集分别为L®
和L(S),则:
① R | S是Σ上的正规式,它所表示的正规集为L®∪L(S);
② RS是Σ上的正规式,它所表示的正规集为L®L(S);
③ ® * 是Σ上的正规式,它所表示的正规集为(L®) * ; -
仅由有限次使用规则(1)~(3)得到的表达式是Σ上的正规式,
它所表示的集合是Σ上的正规集
(3)正规式的运算
1)连接运算
- 正规式的连接:RS = {α β | α∈R&β∈S}
例:A={ab,bc} ,B={ac,cb },则:
AB ={abac,abcb,bcac,bccb} - 正规式的幂运算:正规式自身的n次连接
并约定: R0 = {ε}。
2)闭包运算
- 集合R的闭包表示为R*,具体定义为:R*= R0∪R1∪R2∪R3∪…
- 集合R的正闭包表示为R+,具体定义为:R+ = R1∪R2∪R3∪… = RR*
显然: R*= R0∪R+
(4)正规式的运算性质
• (1)交换律: R | S = S | R
• (2)结合律: R | (S | T) = (R | S) | T;R(ST) = (RS)T
• (3)分配律: R(S | T) = RS | RT;(R | S)T = RT | ST
• (4)同一律: εR = Rε = R
(5)有限自动机(Finite Automation)
1)确定有限自动机(Deterministic FA)

Z包含于S
- 对于一个自动机FA 而言,如果存在一条从初始状态到终止
状态的通路,通路上有向边所识别的字符依次连接所得到
的字符串为α, 则称α可以为FA 所接受或者α为FA 所识别
(FA所识别的字) - FA 所能识别的字符串集为FA 所识别的语言,记为L(M)
- FA的等价
对于任意两个FA M和 FA M’, 如果L(M)=L(M’), 则称M和M’等价
对于任意一个NFA M,一定存在一个DFA M’与其等价
2)非确定有限自动机(Nondeterministic FA)

197

被折叠的 条评论
为什么被折叠?



