美文网首页
JavaScript 有穷自动机实现

JavaScript 有穷自动机实现

作者: moonburn | 来源:发表于2017-05-23 22:13 被阅读0次

有穷自动机实现##

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>JavaScript有穷自动机</title>
</head>
<script>
    STATIC = {
        "and":"1","array":"2","begin":"3","bool":"4",
        "call":"5","case":"6","char":"7","constant":"8",
        "dim":"9","do":"10","else":"11","end":"12",
        "false":"13","for":"14","if":"15","input":"16",
        "integer":"17","not":"18","of":"19","or":"20","output":"21",
        "procedure":"22","program":"23","read":"24","real":"25","repeat":"26",
        "set":"27","stop":"28","then":"29","to":"30","true":"31","until":"32",
        "var":"33","while":"34","write":"35","(":"39",")":"40","*":"41","+":"43",
        ",":"44","-":"45",".":"46","..":"47","/":"48",":":"50",":=":"51",";":"52",
        "<":"53","<=":"54","<>":"55","=":"56",">":"57",">=":"58","[":"59","]":"60"
    };


    _MEMORAY = [];
    _SYMBLE = [];
    _state = 0;
    MEMORAY = [];

    var State = function () {
        var state = {
            state0: function () {
                if (_MEMORAY.length > 0) {
                    var string = '';
                    _MEMORAY.forEach(function (item) {
                        string = string + item
                    });
                    MEMORAY.push(string);
                }
                if (_SYMBLE.length > 0) {
                    var symble = '';
                    _SYMBLE.forEach(function (item) {
                        symble = symble + item
                    });
                    MEMORAY.push(symble);
                }
                _state = 0;
                _SYMBLE = [];
                _MEMORAY = [];
            },
            state1: function (value) {
                if (_state === 0 || _state === 1) {
                    _state = 1;
                    _MEMORAY.push(value)
                } else {
                    console.log('出错');
                    return new Error('出错')
                }
            },
            state3: function (value) {
                if (_state === 0) {
                    _state = 3;
                    MEMORAY.push(value)
                } else {
                    console.log('出错');
                    return new Error('出错')
                }
            },
            state5: function (value) {
                if(_state === 0){
                    _state = 5;
                    _SYMBLE.push(value)
                }else{
                    console.log('出错');
                    return new Error('出错')
                }
            },
            state6: function () {
            },
            state7: function (value) {
                if(_state === 0){
                    _state = 7;
                    _SYMBLE.push(value)
                }else{
                    console.log('出错');
                    return new Error('出错')
                }
            },
            state8: function (value) {
                if(_state === 0){
                    _state = 8;
                    _SYMBLE.push(value)
                }else{
                    console.log('出错');
                    return new Error('出错')
                }
            },
            state9: function (value) {
                if(_state === 0){
                    _state = 9;
                    _SYMBLE.push(value)
                }else{
                    console.log('出错');
                    return new Error('出错')
                }
            },
            state10: function (value) {
                if(_state === 0){
                    _state = 10;
                    _SYMBLE.push(value)
                }else{
                    console.log('出错');
                    return new Error('出错')
                }
            },
            state11: function (value) {
                if(_state === 0){
                    _state = 11;
                    _SYMBLE.push(value)
                }else{
                    console.log('出错');
                    return new Error('出错')
                }
            },
            state14: function () {
                if(_state === 5){
                    _state = 14;
                    _SYMBLE =[]
                }else{
                    console.log('出错');
                    return new Error('出错')
                }
            },
            state15: function (value) {
                if(_state === 7){
                    _state = 15;
                    _SYMBLE.push(value)
                }else{
                    console.log('出错');
                    return new Error('出错')
                }
            },
            state16: function (value) {
                if(_state === 7){
                    _state = 16;
                    _SYMBLE.push(value)
                }else{
                    console.log('出错');
                    return new Error('出错')
                }
            },
            state17: function (value) {
                if(_state === 8){
                    _state = 17;
                    _SYMBLE.push(value)
                }else{
                    console.log('出错');
                    return new Error('出错')
                }
            },
            state18: function (value) {
                if(_state === 9){
                    _state = 18;
                    _SYMBLE.push(value)
                }else{
                    console.log('出错');
                    return new Error('出错')
                }
            },
            state19: function (value) {
                if(_state === 11){
                    _state = 19;
                    _SYMBLE.push(value)
                }else{
                    console.log('出错');
                    return new Error('出错')
                }
            },
            state20: function () {
                if(_state === 14){
                    _state = 20;
                }else{
                    console.log('出错');
                    return new Error('出错')
                }
            },
            state21: function () {
                if(_state === 20){
                    _state = 21;
                }else{
                    console.log('出错');
                    return new Error('出错')
                }
            },
            state22: function () {
                if(_state === 10){
                    _state = 22;
                }else{
                    console.log('出错');
                    return new Error('出错')
                }
            },
            state500: function () {
                console.log('出错');
                return new Error('出错')
            },
        };

        function showState(value) {
            var num = 0;
            if(_state === 3||_state === 4||_state === 6 || _state === 19
                    ||_state === 22 ||_state === 18 || _state === 17
                    ||_state === 16||_state === 15||_state === 21){
                _state = 0;
                num = 0;
                state['state' + num] && state['state' + num](value);
                return showState(value)
            }
            if(_state === 10 && value.charCodeAt(0) !== 46){
                _state = 0;
                num = 0;
                state['state' + num] && state['state' + num](value);
                return showState(value)
            }
            if(_state === 9 && value.charCodeAt(0) !== 61){
                _state = 0;
                num = 0;
                state['state' + num] && state['state' + num](value);
                return showState(value)
            }
            if(_state === 8 && value.charCodeAt(0) !== 61){
                _state = 0;
                num = 0;
                state['state' + num] && state['state' + num](value);
                return showState(value)
            }
            if(_state === 7 && value.charCodeAt(0) !== 61){
                _state = 0;
                num = 0;
                state['state' + num] && state['state' + num](value);
                return showState(value)
            }
            if(_state === 7 && value.charCodeAt(0) !== 62){
                _state = 0;
                num = 0;
                state['state' + num] && state['state' + num](value);
                return showState(value)
            }
            if(_state === 5 && value.charCodeAt(0) !== 42){
                _state = 0;
                num = 0;
                state['state' + num] && state['state' + num](value);
                return showState(value)
            }
            if (_state === 14 && value.charCodeAt(0) !== 42) {return ''}
            if (_state === 20 && value.charCodeAt(0) !== 47) {
                _state = 14;
                return ''
            }
            if(_state === 1 && (new RegExp(/^[a-zA-Z]+$/)).test(value)=== false&&(new RegExp("^[0-9]*$")).test(value)=== false){
                _state = 0;
                num = 0;
                state['state' + num] && state['state' + num](value);
                return showState(value)
            }
            if (_state === 11 && value.charCodeAt(0) !== 39) {
                _SYMBLE.push(value);
                return ''
            }
            //空格回车初始化
            if ((new RegExp(/\s+/g)).test(value) || (new RegExp(/[\r\n]/g)).test(value)) {
                    num = 0;

            }
            //字母,数字,跳到1
            else if ((new RegExp(/^[a-zA-Z]+$/)).test(value) ||(new RegExp("^[0-9]*$")).test(value)) {
                    num = 1;
            }
            //一些普通单界符,跳到3
            else if (
                    value.charCodeAt(0) === 43 ||
                    value.charCodeAt(0) === 45 ||
                    value.charCodeAt(0) === 40 ||
                    value.charCodeAt(0) === 41 ||
                    value.charCodeAt(0) === 91 ||
                    value.charCodeAt(0) === 93 ||
                    value.charCodeAt(0) === 59 ||
                    value.charCodeAt(0) === 44) {num = 3;}
            //  *符号,如果是0,跳3,如果是5,跳14
            else if (
                    value.charCodeAt(0) === 42) {
                if(_state === 0){
                    num = 3;
                }else if(_state === 5){
                    num = 14;
                }else if(_state === 14){
                    num = 20
                }
            }
            //  /符号,如果是0,跳5,如果是20,跳21
            else if (
                    value.charCodeAt(0) === 47) {
                if(_state === 0){
                    num = 5;
                }else if(_state === 20){
                    num = 21;
                }
            }
            // =符号,如果是0,跳3,如果是7,跳15,如果是8,跳17,如果是9,跳18
            else if (
                    value.charCodeAt(0) === 61) {
                if(_state === 0){
                    num = 3;
                }else if(_state === 7){
                    num = 15;
                }else if(_state === 8){
                    num = 17;
                }else if(_state === 9){
                    num = 18;
                }
            }
            //  < 符号,如果是0,跳7
            else if (value.charCodeAt(0) === 60) {num = 7;}
            //  > 符号,如果是0,跳8,如果是7,跳16
            else if (value.charCodeAt(0) === 62) {
                if(_state === 0){
                    num = 8;
                }else if(_state === 7){
                    num = 16;
                }

            }
            //  : 符号,如果是0,跳9
            else if (value.charCodeAt(0) === 58) {num = 9;}
            //  . 符号,如果是0,跳10,如果是10,跳22
            else if (value.charCodeAt(0) === 46) {
                if(_state === 0){
                    num = 10;
                }else if(_state === 10){
                    num = 22;
                }
            }
            //  ' 符号,如果是0,跳11,如果是11,跳19
            else if (value.charCodeAt(0) === 39) {
                if(_state === 0){
                    num = 11;
                }else if(_state === 11){
                    num = 19;
                }
            }else{
                num = 500
            }
            state['state' + num] && state['state' + num](value)
        }

        return {
            show: showState
        }
    }();


    function clickMe() {
        var number = 1;
        var a = document.getElementById('test').value + ' ';
        for (var i = 0; i < a.length; i++) {
//            var state = new State(a.charAt(i));
            State.show(a.charAt(i));
        }
        var json = {};
        console.log('最终状态为'+_state);
        console.log(MEMORAY);
        MEMORAY.forEach(
                function (item,index) {
                   if(STATIC[item]){
                       console.log('序号'+index+'('+STATIC[item]+',-)')
                   }else if(isNaN(Number(item)) === false){
                       if(!json[item]){
                           json[item] = number++;
                       }
                       console.log('序号'+index+'(37,'+ json[item] +')')
                   }else if(!item.indexOf('\'')){
                       if(!json[item]){
                           json[item] = number++;
                       }
                       console.log('序号'+index+'(38,'+ json[item] +')')
                   }else{
                       if(!json[item]){
                           json[item] = number++;
                       }
                       console.log('序号'+index+'(36,'+ json[item] +')')
                   }
                }
        );
    }
</script>
<body>
<div id="container">
    <label>
        <textarea rows="30" cols="50" id="test"></textarea>
        <button onclick="clickMe()">每次记得刷新</button>
    </label>
</div>
</body>
</html>

相关文章

  • JavaScript 有穷自动机实现

    有穷自动机实现##

  • 编译器笔记6-词法分析-有穷自动机

    一 有穷自动机 (Finite Automata) 简介 有穷自动机(Finite Automata,FA)由两位...

  • NFA到DFA的转换及DFA的简化

    还不太了解有穷自动机或是NFA的同学可以先看我的上一篇文章:正则到NFA的转换 确定型有穷自动机 确定型有穷自动机...

  • 第二章第3节 有穷自动机

    有穷自动机 有穷自动机(Finite Automata ,FA) 由两位神经物理学家 MeCuloch 和 Pit...

  • python实现DFA模拟程序

    DFA(确定的有穷自动机) 一个确定的有穷自动机M是一个五元组: K是一个有穷集,它的每个元素称为一个状态。 ∑是...

  • 有穷自动机

    前言 计算理论要面对的第一个问题是:什么是计算机?现实的计算机相当复杂,很难直接为它们建立一个容易处理的数学理论,...

  • 第八章 匹配原理

    8.1 有穷自动机 正则表达式能迅速进行复杂处理的秘密就在于,它采用了一种特殊的理论模型:有穷自动机(finite...

  • 丘奇-图灵论题

    计算机通用模型 4.1 图灵机 图灵机与有穷自动机相似,但图灵机有一个无限存储。 有穷自动机与图灵机之间的区别: ...

  • 泵引理

    前言 要了解有穷自动机的能力,就必须要了解它们的局限性。我们知道能被一台有穷自动机识别的语言被称为正则语言,但在很...

  • 正则到NFA的转换

    有穷自动机 作用:将输入的序列转换成一个状态图,方便之后的处理。通常被用在词法分析器中。1)有穷自动机是一个识别器...

网友评论

      本文标题:JavaScript 有穷自动机实现

      本文链接:https://www.haomeiwen.com/subject/sqogxxtx.html