自动机其他的概念到处都有;笔记记述编译原理中的自动机的使用。在多数的开发中,比如有一段文字陈瑞今年有250岁了;提取这段文字中陈瑞的年龄250;使用正则/\d+/很容易能够提取出250。
正则就相当于产生了一个词法分析器,能够根据需要分析出文本的内容;有穷自动机跟正则表达式是一家人,他们完成的目的都是一样的。只不过有穷自动机需要我们写代码实现出这个正则表达式的内容;为什么不全用正则表达式呢,是因为有穷自动机的性能优化和封装性更优正则表达式,在一些特殊场景有穷自动机发挥着重要作用。
正则表达式到NFA
正则表达式转成确定有穷自动机,需要先转成不确定有穷自动机,然后再转成确定有穷自动机

正则表达式r=(a|b)*abbNFA不确定有穷自动机

正则表达式r=(a|b)*abbDFA确定有穷自动机

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的开始状态S0S_0S0,接收状态集 FFF,转换函数movemovemove。
输出: 如果 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中。
5623

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



