一、正则表达式(RE)
语言
正则表达:
正则表达式可以由较小的正则表达式递归构建。每个正则表达式r定一个语言记作L(r)。
正则表达式优先级为:克林闭包>连接>或。
二、正则定义
简单来说就是重定义。
例如:
letter -> 字母
number -> 数
\d -> 整数
三、有穷自动机(FA)
系统根据当前状态与当前的输入信息决定后继行为。
每当处理完当前输入后,状态也发生改变。
1. FA的表示
FA的表示
2. FA定义的语言
如果给定输入串x,如果存在对于该串从初始状态到某个终止状态的转换序列,则该串被该FA接收。
例:对于FA
FA定义的语言
abbaabb是被接收的,而abbaaba则不被接收。
-
由一个有穷自动机M接收的所有串构成的集合被称为该FA定义的语言,记作L(M)。
-
最长匹配:输入有多个前缀匹配时,会选择最长的前缀进行匹配。
四、有穷自动机的分类
- 确定的FA(DFA)
- 非确定的FA(NFA)
重点:转换表;
一个有穷自动机可以由转换表表示。
1. DFA
DFA
DFA例子
2. NFA
NFA
NFA例子
3. DFA与NFA的等价性
- 对于任何NFA,存在识别同一语言的DFA
- 对于任何DFA,存在识别同一语言的NFA
例:
DFA与NFA的转换
以上两种自动机都可以用正则表达式来表示。
事实上,正则表达式与有穷自动机是等价的。
4. 含有空边的NFA
含有空边的NFA
5. DFA的算法实现
从人的角度看,NFA比DFA更加直观;但对于程序来说,DFA比NFA容易实现。
五、从正则表达式RE到有穷自动机FA
直接从RE转换到DFA是比较困难的,所以一般通过NFA作为中介。
转换
1. 从RE到NFA
从RE到NFA
2. 从NFA到DFA
DFA中的每个状态都是NFA中状态集合的一个子集。
从NFA到DFA
即,先写出NFA的转换表,再通过新的状态构建出DFA。
2.1 从带有空边的NFA转换为DFA
例:
带有空边的NFA到DFA
3. 子集构造法
子集构造法
六、识别单词的DFA
1. 标识符
记数字为,字母为
,那么标识符的正则表达式为:
这个正则表达式转换为NFA,表示如下:
标识符的NFA表示
这个NFA同时也是一个DFA,所以不用再进行转换。
2. 无符号数
记:
数字
数字串
小数部分
指数部分
数
即一个数由一个数字串+可选的小数部分+可选的指数部分构成。
转换为NFA,表示如下:
无符号数的NFA表示
通过子集构造法,将NFA转换为DFA:
无符号数的DFA表示
3. 识别各进制无符号整数的DFA
可以表示10进制、8进制、16进制的DFA:
识别各进制无符号整数的DFA
4. 识别注释的DFA
识别注释的DFA
5. 词法分析阶段的错误处理
- 单词拼写错误
- 非法字符
- 错误恢复












网友评论