非确定有限状态自动机的构建(二)——将CharVal转换为NFA
来源:互联网 发布:gradle mac 编辑:程序博客网 时间:2024/04/30 07:09
保留版权,转载注明出处:潘军彪的个人博客(http://blog.csdn.net/panjunbiao/article/details/9378933)
将上下文无关文法读入内存之后,可以将它转换成非确定有限状态自动机。当然,不是所有的上下文无关文法都能够转换成自动机的,前提条件是这个上下文无关文法能够与正则定义等价。因此,在进行转换之前,我们需要先挑选出上下文无关文法中符合正则定义的规则。(参考博文http://blog.csdn.net/panjunbiao/article/details/9364837)
如何将正则表达式转换为NFA呢?我们从最简单的CharVal类型开始(有关CharVal请参考http://blog.csdn.net/panjunbiao/article/details/9087665)。CharVal就是一对双引号包含的字符串,因此在转为NFA的时候,只需要将字符串中的字符按顺序生成NFA状态节点即可。
例如一个CharVal为"ABC",假设文法是大小写不敏感的,这意味着abc也是符合这个文法定义的。转换为NFA应该是这样:
在CharVal类中,下面的方法完成从CharVal到NFA的转换:
@Override public NFA toNFA(Map<String, Rule> rules) throws IllegalAbnfException { NFAState startState = new NFAState(); NFAState acceptingState = new NFAState(); this.toNFA(startState, acceptingState, rules); return new NFA(startState, acceptingState); } @Override public void toNFA(NFAState startState, NFAState acceptingState, Map<String, Rule> rules) { //若CharVal的内容为空,则创建一条从开始状态到接受状态的epsilon迁移。 if (value.length() == 0) { startState.addTransit(acceptingState); return; } NFAState current = startState; for(int j = 0; j < value.length(); j ++) { //最后一个节点使用方法参数中的acceptingState,中间节点自行创建 if (j < value.length() - 1) current = current.addTransit(value.charAt(j)); else current = current.addTransit(value.charAt(j), acceptingState); } }可见,生成NFA并不复杂,但转换之后我们要考虑如何判断两个NFA的等价性,以便单元测试检验NFA是否正确生成?另外也要考虑NFA如何输出为我们可以阅读的方式,例如用文本或者用图来表示。因此,在学习转换其他类型的文法元素之前,我们要先解决上面两个问题。
- 非确定有限状态自动机的构建(二)——将CharVal转换为NFA
- 非确定有限状态自动机的构建(一)——NFA的定义和实现
- 非确定有限状态自动机的构建-NFA的定义和实现
- 自动机,状态机,有限自动机,有限状态机,有限状态自动机,非确定下有限状态自动,确定性有限状态自动机的区别于联系
- 将正则表达式转换为有限状态自动机
- 确定有限状态自动机
- 非确定型有限自动机变换为确定型有限自动机
- 有限自动机NFA-ε到NFA再到DFA的转换
- 确定的有限自动机VS非确定的有限自动机(DFANFA)
- 用java开发编译器之:Thompson构造,将正则表达式转换为有限状态自动机
- NFA 有限自动机原理
- 确定有限状态自动机(维基百科)
- 确定有限自动机(DFA)——一个简单的C++词法分析器
- java开发编译器:构建LR语法的有限状态自动机
- 非确定性有限状态自动机理论的开创者
- 二叉树非递归遍历的算法-有限状态自动机
- 正则式到MFA(确定化的有限状态自动机)的自动装换的实现
- 有限状态自动机的应用
- GOOGLE GLOG 日志使用心得
- csapp2e 家庭作业 6.28 6.29
- F7显示物料时带树状菜单
- Top 10 Ways to Promote your Website easily
- LINQ之路 5:LINQ查询表达式
- 非确定有限状态自动机的构建(二)——将CharVal转换为NFA
- C#与C++,Windows平台软件开发面临的选择
- UNIX环境高级编程——进程管理和通信(总结)
- linux字符设备驱动
- hdu1022 Train Problem I
- LINQ之路 6:延迟执行(Deferred Execution)
- 新的开始
- 网站漏洞检测
- 2333:火爆的一乐拉面