编译原理自动机

自动机其他的概念到处都有;笔记记述编译原理中的自动机的使用。在多数的开发中,比如有一段文字陈瑞今年有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结尾的字符串xDFA 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中。

Guess you like

Origin blog.csdn.net/Hello_Ray/article/details/105595370