正规式转换到非确定有穷自动机转换的一般算法

要求

  • 用C++ 实现;
  • input.txt描述正规式,需要编程加以解析,该文件规定的格式为:第一行写处正规式的符号集,规定符号集为0-9共10个数字符,第二行写正规式,如:
    • 0123456789
    • (0|1)*0.10* (注:*表示闭包运算,.表示连接该符号可省略)
  • output.txt为描述非确定有穷自动机的文件,有程序生成,生成时需按如下格式:
    • 第一行写出状态集,用大写字母A-Z表示,如:ABCD
    • 第二行描述自动机的符号集为0-9共10个数字符,如:0123456789
    • 第三行写初态集,如:A
    • 第四行写终态集,如:CD
    • 第五行写出转移函数,如(A,0,B)表示A状态的出边0到达B状态。上例正规式可表为(A,0,A)(A,1,A)(A,0,B)(B,1,C)(C,0,D)(D,0,D)。

思路

使用Thompson构造法,输入为字母表Σ上的正规式,输出为相等的NFA。具体方法为:

首先将构成r的各个元素分解,对于每一个元素,按下述规则1和规则2生成NFA。(注意:如果r中记号a出现了多次,那么对于a的每次出现都需要生成一个单独的NFA。)之后依照正规表达式r的文法规则,将生成的NFA按照下述规则3组合在一起。

  • 规则1 对于空记号ε,生成下面的NFA。
    在这里插入图片描述
  • 规则2 对于Σ的字母表中的元素a,生成下面的NFA。
    在这里插入图片描述
  • 规则3 令正规表达式R和S的NFA分别为N(R)和N(S)。
  • 对于R|S,按照以下的方式生成NFA N(R|S)。
    在这里插入图片描述
  • 对于RS,按照以下的方式生成NFA N(RS)。
    在这里插入图片描述
  • 对于R*,按照以下的方式生成NFA N(R*)。
    在这里插入图片描述

流程图

  • 总体流程图
    在这里插入图片描述
  • 在正规式中加入省略的连接符
    在这里插入图片描述
  • 将式子转为后缀表达式
    在这里插入图片描述
  • 将后缀表达式转换成NFA
    在这里插入图片描述

数据结构

struct edge
{
	char weight;
	char next;
};

string option,expression, suffix, infix, postion;
map<char, int> precedence;
map<char, vector<edge>> nfa;
vector<string> tfunction;
// 具体解释如下:
// edge:NFA图中的边;
// option:输入的符号集;
// expression:输入的正规式;
// infix:增加连接符的正规式;
// suffix:转换成的后缀表达式;
// postion:状态集;
// precedence:规定运算符优先级;
// nfa:生成的NFA(使用map生成了一个char与edge向量的映射,char代表NFA中的顶点,也就是生成了一个顶点与从顶点出发边的集合的映射);
// tfunction:转移函数。

代码详见 Github上,欢迎star!

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
1. 实验原理 正规式是表示一类字符串的一种简单方式,可以通过正规式转换为等价的确定有穷自动机确定有穷自动机(NFA)是一种自动机模型,其中转移函数将一个状态和一个输入符号映射到零个或多个状态。NFA与确定有穷自动机(DFA)不同之处在于,DFA每次只能转移一个状态,而NFA可以同时转移多个状态,因此NFA更加灵活,但也更加复杂。 正规式可以通过正则文法转换为等价的确定有穷自动机。正则文法是一种用于描述正规式的文法,可以通过一系列的规则将正规式转换为等价的正则文法,然后将正则文法转换为等价的NFA。 2. 实验步骤 (1)输入正规式 首先,需要输入一个正规式,例如:a\*b+c。可以使用字符串来表示正规式。 (2)将正规式转换为等价的正则文法 使用正则文法可以描述正规式。可以使用一系列的规则将正规式转换为等价的正则文法,例如: 规则1:将正规式中的+转换为|,例如:a+b+c转换为a|b|c。 规则2:将正规式中的*转换为正则文法中的S->S*|ε,例如:a*b*c转换为S->aSb|ε。 (3)将正则文法转换为等价的确定有穷自动机 可以使用一般算法将正则文法转换为等价的确定有穷自动机。该算法的大致步骤如下: 步骤1:构造一个开始状态和一个结束状态。 步骤2:对于正则文法中的每个产生式,为其构造一个转移函数,并将其添加到转移函数集合中。 步骤3:对于每个终结符,为其添加一个ε转移函数,将其转移到所有可以经过一次ε转移到达的状态。 步骤4:对于每个状态,将其经过ε转移能够到达的所有状态进行合并,形成新的状态。 步骤5:重复步骤4,直到没有新的状态产生。 步骤6:删除所有不可达的状态。 步骤7:得到最终的NFA。 (4)输出状态图 最后,可以将得到的NFA输出为状态图,以便更直观地观察其状态转移过程。 3. 实验结果 输入正规式a\*b+c,得到等价的正则文法为: S -> aSb | c 将正则文法转换为等价的NFA,得到状态图如下: ![NFA状态图](https://i.imgur.com/3A3wPiv.png) 4. 实验结论 本实验通过编程实现正规式转换确定有穷自动机转换的一般算法,得到了正规式a\*b+c对应的等价的NFA,并将其输出为状态图。该NFA可以用于匹配符合该正规式的字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值