自动机其他的概念到处都有;笔记记述编译原理中的自动机的使用。在多数的开发中,比如有一段文字陈瑞今年有250岁了
;提取这段文字中陈瑞的年龄250
;使用正则/\d+/
很容易能够提取出250。
正则就相当于产生了一个词法分析器,能够根据需要分析出文本的内容;有穷自动机跟正则表达式是一家人,他们完成的目的都是一样的。只不过有穷自动机需要我们写代码实现出这个正则表达式的内容;为什么不全用正则表达式呢,是因为有穷自动机的性能优化和封装性更优正则表达式,在一些特殊场景有穷自动机发挥着重要作用。
正则表达式到NFA
正则表达式转成确定有穷自动机,需要先转成不确定有穷自动机,然后再转成确定有穷自动机
正则表达式r=(a|b)*abb
NFA不确定有穷自动机
正则表达式r=(a|b)*abb
DFA确定有穷自动机
r = R1R2
正则表达式对应的NFA
r=R1|R2
正则表达式对应的NFA
r=(R1)*
的对应的NFA
将正则表达式r=(a|b)*abb
一步一步的转成的NFA
NFA转换DFA
从NFA到DFA的转换
从带有 ϵ \epsilon ϵ边的NFA到DFA的转换
识别无符号数的DFA
数字:\d
重复数字:\d*
可选择匹配:\d| ϵ \epsilon ϵ, ϵ \epsilon ϵ表示空集合
可选择匹配: ( E(+|-| ϵ \epsilon ϵ)digits )| ϵ \epsilon ϵ
NFA为:重复数字 可选择匹配 可选择匹配
生成的NFA为( ϵ \epsilon ϵ表示空集合)
根据NFA转换成DFA ( ϵ \epsilon ϵ表示空集合)
这里需要明白的一个地方,为什么在0状态输入数字d会转到1,3,6状态。因为输入数字d ,而数字d 后面紧跟着的内容肯定是空集合。既然都是空集合存在,所以也能够到达3,6状态 。
DFA的伪代码
输入: 以文件结束符eof结尾的字符串x。DFA D的开始状态 S 0 S_0 S0,接收状态集 F F F,转换函数 m o v e move move。
输出: 如果 D接收x,则回答 “yes”,否则回答 “no”。
方法: 将下述算法应用于输入串 x。
s = s0;
c = nextChar();
while(c != eof){
s = move(s,c);
c = nextChar();
}
if (s在F中) {
return "yes";
} else {
return "no";
}
函数nextChar( ) 返回输入串x 的下一个符号
函数move(s, c) 表示从 状态s 出发,沿着标记为 c 的边所能到达的状态
文章的有一部分图片来自 《编译原理》哈尔滨工业大学 陈鄞老师的PPT中。