JavaScript 有穷自动机实现

有穷自动机实现##

<!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>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,052评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,267评论 3 397
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,518评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,457评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,474评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,143评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,728评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,650评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,184评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,269评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,415评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,083评论 5 348
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,775评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,257评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,389评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,777评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,419评论 2 359

推荐阅读更多精彩内容

  • “发动机自动启停”这项配置已经越来越多的普及到现在的汽车上了,但是针对这个功能许多人褒贬不一,到底有没有用?到底伤...
    鑫谈甚欢阅读 624评论 0 0
  • 理论上可以证明,每一个正则集合可以由一个状态数最小的DFA识别,且这个DFA是唯一的。本博客将介绍如何把一个DFA...
    Shiyi001阅读 8,506评论 0 4
  • 清晨,背起行囊踏上蔚蓝的海域,心旷神怡,好不快活!这是一种企盼,期待那个让我向往已久的魅惑之地。海之蓝,让我...
    夏荷梦阅读 408评论 1 3
  • 今夜的凉风 有点慵懒的模样 灯影里 楼层与幽暗重叠 重叠出长长的寂寞 我想把心情写成诗 手中的笔拿起又放下 你若不...
    兰馨若冰阅读 262评论 34 33
  • 在宿舍大家常感叹的一句话就是,“哎,一天就过去···哎,一个星期又过去了···哎,一个月又过去了”,不知不觉...
    小风竹阅读 348评论 0 0