zoukankan      html  css  js  c++  java
  • 非确定有限状态自动机的构建(二)——将CharVal转换为NFA

    保留版权,转载注明出处:潘军彪的个人博客(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如何输出为我们可以阅读的方式,例如用文本或者用图来表示。因此,在学习转换其他类型的文法元素之前,我们要先解决上面两个问题。

  • 相关阅读:
    积性函数大全(欧拉函数、莫比乌斯反演、杜教筛……)
    Codeforces 1427 G.One Billion Shades of Grey
    Codeforces Global Round 11 A-F题解
    一般难度模板复习
    (补充)证明线性递推相关的Hamilton-Cayley定理
    [ZJOI2018]树
    [ICPC-Beijing 2006]狼抓兔子
    P4869 albus就是要第一个出场
    浅谈算法——线性基
    [COCI2017-2018#1] Deda
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3201087.html
Copyright © 2011-2022 走看看