JavaScript LL1文法 实现

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>JavaScriptLL1文法</title>
</head>
<script>
    biaozhi = [];
    shuzi = [];
    zifuchangliang = [];
    _stage = null;//算数表达式1,bool语句2,
    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 = [];
    _LL1State = 0;
    wrong = 0;
    stop = null;
    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
        }
    }();
    var LL1State = function () {
      var state = {
          //program识别成功
          state0:function () {
              _LL1State = 0;
          },
          //标识符,数字状态
          state1:function (value) {
              if(_LL1State === 2||_LL1State === 13||_LL1State === 12||_LL1State === 11||_LL1State === 0||_LL1State === 6||_LL1State === 3||_LL1State === 5||_LL1State === 7||_LL1State === 8||_LL1State === 9||_LL1State === 10){
                  _LL1State = 1;
              }else{
                  wrong++;
                  console.log(value+'错误,不能加入')
              }
          },
          //;识别成功
          state2:function (value) {
              if(_LL1State === 1||_LL1State === 5){
                  _LL1State = 2;
                  _stage = null;
                  stop = null
              }else{
                  wrong++;
                  console.log(value+'错误,不能加入')
              }
          },
          //var识别
          state3:function (value) {
              if(_LL1State === 2){
                  _LL1State = 3;
              }else{
                  wrong++;
                  console.log(value+'错误,不能加入')
              }
          },
          //:识别
          state4:function (value) {
              if(_LL1State === 1){
                  _LL1State = 4;
              }else{
                  wrong++;
                  console.log(value+'错误,不能加入')
              }
          },
          //bool int识别
          state5:function (value) {
              if(_LL1State === 4){
                  _LL1State = 5;
              }else{
                  wrong++;
                  console.log(value+'错误,不能加入')
              }
          },
          //begin识别
          state6:function (value) {
              if(_LL1State === 2){
                  _LL1State = 6;
                  stop = null
              }else{
                  wrong++;
                  console.log(value+'错误,不能加入;')
              }
          },
          //:=识别
          state7:function (value) {
              if(_LL1State === 1 &&_stage !== 1){
                  _stage = 1;
                  _LL1State = 7;
              }else{
                  wrong++;
                  console.log(value+'错误,不能加入')
              }
          },
          //+ - 识别
          state8:function (value) {
              if(_LL1State === 1 &&_stage === 1&&stop === null){
                  _LL1State = 8;
                  stop = 1;
              }else{
                  wrong++;
                  console.log(value+'错误,不能加入')
              }
          },
          //while识别
          state9:function (value) {
              if((_LL1State === 2||_LL1State === 11||_LL1State === 6|| _LL1State === 12)&& _stage === null){
                  _LL1State = 9;
                  _stage = 2;
                  stop = null
              }else{
                  wrong++;
                  console.log(value+'错误,不能加入')
              }
          },
          //<识别
          state10:function (value) {
              if(_LL1State === 1 && _stage === 2&&stop === null ){
                  _LL1State = 10;
                  stop = 1;
              }else{
                  wrong++;
                  console.log(value+'错误,不能加入')
              }
          },
          //do识别
          state11:function (value) {
              if(_LL1State === 1 && _stage === 2 ){
                  _LL1State = 11;
                  _stage = null;
                  stop = null
              }else{
                  wrong++;
                  console.log(value+'错误,不能加入')
              }
          },
          //repeat识别
          state12:function (value) {
              if((_LL1State === 2||_LL1State === 11||_LL1State === 6|| _LL1State === 12)&& _stage === null){
                  _LL1State = 12;
                  _stage = null;
                  stop = null
              }else{
                  wrong++;
                  console.log(value+'错误,不能加入')
              }
          },
          //until识别
          state13:function (value) {
              if(_LL1State === 1){
                  _LL1State = 13;
                  _stage = 2;
                  stop = null
              }else{
                  wrong++;
                  console.log(value+'错误,不能加入')
              }
          },
          //end识别
          state14:function (value) {
              if(_LL1State === 2||_LL1State === 1){
                  _LL1State = 14;
              }else{
                  wrong++;
                  console.log(value+'错误,不能加入')
              }
          },
          //.识别
          state15:function (value) {
              if(_LL1State === 14){
                  _LL1State = 15;
              }else{
                  wrong++;
                  console.log(value+'错误,不能加入')
              }
          },
      };
      function showState(value) {
          var num = 0;
          if(value === 'program'){
              num = 0;
          }else if(biaozhi.some(function (item) {return item === value}) && _stage === null){
              num = 1;
          }else if((biaozhi.some(function (item) {return item === value})||shuzi.some(function (item) {return item === value})) && _stage !== null){
              num = 1;
          }else if(value === ';'){
              num = 2;
          }else if(value === 'var'){
              num = 3;
          }else if(value === ':'){
              num = 4;
          }else if(value === 'bool'||value === 'integer'){
              num = 5;
          }else if(value === 'begin'){
              num = 6;
          }else if(value === ':='){
              num = 7;
          }else if(value === '+'||value === '-'){
              num = 8;
          }else if(value === 'while'){
              num = 9;
          }else if(value === '<'){
              num = 10;
          }else if(value === 'do'){
              num = 11;
          }else if(value === 'repeat'){
              num = 12;
          }else if(value === 'until'){
              num = 13;
          }else if(value === 'end'){
              num = 14;
          }else if(value === '.'){
              num = 15;
          }
          state['state'+num]&&state['state'+num](value)
      }
      return {
          show:showState
      }
    }();
    function clickMe() {
        var a = document.getElementById('test').value + ' ';
        for (var i = 0; i < a.length; i++) {
            State.show(a.charAt(i));
        }
//        console.log('最终状态为'+_state);
//        console.log(MEMORAY);
        var json = {};
        var number = 1;
        MEMORAY.forEach(function (item) {
                   if(STATIC[item]){
//                       console.log('序号'+index+'('+STATIC[item]+',-)')
                   }else if(isNaN(Number(item)) === false){
                       if(!json[item]){
                           json[item] = number++;
                           shuzi.push(item)
                       }
//                       console.log('序号'+index+'(37,'+ json[item] +')')
                   }else if(!item.indexOf('\'')){
                       if(!json[item]){
                           json[item] = number++;
                           zifuchangliang.push(item)
                       }
//                       console.log('序号'+index+'(38,'+ json[item] +')')
                   }else{
                       if(!json[item]){
                           json[item] = number++;
                           biaozhi.push(item)
                       }
//                       console.log('序号'+index+'(36,'+ json[item] +')')
                   }
                });
        MEMORAY.splice(0,MEMORAY.indexOf('program'));
//        console.log(MEMORAY);
        MEMORAY.forEach(function (item) {
            LL1State.show(item)
        });
        if(wrong>0){
            console.log('LL1最终状态为'+_LL1State+',不正常');
        }else{
            console.log('正常');
        }
    }
</script>
<body>
<div id="container">
    <label>
        <textarea rows="30" cols="50" id="test"></textarea><br><br>
        <button onclick="clickMe()">每次记得刷新</button>
    </label>
</div>
</body>
</html>

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

推荐阅读更多精彩内容