├── .coveralls.yml ├── .gitignore ├── README.md ├── bin └── start ├── coverage ├── coverage.json └── lcov.info ├── index.js ├── package.json ├── src ├── compiler │ ├── generator.js │ ├── parser.js │ ├── tokenizer.js │ ├── transformer.js │ └── type │ │ ├── syntax.js │ │ └── token.js └── index.js └── test ├── parser.test.js └── tokenizer.test.js /.coveralls.yml: -------------------------------------------------------------------------------- 1 | # travis-pro 2 | service_name: continue-assign-parser 3 | repo_token: 7a4ADpF7hOTaF7HZdtMz22uTmGU6mOuLS 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug* 3 | ceshi* 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # js连等语法编译器 2 | 背景: 3 | 在javascript语法中,假如我想为三个变量赋值,我通常需要这样写 4 | ``` 5 | var a, b, c = 1000 6 | a = b = c 7 | ``` 8 | 或者这样写 9 | ``` 10 | var a = 1000, b = 1000, c = 1000 11 | ``` 12 | 可以看出来,不管我们采用哪种方式赋值,都会重复敲入一些代码 13 | * 第一种方式,我们多敲入了三个变量a、b、c。 14 | * 第二种方式,我们多敲入了两次变量值 1000。 15 | 上面我们命名的变量不是很复杂,仅仅作为演示用的单字符变量名。但是实际开发环境中,我们往往要为变量定义语义化的名字。 16 | ``` 17 | var baseSalary, middleSalary, highSalary = 1000 18 | baseSalary = middleSalary = highSalary 19 | ``` 20 | 这次我们要多敲入很多字符了,虽然可以用拷贝粘贴的方式,但是仍然是有一定的工作量。 21 | 也许你觉得没有什么,不就是多敲一些字符吗?这么懒吗! 22 | 懒到是其次,我觉得这可以作为一个问题进行思考,能不能创造一种新的语法,能让我们更简单地为多个变量赋值呢? 23 | 经过一番思考,我想出了下面这种方式,上面两种情况我用下面的代码来表示 24 | ``` 25 | var a b c = 1000 26 | 27 | var baseSalary middleSalary HighSalary = 1000 28 | ``` 29 | 是不是简洁了很多?这就是我想要的语法,在此命名为**连等语法**。 30 | 31 | 但javascript语法不支持这种方式,所以我必须要实现一个编译器,来转译这种语法。 32 | 33 | >注意:为了简便起见,我为该语法做了一些限制,如下: 34 | * 只允许用var、let 关键字赋值。 35 | * 只允许为变量赋予以下几种类型的值 36 | * 字符串字面量 37 | * 数字字面量 38 | * null字面量 39 | * bool字面量 40 | * 如果超出了以上规则,则不认为是有效的连等语法,编译器不会对它进行编译。 41 | 42 | ## 使用方式 43 | 这个库有两种使用方式,一种是命令行方式,一种是webpack-loader的方式。 44 | #### 命令行方式 45 | 首先,我们先全局安装continue-assign-parser,安装完暴露编译命令**aparse** 46 | ``` 47 | npm install -g continue-assign-parser 48 | 49 | ``` 50 | 其次,我们用如下两种命令进行编译 51 | 1. 编译文件 52 | ``` 53 | aparse -f 'index.js' 54 | ``` 55 | 编译目录下名为index.js的文件,返回编译好的代码 56 | 57 | 2. 编译字符串 58 | ``` 59 | aparse -s 'let a b c = 1000' 60 | ``` 61 | 62 | 大家也许很好奇编译后的代码是什么形式,拿上面这段代码来说,编译后的代码如下: 63 | ``` 64 | let a, b, c 65 | a = b = c = 1000 66 | ``` 67 | #### webpack-loader的方式 68 | 为了方便大家使用,我专门写了一个webpack-loader,传送门[assign-loader](https://github.com) 69 | 使用方式如下 70 | ``` 71 | npm install -D assign-loader 72 | ``` 73 | 在webpack的配置文件中关于模块加载器这一项,assign-loader一定要配置在js文件编译的第一个阶段。因为大部分js加载器都不支持我们的连等语法,如果我们不在第一步进行转译的话,后续js加载器会报语法错误。配置示例如下 74 | ``` 75 | module:{ 76 | rules:[ 77 | { 78 | test: /\.js$/, 79 | use: ['babel-loader'], 80 | exclude: /(node_modules)/ 81 | }, 82 | { 83 | test: /\.(js|vue)$/, 84 | loader: 'eslint-loader', 85 | exclude: /node_modules/, 86 | enforce: 'pre', 87 | options: { 88 | eslint: { 89 | configFile: '.eslintrc' 90 | } 91 | } 92 | }, 93 | { 94 | test: /\.vue$/, 95 | use: [ 96 | { 97 | loader: 'vue-loader', 98 | options: { 99 | postcss: [require('postcss-bem')(),require('postcss-cssnext')()] 100 | } 101 | } 102 | ], 103 | }, 104 | { 105 | test: /\.(jsd|vue|js)$/, 106 | loader: 'assign-loader', 107 | exclude: /node_modules/ 108 | }, 109 | { 110 | //设置对应的资源后缀. 111 | test: /\.(css|scss)$/, 112 | //设置后缀对应的加载器. 113 | loader: ExtractTextPlugin.extract({ 114 | loader: 'css-loader?modules' 115 | }) 116 | } 117 | ] 118 | } 119 | ``` 120 | -------------------------------------------------------------------------------- /bin/start: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env node 2 | "use strict"; 3 | const program = require('commander') 4 | const compile = require('../index') 5 | const fs = require('fs') 6 | const path = require('path') 7 | program 8 | .usage(' [project-name]') 9 | .option('-f, --file ', 'parse file') 10 | .option('-s, --string ', 'parse string') 11 | 12 | 13 | program.parse(process.argv) 14 | let result = '' 15 | if(program.string){ 16 | result = compile(program.string) 17 | } else if(program.file){ 18 | let source = fs.readFileSync(path.resolve(process.cwd(),program.file),"utf-8") 19 | result = compile(source) 20 | } 21 | console.log("------------------start") 22 | console.log(result) 23 | console.log("--------------------end") 24 | -------------------------------------------------------------------------------- /coverage/coverage.json: -------------------------------------------------------------------------------- 1 | {"/Users/fanqi/Documents/mine/lucefer/continue-assign-parser/src/compiler/parser.js":{"path":"/Users/fanqi/Documents/mine/lucefer/continue-assign-parser/src/compiler/parser.js","s":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":1,"14":2,"15":2,"16":2,"17":2,"18":2,"19":2,"20":2,"21":2,"22":4,"23":1,"24":1,"25":2,"26":1,"27":2,"28":1,"29":1,"30":1,"31":1,"32":1,"33":2,"34":2,"35":2,"36":2,"37":2,"38":1,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":0,"46":0,"47":1,"48":2,"49":2,"50":2,"51":1,"52":2,"53":2,"54":0,"55":2,"56":2,"57":2,"58":2,"59":1,"60":4,"61":4,"62":4,"63":7,"64":7,"65":7,"66":7,"67":7,"68":7,"69":4,"70":0,"71":4,"72":1,"73":1,"74":1,"75":1,"76":3,"77":3,"78":4,"79":2,"80":0,"81":2,"82":2,"83":2,"84":4,"85":4,"86":1,"87":1,"88":1,"89":0,"90":1,"91":1,"92":0,"93":0,"94":0,"95":1,"96":1,"97":0,"98":4,"99":0,"100":1,"101":4,"102":0,"103":4,"104":1},"b":{"1":[2,0],"2":[1,3],"3":[1,1],"4":[1,1],"5":[2,2],"6":[2,0],"7":[0,2],"8":[0,2],"9":[2,2],"10":[7,4],"11":[0,4],"12":[1,3],"13":[3,0],"14":[2,2],"15":[4,4],"16":[0,2],"17":[1,3],"18":[4,3],"19":[1,0],"20":[1,1,0,0],"21":[0,1],"22":[0,0],"23":[1,0],"24":[0,4],"25":[4,2],"26":[0,4],"27":[4,0]},"f":{"1":12,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":4,"9":2,"10":4},"fnMap":{"1":{"name":"Node","line":4,"loc":{"start":{"line":4,"column":0},"end":{"line":5,"column":0}}},"2":{"name":"parse","line":10,"loc":{"start":{"line":10,"column":0},"end":{"line":10,"column":23}}},"3":{"name":"parseProgram","line":25,"loc":{"start":{"line":25,"column":0},"end":{"line":25,"column":24}}},"4":{"name":"parseScriptBody","line":52,"loc":{"start":{"line":52,"column":0},"end":{"line":52,"column":27}}},"5":{"name":"parseStatementListItem","line":60,"loc":{"start":{"line":60,"column":0},"end":{"line":60,"column":34}}},"6":{"name":"parseVariableDeclarationList","line":75,"loc":{"start":{"line":75,"column":0},"end":{"line":75,"column":40}}},"7":{"name":"parseVariableDeclaration","line":80,"loc":{"start":{"line":80,"column":0},"end":{"line":80,"column":36}}},"8":{"name":"parseEqualVariableDeclaration","line":94,"loc":{"start":{"line":94,"column":0},"end":{"line":94,"column":43}}},"9":{"name":"(anonymous_9)","line":120,"loc":{"start":{"line":120,"column":24},"end":{"line":120,"column":35}}},"10":{"name":"isPunctuator","line":152,"loc":{"start":{"line":152,"column":0},"end":{"line":152,"column":35}}}},"statementMap":{"1":{"start":{"line":1,"column":0},"end":{"line":1,"column":36}},"2":{"start":{"line":2,"column":0},"end":{"line":2,"column":39}},"3":{"start":{"line":4,"column":0},"end":{"line":7,"column":1}},"4":{"start":{"line":8,"column":0},"end":{"line":8,"column":39}},"5":{"start":{"line":10,"column":0},"end":{"line":23,"column":1}},"6":{"start":{"line":11,"column":4},"end":{"line":11,"column":18}},"7":{"start":{"line":12,"column":4},"end":{"line":12,"column":23}},"8":{"start":{"line":13,"column":4},"end":{"line":13,"column":27}},"9":{"start":{"line":14,"column":4},"end":{"line":14,"column":11}},"10":{"start":{"line":16,"column":4},"end":{"line":21,"column":5}},"11":{"start":{"line":17,"column":6},"end":{"line":17,"column":26}},"12":{"start":{"line":22,"column":4},"end":{"line":22,"column":14}},"13":{"start":{"line":25,"column":0},"end":{"line":50,"column":1}},"14":{"start":{"line":26,"column":4},"end":{"line":26,"column":18}},"15":{"start":{"line":27,"column":4},"end":{"line":27,"column":21}},"16":{"start":{"line":28,"column":4},"end":{"line":28,"column":28}},"17":{"start":{"line":29,"column":4},"end":{"line":29,"column":24}},"18":{"start":{"line":30,"column":4},"end":{"line":43,"column":5}},"19":{"start":{"line":31,"column":6},"end":{"line":39,"column":7}},"20":{"start":{"line":32,"column":8},"end":{"line":32,"column":34}},"21":{"start":{"line":33,"column":8},"end":{"line":38,"column":9}},"22":{"start":{"line":34,"column":10},"end":{"line":37,"column":11}},"23":{"start":{"line":35,"column":12},"end":{"line":35,"column":27}},"24":{"start":{"line":36,"column":12},"end":{"line":36,"column":17}},"25":{"start":{"line":40,"column":6},"end":{"line":42,"column":7}},"26":{"start":{"line":41,"column":8},"end":{"line":41,"column":13}},"27":{"start":{"line":44,"column":4},"end":{"line":46,"column":5}},"28":{"start":{"line":45,"column":6},"end":{"line":45,"column":17}},"29":{"start":{"line":47,"column":4},"end":{"line":47,"column":30}},"30":{"start":{"line":48,"column":4},"end":{"line":48,"column":20}},"31":{"start":{"line":49,"column":4},"end":{"line":49,"column":15}},"32":{"start":{"line":52,"column":0},"end":{"line":58,"column":1}},"33":{"start":{"line":53,"column":4},"end":{"line":53,"column":28}},"34":{"start":{"line":54,"column":4},"end":{"line":54,"column":35}},"35":{"start":{"line":55,"column":4},"end":{"line":55,"column":40}},"36":{"start":{"line":56,"column":4},"end":{"line":56,"column":39}},"37":{"start":{"line":57,"column":4},"end":{"line":57,"column":15}},"38":{"start":{"line":60,"column":0},"end":{"line":73,"column":1}},"39":{"start":{"line":61,"column":4},"end":{"line":71,"column":5}},"40":{"start":{"line":62,"column":8},"end":{"line":70,"column":9}},"41":{"start":{"line":65,"column":16},"end":{"line":65,"column":46}},"42":{"start":{"line":66,"column":16},"end":{"line":66,"column":57}},"43":{"start":{"line":67,"column":16},"end":{"line":67,"column":32}},"44":{"start":{"line":68,"column":16},"end":{"line":68,"column":27}},"45":{"start":{"line":69,"column":16},"end":{"line":69,"column":21}},"46":{"start":{"line":72,"column":4},"end":{"line":72,"column":15}},"47":{"start":{"line":75,"column":0},"end":{"line":79,"column":1}},"48":{"start":{"line":76,"column":4},"end":{"line":76,"column":9}},"49":{"start":{"line":77,"column":4},"end":{"line":77,"column":35}},"50":{"start":{"line":78,"column":4},"end":{"line":78,"column":37}},"51":{"start":{"line":80,"column":0},"end":{"line":91,"column":1}},"52":{"start":{"line":81,"column":4},"end":{"line":83,"column":20}},"53":{"start":{"line":84,"column":4},"end":{"line":86,"column":5}},"54":{"start":{"line":85,"column":8},"end":{"line":85,"column":19}},"55":{"start":{"line":87,"column":4},"end":{"line":87,"column":42}},"56":{"start":{"line":88,"column":4},"end":{"line":88,"column":42}},"57":{"start":{"line":89,"column":4},"end":{"line":89,"column":23}},"58":{"start":{"line":90,"column":4},"end":{"line":90,"column":15}},"59":{"start":{"line":94,"column":0},"end":{"line":150,"column":1}},"60":{"start":{"line":95,"column":4},"end":{"line":95,"column":32}},"61":{"start":{"line":96,"column":4},"end":{"line":96,"column":37}},"62":{"start":{"line":97,"column":4},"end":{"line":104,"column":5}},"63":{"start":{"line":98,"column":8},"end":{"line":98,"column":25}},"64":{"start":{"line":99,"column":8},"end":{"line":99,"column":37}},"65":{"start":{"line":100,"column":8},"end":{"line":100,"column":41}},"66":{"start":{"line":101,"column":8},"end":{"line":101,"column":34}},"67":{"start":{"line":102,"column":8},"end":{"line":102,"column":26}},"68":{"start":{"line":103,"column":8},"end":{"line":103,"column":41}},"69":{"start":{"line":105,"column":4},"end":{"line":107,"column":5}},"70":{"start":{"line":106,"column":8},"end":{"line":106,"column":14}},"71":{"start":{"line":108,"column":4},"end":{"line":115,"column":5}},"72":{"start":{"line":109,"column":8},"end":{"line":109,"column":30}},"73":{"start":{"line":110,"column":8},"end":{"line":110,"column":57}},"74":{"start":{"line":111,"column":8},"end":{"line":111,"column":32}},"75":{"start":{"line":112,"column":8},"end":{"line":112,"column":26}},"76":{"start":{"line":113,"column":11},"end":{"line":115,"column":5}},"77":{"start":{"line":114,"column":8},"end":{"line":114,"column":21}},"78":{"start":{"line":116,"column":4},"end":{"line":125,"column":5}},"79":{"start":{"line":117,"column":6},"end":{"line":123,"column":7}},"80":{"start":{"line":118,"column":8},"end":{"line":118,"column":34}},"81":{"start":{"line":120,"column":8},"end":{"line":122,"column":10}},"82":{"start":{"line":121,"column":10},"end":{"line":121,"column":28}},"83":{"start":{"line":124,"column":6},"end":{"line":124,"column":39}},"84":{"start":{"line":126,"column":4},"end":{"line":126,"column":17}},"85":{"start":{"line":127,"column":4},"end":{"line":146,"column":5}},"86":{"start":{"line":128,"column":8},"end":{"line":128,"column":41}},"87":{"start":{"line":129,"column":8},"end":{"line":140,"column":9}},"88":{"start":{"line":130,"column":12},"end":{"line":134,"column":13}},"89":{"start":{"line":131,"column":14},"end":{"line":131,"column":52}},"90":{"start":{"line":133,"column":14},"end":{"line":133,"column":40}},"91":{"start":{"line":135,"column":12},"end":{"line":135,"column":45}},"92":{"start":{"line":136,"column":15},"end":{"line":140,"column":9}},"93":{"start":{"line":137,"column":12},"end":{"line":137,"column":45}},"94":{"start":{"line":139,"column":12},"end":{"line":139,"column":37}},"95":{"start":{"line":141,"column":8},"end":{"line":145,"column":9}},"96":{"start":{"line":142,"column":10},"end":{"line":142,"column":31}},"97":{"start":{"line":144,"column":10},"end":{"line":144,"column":26}},"98":{"start":{"line":147,"column":4},"end":{"line":149,"column":5}},"99":{"start":{"line":148,"column":8},"end":{"line":148,"column":41}},"100":{"start":{"line":152,"column":0},"end":{"line":157,"column":1}},"101":{"start":{"line":153,"column":4},"end":{"line":155,"column":5}},"102":{"start":{"line":154,"column":8},"end":{"line":154,"column":19}},"103":{"start":{"line":156,"column":4},"end":{"line":156,"column":16}},"104":{"start":{"line":161,"column":0},"end":{"line":161,"column":22}}},"branchMap":{"1":{"line":31,"type":"if","locations":[{"start":{"line":31,"column":6},"end":{"line":31,"column":6}},{"start":{"line":31,"column":6},"end":{"line":31,"column":6}}]},"2":{"line":34,"type":"if","locations":[{"start":{"line":34,"column":10},"end":{"line":34,"column":10}},{"start":{"line":34,"column":10},"end":{"line":34,"column":10}}]},"3":{"line":40,"type":"if","locations":[{"start":{"line":40,"column":6},"end":{"line":40,"column":6}},{"start":{"line":40,"column":6},"end":{"line":40,"column":6}}]},"4":{"line":44,"type":"if","locations":[{"start":{"line":44,"column":4},"end":{"line":44,"column":4}},{"start":{"line":44,"column":4},"end":{"line":44,"column":4}}]},"5":{"line":56,"type":"binary-expr","locations":[{"start":{"line":56,"column":4},"end":{"line":56,"column":13}},{"start":{"line":56,"column":18},"end":{"line":56,"column":38}}]},"6":{"line":61,"type":"if","locations":[{"start":{"line":61,"column":4},"end":{"line":61,"column":4}},{"start":{"line":61,"column":4},"end":{"line":61,"column":4}}]},"7":{"line":62,"type":"switch","locations":[{"start":{"line":63,"column":12},"end":{"line":63,"column":23}},{"start":{"line":64,"column":12},"end":{"line":69,"column":21}}]},"8":{"line":84,"type":"if","locations":[{"start":{"line":84,"column":4},"end":{"line":84,"column":4}},{"start":{"line":84,"column":4},"end":{"line":84,"column":4}}]},"9":{"line":84,"type":"binary-expr","locations":[{"start":{"line":84,"column":7},"end":{"line":84,"column":24}},{"start":{"line":84,"column":28},"end":{"line":84,"column":45}}]},"10":{"line":101,"type":"binary-expr","locations":[{"start":{"line":101,"column":8},"end":{"line":101,"column":16}},{"start":{"line":101,"column":21},"end":{"line":101,"column":33}}]},"11":{"line":105,"type":"if","locations":[{"start":{"line":105,"column":4},"end":{"line":105,"column":4}},{"start":{"line":105,"column":4},"end":{"line":105,"column":4}}]},"12":{"line":108,"type":"if","locations":[{"start":{"line":108,"column":4},"end":{"line":108,"column":4}},{"start":{"line":108,"column":4},"end":{"line":108,"column":4}}]},"13":{"line":113,"type":"if","locations":[{"start":{"line":113,"column":11},"end":{"line":113,"column":11}},{"start":{"line":113,"column":11},"end":{"line":113,"column":11}}]},"14":{"line":116,"type":"if","locations":[{"start":{"line":116,"column":4},"end":{"line":116,"column":4}},{"start":{"line":116,"column":4},"end":{"line":116,"column":4}}]},"15":{"line":116,"type":"binary-expr","locations":[{"start":{"line":116,"column":7},"end":{"line":116,"column":20}},{"start":{"line":116,"column":24},"end":{"line":116,"column":51}}]},"16":{"line":117,"type":"if","locations":[{"start":{"line":117,"column":6},"end":{"line":117,"column":6}},{"start":{"line":117,"column":6},"end":{"line":117,"column":6}}]},"17":{"line":127,"type":"if","locations":[{"start":{"line":127,"column":4},"end":{"line":127,"column":4}},{"start":{"line":127,"column":4},"end":{"line":127,"column":4}}]},"18":{"line":127,"type":"binary-expr","locations":[{"start":{"line":127,"column":7},"end":{"line":127,"column":20}},{"start":{"line":127,"column":24},"end":{"line":127,"column":51}}]},"19":{"line":129,"type":"if","locations":[{"start":{"line":129,"column":8},"end":{"line":129,"column":8}},{"start":{"line":129,"column":8},"end":{"line":129,"column":8}}]},"20":{"line":129,"type":"binary-expr","locations":[{"start":{"line":129,"column":12},"end":{"line":129,"column":54}},{"start":{"line":129,"column":58},"end":{"line":129,"column":100}},{"start":{"line":129,"column":104},"end":{"line":129,"column":146}},{"start":{"line":129,"column":150},"end":{"line":129,"column":189}}]},"21":{"line":130,"type":"if","locations":[{"start":{"line":130,"column":12},"end":{"line":130,"column":12}},{"start":{"line":130,"column":12},"end":{"line":130,"column":12}}]},"22":{"line":136,"type":"if","locations":[{"start":{"line":136,"column":15},"end":{"line":136,"column":15}},{"start":{"line":136,"column":15},"end":{"line":136,"column":15}}]},"23":{"line":141,"type":"if","locations":[{"start":{"line":141,"column":8},"end":{"line":141,"column":8}},{"start":{"line":141,"column":8},"end":{"line":141,"column":8}}]},"24":{"line":147,"type":"if","locations":[{"start":{"line":147,"column":4},"end":{"line":147,"column":4}},{"start":{"line":147,"column":4},"end":{"line":147,"column":4}}]},"25":{"line":147,"type":"binary-expr","locations":[{"start":{"line":147,"column":7},"end":{"line":147,"column":20}},{"start":{"line":147,"column":24},"end":{"line":147,"column":51}}]},"26":{"line":153,"type":"if","locations":[{"start":{"line":153,"column":4},"end":{"line":153,"column":4}},{"start":{"line":153,"column":4},"end":{"line":153,"column":4}}]},"27":{"line":153,"type":"binary-expr","locations":[{"start":{"line":153,"column":7},"end":{"line":153,"column":45}},{"start":{"line":153,"column":49},"end":{"line":153,"column":78}}]}}},"/Users/fanqi/Documents/mine/lucefer/continue-assign-parser/src/compiler/type/token.js":{"path":"/Users/fanqi/Documents/mine/lucefer/continue-assign-parser/src/compiler/type/token.js","s":{"1":1,"2":1},"b":{},"f":{},"fnMap":{},"statementMap":{"1":{"start":{"line":1,"column":0},"end":{"line":11,"column":1}},"2":{"start":{"line":12,"column":0},"end":{"line":12,"column":26}}},"branchMap":{}},"/Users/fanqi/Documents/mine/lucefer/continue-assign-parser/src/compiler/type/syntax.js":{"path":"/Users/fanqi/Documents/mine/lucefer/continue-assign-parser/src/compiler/type/syntax.js","s":{"1":1,"2":1},"b":{},"f":{},"fnMap":{},"statementMap":{"1":{"start":{"line":1,"column":0},"end":{"line":13,"column":1}},"2":{"start":{"line":15,"column":0},"end":{"line":15,"column":23}}},"branchMap":{}},"/Users/fanqi/Documents/mine/lucefer/continue-assign-parser/src/compiler/tokenizer.js":{"path":"/Users/fanqi/Documents/mine/lucefer/continue-assign-parser/src/compiler/tokenizer.js","s":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":64,"11":1,"12":49,"13":1,"14":13,"15":6,"16":4,"17":3,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":1,"25":26,"26":26,"27":26,"28":26,"29":49,"30":49,"31":23,"32":26,"33":26,"34":1,"35":26,"36":26,"37":26,"38":26,"39":13,"40":13,"41":3,"42":10,"43":1,"44":9,"45":1,"46":8,"47":26,"48":1,"49":59,"50":59,"51":0,"52":59,"53":59,"54":26,"55":26,"56":33,"57":11,"58":11,"59":22,"60":3,"61":3,"62":19,"63":0,"64":0,"65":0,"66":19,"67":7,"68":12,"69":1,"70":1,"71":1,"72":3,"73":1,"74":2,"75":1,"76":0,"77":1,"78":1,"79":1,"80":1,"81":3,"82":3,"83":1,"84":2,"85":1,"86":0,"87":1,"88":1,"89":0,"90":1,"91":1,"92":419,"93":1,"94":4,"95":4,"96":4,"97":4,"98":4,"99":4,"100":4,"101":8,"102":8,"103":4,"104":4,"105":4,"106":0,"107":4,"108":1,"109":3,"110":1,"111":4,"112":4,"113":403,"114":403,"115":0,"116":403,"117":0,"118":4,"119":1,"120":7,"121":7,"122":7,"123":0,"124":7,"125":7,"126":7,"127":7,"128":7,"129":7,"130":6,"131":1,"132":1,"133":5,"134":1,"135":1,"136":4,"137":0,"138":4,"139":4,"140":4,"141":1,"142":1,"143":1,"144":1,"145":0,"146":0,"147":0,"148":0,"149":1,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":1,"159":0,"160":1,"161":1,"162":90,"163":90,"164":1,"165":89,"166":1,"167":1,"168":1,"169":3,"170":1,"171":25,"172":1,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":1,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":1,"195":3,"196":3,"197":3,"198":3,"199":3,"200":0,"201":3,"202":13,"203":13,"204":3,"205":3,"206":10,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":10,"227":0,"228":10,"229":3,"230":3,"231":0,"232":1,"233":23,"234":23,"235":23,"236":23,"237":23,"238":11,"239":11,"240":12,"241":12,"242":0,"243":23,"244":23,"245":1,"246":3,"247":3,"248":3,"249":3,"250":3,"251":3,"252":80,"253":80,"254":1,"255":1,"256":1,"257":1,"258":79,"259":20,"260":20,"261":59,"262":3,"263":1},"b":{"1":[64,64,64],"2":[49,49,49,26],"3":[6,4,3,0,0,0,0,0,0],"4":[6,6,6],"5":[4,4,4,4,4],"6":[3,3,3,3,3,3],"7":[0,0,0,0,0,0,0,0],"8":[0,0,0,0,0,0],"9":[0,0,0],"10":[0,0,0],"11":[23,26],"12":[13,13],"13":[3,10],"14":[1,9],"15":[1,8],"16":[9,8],"17":[0,59],"18":[26,33],"19":[11,22],"20":[33,33,33,33],"21":[3,19],"22":[22,22],"23":[0,19],"24":[0,0],"25":[7,12],"26":[1,2],"27":[0,1],"28":[1,2],"29":[3,3],"30":[0,1],"31":[1,0],"32":[0,1],"33":[1,1],"34":[4,0],"35":[4,4],"36":[0,4],"37":[4,0],"38":[1,3],"39":[4,3],"40":[0,403],"41":[403,403],"42":[0,403],"43":[0,7],"44":[7,0],"45":[7,0],"46":[6,1],"47":[1,5],"48":[6,5],"49":[1,4],"50":[5,4],"51":[0,4],"52":[4,4],"53":[4,0],"54":[4,0],"55":[0,1],"56":[0,1],"57":[1,1],"58":[0,0],"59":[0,0],"60":[0,0],"61":[0,0],"62":[0,1],"63":[1,0],"64":[1,89],"65":[90,89,89,89],"66":[0,0],"67":[0,0],"68":[0,0],"69":[0,0],"70":[0,0],"71":[0,0],"72":[0,0],"73":[0,3],"74":[3,3],"75":[3,10],"76":[0,10],"77":[0,0],"78":[0,0],"79":[0,0,0,0,0,0,0,0,0,0,0],"80":[0,0],"81":[0,0],"82":[0,0],"83":[0,0],"84":[0,10],"85":[3,0],"86":[11,12,0],"87":[1,79],"88":[1,0],"89":[1,1],"90":[20,59]},"f":{"1":64,"2":49,"3":13,"4":26,"5":26,"6":59,"7":1,"8":1,"9":419,"10":4,"11":4,"12":7,"13":90,"14":1,"15":3,"16":25,"17":0,"18":0,"19":3,"20":23,"21":3},"fnMap":{"1":{"name":"isIdStart","line":13,"loc":{"start":{"line":13,"column":0},"end":{"line":13,"column":23}}},"2":{"name":"isIdPart","line":18,"loc":{"start":{"line":18,"column":0},"end":{"line":18,"column":22}}},"3":{"name":"isKeyword","line":23,"loc":{"start":{"line":23,"column":0},"end":{"line":23,"column":23}}},"4":{"name":"getId","line":51,"loc":{"start":{"line":51,"column":0},"end":{"line":51,"column":17}}},"5":{"name":"scanId","line":67,"loc":{"start":{"line":67,"column":0},"end":{"line":67,"column":17}}},"6":{"name":"getNextToken","line":88,"loc":{"start":{"line":88,"column":0},"end":{"line":88,"column":23}}},"7":{"name":"scanHexLiteral","line":120,"loc":{"start":{"line":120,"column":0},"end":{"line":120,"column":26}}},"8":{"name":"scanBinaryliteral","line":136,"loc":{"start":{"line":136,"column":0},"end":{"line":136,"column":29}}},"9":{"name":"isOctalDigit","line":163,"loc":{"start":{"line":163,"column":0},"end":{"line":163,"column":26}}},"10":{"name":"scanOctalLiteral","line":167,"loc":{"start":{"line":167,"column":0},"end":{"line":167,"column":28}}},"11":{"name":"isImplicitOctal","line":194,"loc":{"start":{"line":194,"column":0},"end":{"line":194,"column":26}}},"12":{"name":"scanNumberLiteral","line":207,"loc":{"start":{"line":207,"column":0},"end":{"line":207,"column":29}}},"13":{"name":"isLineTerminal","line":268,"loc":{"start":{"line":268,"column":0},"end":{"line":268,"column":28}}},"14":{"name":"throwUnexpectedToken","line":275,"loc":{"start":{"line":275,"column":0},"end":{"line":275,"column":32}}},"15":{"name":"isHexDigit","line":278,"loc":{"start":{"line":278,"column":0},"end":{"line":278,"column":24}}},"16":{"name":"isDecimalDigit","line":281,"loc":{"start":{"line":281,"column":0},"end":{"line":281,"column":28}}},"17":{"name":"scanUnicode","line":284,"loc":{"start":{"line":284,"column":0},"end":{"line":284,"column":23}}},"18":{"name":"scanHexEscaped","line":302,"loc":{"start":{"line":302,"column":0},"end":{"line":302,"column":28}}},"19":{"name":"scanStringLiteral","line":315,"loc":{"start":{"line":315,"column":0},"end":{"line":315,"column":28}}},"20":{"name":"scanPuntuator","line":383,"loc":{"start":{"line":383,"column":0},"end":{"line":383,"column":25}}},"21":{"name":"tokenizer","line":404,"loc":{"start":{"line":404,"column":0},"end":{"line":404,"column":24}}}},"statementMap":{"1":{"start":{"line":1,"column":0},"end":{"line":1,"column":36}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":26}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":56}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":11}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"7":{"start":{"line":9,"column":0},"end":{"line":9,"column":10}},"8":{"start":{"line":10,"column":0},"end":{"line":10,"column":7}},"9":{"start":{"line":13,"column":0},"end":{"line":16,"column":1}},"10":{"start":{"line":14,"column":2},"end":{"line":15,"column":28}},"11":{"start":{"line":18,"column":0},"end":{"line":22,"column":1}},"12":{"start":{"line":19,"column":2},"end":{"line":21,"column":30}},"13":{"start":{"line":23,"column":0},"end":{"line":49,"column":1}},"14":{"start":{"line":24,"column":2},"end":{"line":48,"column":3}},"15":{"start":{"line":26,"column":6},"end":{"line":26,"column":60}},"16":{"start":{"line":28,"column":6},"end":{"line":29,"column":42}},"17":{"start":{"line":31,"column":6},"end":{"line":32,"column":63}},"18":{"start":{"line":34,"column":6},"end":{"line":36,"column":46}},"19":{"start":{"line":38,"column":6},"end":{"line":39,"column":69}},"20":{"start":{"line":41,"column":6},"end":{"line":41,"column":75}},"21":{"start":{"line":43,"column":6},"end":{"line":43,"column":78}},"22":{"start":{"line":45,"column":6},"end":{"line":45,"column":34}},"23":{"start":{"line":47,"column":6},"end":{"line":47,"column":18}},"24":{"start":{"line":51,"column":0},"end":{"line":64,"column":1}},"25":{"start":{"line":52,"column":2},"end":{"line":52,"column":15}},"26":{"start":{"line":53,"column":2},"end":{"line":53,"column":15}},"27":{"start":{"line":54,"column":2},"end":{"line":54,"column":20}},"28":{"start":{"line":55,"column":2},"end":{"line":62,"column":3}},"29":{"start":{"line":56,"column":4},"end":{"line":56,"column":20}},"30":{"start":{"line":57,"column":4},"end":{"line":61,"column":5}},"31":{"start":{"line":58,"column":6},"end":{"line":58,"column":12}},"32":{"start":{"line":60,"column":6},"end":{"line":60,"column":11}},"33":{"start":{"line":63,"column":2},"end":{"line":63,"column":33}},"34":{"start":{"line":67,"column":0},"end":{"line":86,"column":1}},"35":{"start":{"line":68,"column":2},"end":{"line":68,"column":21}},"36":{"start":{"line":69,"column":2},"end":{"line":69,"column":13}},"37":{"start":{"line":70,"column":2},"end":{"line":70,"column":14}},"38":{"start":{"line":71,"column":2},"end":{"line":81,"column":3}},"39":{"start":{"line":72,"column":4},"end":{"line":72,"column":26}},"40":{"start":{"line":73,"column":8},"end":{"line":81,"column":3}},"41":{"start":{"line":74,"column":4},"end":{"line":74,"column":23}},"42":{"start":{"line":75,"column":9},"end":{"line":81,"column":3}},"43":{"start":{"line":76,"column":4},"end":{"line":76,"column":28}},"44":{"start":{"line":77,"column":9},"end":{"line":81,"column":3}},"45":{"start":{"line":78,"column":4},"end":{"line":78,"column":31}},"46":{"start":{"line":80,"column":4},"end":{"line":80,"column":26}},"47":{"start":{"line":82,"column":2},"end":{"line":85,"column":3}},"48":{"start":{"line":88,"column":0},"end":{"line":119,"column":1}},"49":{"start":{"line":89,"column":2},"end":{"line":89,"column":15}},"50":{"start":{"line":90,"column":2},"end":{"line":94,"column":3}},"51":{"start":{"line":91,"column":4},"end":{"line":93,"column":5}},"52":{"start":{"line":95,"column":2},"end":{"line":95,"column":18}},"53":{"start":{"line":96,"column":2},"end":{"line":99,"column":3}},"54":{"start":{"line":97,"column":4},"end":{"line":97,"column":20}},"55":{"start":{"line":98,"column":4},"end":{"line":98,"column":16}},"56":{"start":{"line":101,"column":2},"end":{"line":104,"column":3}},"57":{"start":{"line":102,"column":4},"end":{"line":102,"column":27}},"58":{"start":{"line":103,"column":4},"end":{"line":103,"column":16}},"59":{"start":{"line":105,"column":2},"end":{"line":108,"column":3}},"60":{"start":{"line":106,"column":4},"end":{"line":106,"column":31}},"61":{"start":{"line":107,"column":4},"end":{"line":107,"column":16}},"62":{"start":{"line":109,"column":2},"end":{"line":114,"column":3}},"63":{"start":{"line":110,"column":4},"end":{"line":112,"column":5}},"64":{"start":{"line":111,"column":6},"end":{"line":111,"column":32}},"65":{"start":{"line":113,"column":4},"end":{"line":113,"column":26}},"66":{"start":{"line":115,"column":2},"end":{"line":117,"column":3}},"67":{"start":{"line":116,"column":4},"end":{"line":116,"column":30}},"68":{"start":{"line":118,"column":2},"end":{"line":118,"column":24}},"69":{"start":{"line":120,"column":0},"end":{"line":135,"column":1}},"70":{"start":{"line":121,"column":2},"end":{"line":121,"column":17}},"71":{"start":{"line":122,"column":2},"end":{"line":127,"column":3}},"72":{"start":{"line":123,"column":4},"end":{"line":125,"column":5}},"73":{"start":{"line":124,"column":6},"end":{"line":124,"column":11}},"74":{"start":{"line":126,"column":4},"end":{"line":126,"column":27}},"75":{"start":{"line":128,"column":2},"end":{"line":130,"column":3}},"76":{"start":{"line":129,"column":4},"end":{"line":129,"column":26}},"77":{"start":{"line":131,"column":2},"end":{"line":134,"column":3}},"78":{"start":{"line":136,"column":0},"end":{"line":162,"column":1}},"79":{"start":{"line":137,"column":2},"end":{"line":137,"column":21}},"80":{"start":{"line":139,"column":2},"end":{"line":147,"column":3}},"81":{"start":{"line":140,"column":4},"end":{"line":140,"column":20}},"82":{"start":{"line":141,"column":4},"end":{"line":143,"column":5}},"83":{"start":{"line":142,"column":6},"end":{"line":142,"column":11}},"84":{"start":{"line":145,"column":4},"end":{"line":145,"column":27}},"85":{"start":{"line":149,"column":2},"end":{"line":151,"column":3}},"86":{"start":{"line":150,"column":4},"end":{"line":150,"column":26}},"87":{"start":{"line":152,"column":2},"end":{"line":156,"column":3}},"88":{"start":{"line":153,"column":4},"end":{"line":155,"column":5}},"89":{"start":{"line":154,"column":6},"end":{"line":154,"column":28}},"90":{"start":{"line":157,"column":2},"end":{"line":160,"column":3}},"91":{"start":{"line":163,"column":0},"end":{"line":166,"column":1}},"92":{"start":{"line":165,"column":2},"end":{"line":165,"column":36}},"93":{"start":{"line":167,"column":0},"end":{"line":193,"column":1}},"94":{"start":{"line":168,"column":2},"end":{"line":168,"column":38}},"95":{"start":{"line":169,"column":2},"end":{"line":169,"column":18}},"96":{"start":{"line":170,"column":2},"end":{"line":173,"column":3}},"97":{"start":{"line":171,"column":6},"end":{"line":171,"column":20}},"98":{"start":{"line":172,"column":6},"end":{"line":172,"column":23}},"99":{"start":{"line":174,"column":2},"end":{"line":174,"column":7}},"100":{"start":{"line":175,"column":2},"end":{"line":182,"column":3}},"101":{"start":{"line":176,"column":4},"end":{"line":176,"column":20}},"102":{"start":{"line":177,"column":4},"end":{"line":181,"column":5}},"103":{"start":{"line":178,"column":6},"end":{"line":178,"column":11}},"104":{"start":{"line":180,"column":6},"end":{"line":180,"column":29}},"105":{"start":{"line":183,"column":2},"end":{"line":185,"column":3}},"106":{"start":{"line":184,"column":4},"end":{"line":184,"column":26}},"107":{"start":{"line":186,"column":2},"end":{"line":188,"column":3}},"108":{"start":{"line":187,"column":4},"end":{"line":187,"column":26}},"109":{"start":{"line":189,"column":2},"end":{"line":192,"column":3}},"110":{"start":{"line":194,"column":0},"end":{"line":206,"column":1}},"111":{"start":{"line":195,"column":2},"end":{"line":195,"column":11}},"112":{"start":{"line":196,"column":2},"end":{"line":204,"column":3}},"113":{"start":{"line":197,"column":4},"end":{"line":197,"column":20}},"114":{"start":{"line":198,"column":4},"end":{"line":200,"column":5}},"115":{"start":{"line":199,"column":6},"end":{"line":199,"column":18}},"116":{"start":{"line":201,"column":4},"end":{"line":203,"column":5}},"117":{"start":{"line":202,"column":6},"end":{"line":202,"column":17}},"118":{"start":{"line":205,"column":2},"end":{"line":205,"column":13}},"119":{"start":{"line":207,"column":0},"end":{"line":267,"column":1}},"120":{"start":{"line":208,"column":2},"end":{"line":208,"column":23}},"121":{"start":{"line":209,"column":2},"end":{"line":209,"column":18}},"122":{"start":{"line":210,"column":2},"end":{"line":212,"column":3}},"123":{"start":{"line":211,"column":4},"end":{"line":211,"column":58}},"124":{"start":{"line":213,"column":2},"end":{"line":213,"column":13}},"125":{"start":{"line":214,"column":2},"end":{"line":214,"column":13}},"126":{"start":{"line":215,"column":2},"end":{"line":238,"column":3}},"127":{"start":{"line":216,"column":4},"end":{"line":216,"column":26}},"128":{"start":{"line":217,"column":4},"end":{"line":217,"column":20}},"129":{"start":{"line":218,"column":4},"end":{"line":233,"column":5}},"130":{"start":{"line":219,"column":6},"end":{"line":227,"column":7}},"131":{"start":{"line":220,"column":8},"end":{"line":220,"column":13}},"132":{"start":{"line":221,"column":8},"end":{"line":221,"column":31}},"133":{"start":{"line":222,"column":13},"end":{"line":227,"column":7}},"134":{"start":{"line":223,"column":8},"end":{"line":223,"column":13}},"135":{"start":{"line":224,"column":8},"end":{"line":224,"column":34}},"136":{"start":{"line":225,"column":13},"end":{"line":227,"column":7}},"137":{"start":{"line":226,"column":8},"end":{"line":226,"column":33}},"138":{"start":{"line":228,"column":6},"end":{"line":232,"column":7}},"139":{"start":{"line":229,"column":8},"end":{"line":231,"column":9}},"140":{"start":{"line":230,"column":10},"end":{"line":230,"column":35}},"141":{"start":{"line":234,"column":4},"end":{"line":236,"column":5}},"142":{"start":{"line":235,"column":6},"end":{"line":235,"column":29}},"143":{"start":{"line":237,"column":4},"end":{"line":237,"column":20}},"144":{"start":{"line":239,"column":2},"end":{"line":245,"column":3}},"145":{"start":{"line":240,"column":4},"end":{"line":240,"column":28}},"146":{"start":{"line":241,"column":12},"end":{"line":243,"column":13}},"147":{"start":{"line":242,"column":16},"end":{"line":242,"column":39}},"148":{"start":{"line":244,"column":12},"end":{"line":244,"column":28}},"149":{"start":{"line":246,"column":2},"end":{"line":259,"column":3}},"150":{"start":{"line":247,"column":4},"end":{"line":247,"column":27}},"151":{"start":{"line":248,"column":4},"end":{"line":248,"column":20}},"152":{"start":{"line":249,"column":4},"end":{"line":251,"column":5}},"153":{"start":{"line":250,"column":6},"end":{"line":250,"column":29}},"154":{"start":{"line":252,"column":4},"end":{"line":258,"column":5}},"155":{"start":{"line":253,"column":6},"end":{"line":255,"column":7}},"156":{"start":{"line":254,"column":8},"end":{"line":254,"column":31}},"157":{"start":{"line":257,"column":6},"end":{"line":257,"column":28}},"158":{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},"159":{"start":{"line":261,"column":4},"end":{"line":261,"column":26}},"160":{"start":{"line":263,"column":2},"end":{"line":266,"column":3}},"161":{"start":{"line":268,"column":0},"end":{"line":274,"column":1}},"162":{"start":{"line":269,"column":2},"end":{"line":269,"column":29}},"163":{"start":{"line":270,"column":2},"end":{"line":272,"column":3}},"164":{"start":{"line":271,"column":4},"end":{"line":271,"column":15}},"165":{"start":{"line":273,"column":2},"end":{"line":273,"column":14}},"166":{"start":{"line":275,"column":0},"end":{"line":277,"column":1}},"167":{"start":{"line":276,"column":2},"end":{"line":276,"column":43}},"168":{"start":{"line":278,"column":0},"end":{"line":280,"column":1}},"169":{"start":{"line":279,"column":2},"end":{"line":279,"column":30}},"170":{"start":{"line":281,"column":0},"end":{"line":283,"column":1}},"171":{"start":{"line":282,"column":2},"end":{"line":282,"column":27}},"172":{"start":{"line":284,"column":0},"end":{"line":301,"column":1}},"173":{"start":{"line":285,"column":2},"end":{"line":285,"column":18}},"174":{"start":{"line":286,"column":2},"end":{"line":286,"column":18}},"175":{"start":{"line":287,"column":2},"end":{"line":289,"column":3}},"176":{"start":{"line":288,"column":4},"end":{"line":288,"column":26}},"177":{"start":{"line":290,"column":2},"end":{"line":296,"column":3}},"178":{"start":{"line":291,"column":5},"end":{"line":291,"column":23}},"179":{"start":{"line":292,"column":5},"end":{"line":294,"column":6}},"180":{"start":{"line":293,"column":7},"end":{"line":293,"column":13}},"181":{"start":{"line":295,"column":5},"end":{"line":295,"column":68}},"182":{"start":{"line":297,"column":2},"end":{"line":299,"column":3}},"183":{"start":{"line":298,"column":4},"end":{"line":298,"column":26}},"184":{"start":{"line":300,"column":2},"end":{"line":300,"column":34}},"185":{"start":{"line":302,"column":0},"end":{"line":314,"column":1}},"186":{"start":{"line":303,"column":2},"end":{"line":303,"column":22}},"187":{"start":{"line":304,"column":2},"end":{"line":304,"column":25}},"188":{"start":{"line":305,"column":2},"end":{"line":312,"column":3}},"189":{"start":{"line":306,"column":4},"end":{"line":311,"column":5}},"190":{"start":{"line":307,"column":6},"end":{"line":307,"column":24}},"191":{"start":{"line":308,"column":6},"end":{"line":308,"column":69}},"192":{"start":{"line":310,"column":6},"end":{"line":310,"column":15}},"193":{"start":{"line":313,"column":2},"end":{"line":313,"column":34}},"194":{"start":{"line":315,"column":0},"end":{"line":382,"column":1}},"195":{"start":{"line":316,"column":2},"end":{"line":316,"column":57}},"196":{"start":{"line":317,"column":2},"end":{"line":317,"column":18}},"197":{"start":{"line":318,"column":2},"end":{"line":318,"column":13}},"198":{"start":{"line":319,"column":2},"end":{"line":319,"column":7}},"199":{"start":{"line":320,"column":2},"end":{"line":322,"column":3}},"200":{"start":{"line":321,"column":4},"end":{"line":321,"column":62}},"201":{"start":{"line":323,"column":2},"end":{"line":372,"column":3}},"202":{"start":{"line":324,"column":4},"end":{"line":324,"column":26}},"203":{"start":{"line":325,"column":4},"end":{"line":328,"column":5}},"204":{"start":{"line":326,"column":8},"end":{"line":326,"column":22}},"205":{"start":{"line":327,"column":8},"end":{"line":327,"column":13}},"206":{"start":{"line":329,"column":4},"end":{"line":371,"column":5}},"207":{"start":{"line":330,"column":6},"end":{"line":330,"column":24}},"208":{"start":{"line":331,"column":6},"end":{"line":366,"column":7}},"209":{"start":{"line":332,"column":8},"end":{"line":361,"column":9}},"210":{"start":{"line":335,"column":12},"end":{"line":344,"column":13}},"211":{"start":{"line":336,"column":14},"end":{"line":336,"column":19}},"212":{"start":{"line":337,"column":14},"end":{"line":337,"column":34}},"213":{"start":{"line":339,"column":14},"end":{"line":339,"column":44}},"214":{"start":{"line":340,"column":14},"end":{"line":342,"column":15}},"215":{"start":{"line":341,"column":16},"end":{"line":341,"column":38}},"216":{"start":{"line":343,"column":14},"end":{"line":343,"column":30}},"217":{"start":{"line":345,"column":12},"end":{"line":345,"column":18}},"218":{"start":{"line":352,"column":12},"end":{"line":352,"column":28}},"219":{"start":{"line":353,"column":12},"end":{"line":353,"column":18}},"220":{"start":{"line":356,"column":12},"end":{"line":356,"column":21}},"221":{"start":{"line":357,"column":12},"end":{"line":357,"column":34}},"222":{"start":{"line":358,"column":12},"end":{"line":358,"column":17}},"223":{"start":{"line":360,"column":12},"end":{"line":360,"column":21}},"224":{"start":{"line":363,"column":8},"end":{"line":365,"column":9}},"225":{"start":{"line":364,"column":10},"end":{"line":364,"column":15}},"226":{"start":{"line":367,"column":11},"end":{"line":371,"column":5}},"227":{"start":{"line":368,"column":6},"end":{"line":368,"column":11}},"228":{"start":{"line":370,"column":6},"end":{"line":370,"column":15}},"229":{"start":{"line":373,"column":2},"end":{"line":381,"column":3}},"230":{"start":{"line":374,"column":4},"end":{"line":377,"column":5}},"231":{"start":{"line":380,"column":4},"end":{"line":380,"column":26}},"232":{"start":{"line":383,"column":0},"end":{"line":403,"column":1}},"233":{"start":{"line":384,"column":2},"end":{"line":384,"column":22}},"234":{"start":{"line":385,"column":2},"end":{"line":388,"column":3}},"235":{"start":{"line":389,"column":2},"end":{"line":389,"column":13}},"236":{"start":{"line":390,"column":2},"end":{"line":390,"column":18}},"237":{"start":{"line":391,"column":2},"end":{"line":400,"column":3}},"238":{"start":{"line":393,"column":6},"end":{"line":393,"column":11}},"239":{"start":{"line":394,"column":6},"end":{"line":394,"column":11}},"240":{"start":{"line":396,"column":6},"end":{"line":396,"column":11}},"241":{"start":{"line":397,"column":6},"end":{"line":397,"column":11}},"242":{"start":{"line":399,"column":6},"end":{"line":399,"column":28}},"243":{"start":{"line":401,"column":2},"end":{"line":401,"column":40}},"244":{"start":{"line":402,"column":2},"end":{"line":402,"column":14}},"245":{"start":{"line":404,"column":0},"end":{"line":432,"column":1}},"246":{"start":{"line":405,"column":2},"end":{"line":405,"column":9}},"247":{"start":{"line":406,"column":2},"end":{"line":406,"column":14}},"248":{"start":{"line":407,"column":2},"end":{"line":407,"column":21}},"249":{"start":{"line":408,"column":2},"end":{"line":408,"column":18}},"250":{"start":{"line":409,"column":2},"end":{"line":430,"column":3}},"251":{"start":{"line":410,"column":4},"end":{"line":427,"column":5}},"252":{"start":{"line":411,"column":6},"end":{"line":411,"column":23}},"253":{"start":{"line":412,"column":6},"end":{"line":421,"column":7}},"254":{"start":{"line":413,"column":8},"end":{"line":418,"column":9}},"255":{"start":{"line":414,"column":10},"end":{"line":417,"column":12}},"256":{"start":{"line":419,"column":8},"end":{"line":419,"column":13}},"257":{"start":{"line":420,"column":8},"end":{"line":420,"column":16}},"258":{"start":{"line":422,"column":6},"end":{"line":425,"column":7}},"259":{"start":{"line":423,"column":8},"end":{"line":423,"column":13}},"260":{"start":{"line":424,"column":8},"end":{"line":424,"column":16}},"261":{"start":{"line":426,"column":6},"end":{"line":426,"column":37}},"262":{"start":{"line":431,"column":2},"end":{"line":431,"column":19}},"263":{"start":{"line":433,"column":0},"end":{"line":433,"column":27}}},"branchMap":{"1":{"line":14,"type":"binary-expr","locations":[{"start":{"line":14,"column":10},"end":{"line":14,"column":20}},{"start":{"line":14,"column":26},"end":{"line":14,"column":36}},{"start":{"line":15,"column":9},"end":{"line":15,"column":27}}]},"2":{"line":19,"type":"binary-expr","locations":[{"start":{"line":19,"column":10},"end":{"line":19,"column":20}},{"start":{"line":19,"column":26},"end":{"line":19,"column":36}},{"start":{"line":20,"column":12},"end":{"line":20,"column":30}},{"start":{"line":21,"column":12},"end":{"line":21,"column":30}}]},"3":{"line":24,"type":"switch","locations":[{"start":{"line":25,"column":4},"end":{"line":26,"column":60}},{"start":{"line":27,"column":4},"end":{"line":29,"column":42}},{"start":{"line":30,"column":4},"end":{"line":32,"column":63}},{"start":{"line":33,"column":4},"end":{"line":36,"column":46}},{"start":{"line":37,"column":4},"end":{"line":39,"column":69}},{"start":{"line":40,"column":4},"end":{"line":41,"column":75}},{"start":{"line":42,"column":4},"end":{"line":43,"column":78}},{"start":{"line":44,"column":4},"end":{"line":45,"column":34}},{"start":{"line":46,"column":4},"end":{"line":47,"column":18}}]},"4":{"line":26,"type":"binary-expr","locations":[{"start":{"line":26,"column":14},"end":{"line":26,"column":25}},{"start":{"line":26,"column":31},"end":{"line":26,"column":42}},{"start":{"line":26,"column":48},"end":{"line":26,"column":59}}]},"5":{"line":28,"type":"binary-expr","locations":[{"start":{"line":28,"column":14},"end":{"line":28,"column":26}},{"start":{"line":28,"column":32},"end":{"line":28,"column":44}},{"start":{"line":28,"column":50},"end":{"line":28,"column":62}},{"start":{"line":29,"column":11},"end":{"line":29,"column":23}},{"start":{"line":29,"column":29},"end":{"line":29,"column":41}}]},"6":{"line":31,"type":"binary-expr","locations":[{"start":{"line":31,"column":14},"end":{"line":31,"column":27}},{"start":{"line":31,"column":33},"end":{"line":31,"column":46}},{"start":{"line":31,"column":52},"end":{"line":31,"column":65}},{"start":{"line":32,"column":11},"end":{"line":32,"column":24}},{"start":{"line":32,"column":30},"end":{"line":32,"column":43}},{"start":{"line":32,"column":49},"end":{"line":32,"column":62}}]},"7":{"line":34,"type":"binary-expr","locations":[{"start":{"line":34,"column":14},"end":{"line":34,"column":28}},{"start":{"line":34,"column":34},"end":{"line":34,"column":48}},{"start":{"line":34,"column":54},"end":{"line":34,"column":68}},{"start":{"line":35,"column":11},"end":{"line":35,"column":25}},{"start":{"line":35,"column":31},"end":{"line":35,"column":45}},{"start":{"line":35,"column":51},"end":{"line":35,"column":65}},{"start":{"line":36,"column":11},"end":{"line":36,"column":25}},{"start":{"line":36,"column":31},"end":{"line":36,"column":45}}]},"8":{"line":38,"type":"binary-expr","locations":[{"start":{"line":38,"column":14},"end":{"line":38,"column":29}},{"start":{"line":38,"column":35},"end":{"line":38,"column":50}},{"start":{"line":38,"column":56},"end":{"line":38,"column":71}},{"start":{"line":39,"column":11},"end":{"line":39,"column":26}},{"start":{"line":39,"column":32},"end":{"line":39,"column":47}},{"start":{"line":39,"column":53},"end":{"line":39,"column":68}}]},"9":{"line":41,"type":"binary-expr","locations":[{"start":{"line":41,"column":14},"end":{"line":41,"column":30}},{"start":{"line":41,"column":36},"end":{"line":41,"column":52}},{"start":{"line":41,"column":58},"end":{"line":41,"column":74}}]},"10":{"line":43,"type":"binary-expr","locations":[{"start":{"line":43,"column":14},"end":{"line":43,"column":31}},{"start":{"line":43,"column":37},"end":{"line":43,"column":54}},{"start":{"line":43,"column":60},"end":{"line":43,"column":77}}]},"11":{"line":57,"type":"if","locations":[{"start":{"line":57,"column":4},"end":{"line":57,"column":4}},{"start":{"line":57,"column":4},"end":{"line":57,"column":4}}]},"12":{"line":71,"type":"if","locations":[{"start":{"line":71,"column":2},"end":{"line":71,"column":2}},{"start":{"line":71,"column":2},"end":{"line":71,"column":2}}]},"13":{"line":73,"type":"if","locations":[{"start":{"line":73,"column":8},"end":{"line":73,"column":8}},{"start":{"line":73,"column":8},"end":{"line":73,"column":8}}]},"14":{"line":75,"type":"if","locations":[{"start":{"line":75,"column":9},"end":{"line":75,"column":9}},{"start":{"line":75,"column":9},"end":{"line":75,"column":9}}]},"15":{"line":77,"type":"if","locations":[{"start":{"line":77,"column":9},"end":{"line":77,"column":9}},{"start":{"line":77,"column":9},"end":{"line":77,"column":9}}]},"16":{"line":77,"type":"binary-expr","locations":[{"start":{"line":77,"column":12},"end":{"line":77,"column":25}},{"start":{"line":77,"column":29},"end":{"line":77,"column":41}}]},"17":{"line":90,"type":"if","locations":[{"start":{"line":90,"column":2},"end":{"line":90,"column":2}},{"start":{"line":90,"column":2},"end":{"line":90,"column":2}}]},"18":{"line":96,"type":"if","locations":[{"start":{"line":96,"column":2},"end":{"line":96,"column":2}},{"start":{"line":96,"column":2},"end":{"line":96,"column":2}}]},"19":{"line":101,"type":"if","locations":[{"start":{"line":101,"column":2},"end":{"line":101,"column":2}},{"start":{"line":101,"column":2},"end":{"line":101,"column":2}}]},"20":{"line":101,"type":"binary-expr","locations":[{"start":{"line":101,"column":5},"end":{"line":101,"column":15}},{"start":{"line":101,"column":19},"end":{"line":101,"column":29}},{"start":{"line":101,"column":33},"end":{"line":101,"column":43}},{"start":{"line":101,"column":47},"end":{"line":101,"column":56}}]},"21":{"line":105,"type":"if","locations":[{"start":{"line":105,"column":2},"end":{"line":105,"column":2}},{"start":{"line":105,"column":2},"end":{"line":105,"column":2}}]},"22":{"line":105,"type":"binary-expr","locations":[{"start":{"line":105,"column":5},"end":{"line":105,"column":15}},{"start":{"line":105,"column":18},"end":{"line":105,"column":29}}]},"23":{"line":109,"type":"if","locations":[{"start":{"line":109,"column":2},"end":{"line":109,"column":2}},{"start":{"line":109,"column":2},"end":{"line":109,"column":2}}]},"24":{"line":110,"type":"if","locations":[{"start":{"line":110,"column":4},"end":{"line":110,"column":4}},{"start":{"line":110,"column":4},"end":{"line":110,"column":4}}]},"25":{"line":115,"type":"if","locations":[{"start":{"line":115,"column":2},"end":{"line":115,"column":2}},{"start":{"line":115,"column":2},"end":{"line":115,"column":2}}]},"26":{"line":123,"type":"if","locations":[{"start":{"line":123,"column":4},"end":{"line":123,"column":4}},{"start":{"line":123,"column":4},"end":{"line":123,"column":4}}]},"27":{"line":128,"type":"if","locations":[{"start":{"line":128,"column":2},"end":{"line":128,"column":2}},{"start":{"line":128,"column":2},"end":{"line":128,"column":2}}]},"28":{"line":141,"type":"if","locations":[{"start":{"line":141,"column":4},"end":{"line":141,"column":4}},{"start":{"line":141,"column":4},"end":{"line":141,"column":4}}]},"29":{"line":141,"type":"binary-expr","locations":[{"start":{"line":141,"column":7},"end":{"line":141,"column":16}},{"start":{"line":141,"column":20},"end":{"line":141,"column":29}}]},"30":{"line":149,"type":"if","locations":[{"start":{"line":149,"column":2},"end":{"line":149,"column":2}},{"start":{"line":149,"column":2},"end":{"line":149,"column":2}}]},"31":{"line":152,"type":"if","locations":[{"start":{"line":152,"column":2},"end":{"line":152,"column":2}},{"start":{"line":152,"column":2},"end":{"line":152,"column":2}}]},"32":{"line":153,"type":"if","locations":[{"start":{"line":153,"column":4},"end":{"line":153,"column":4}},{"start":{"line":153,"column":4},"end":{"line":153,"column":4}}]},"33":{"line":153,"type":"binary-expr","locations":[{"start":{"line":153,"column":7},"end":{"line":153,"column":20}},{"start":{"line":153,"column":24},"end":{"line":153,"column":42}}]},"34":{"line":170,"type":"if","locations":[{"start":{"line":170,"column":2},"end":{"line":170,"column":2}},{"start":{"line":170,"column":2},"end":{"line":170,"column":2}}]},"35":{"line":177,"type":"if","locations":[{"start":{"line":177,"column":4},"end":{"line":177,"column":4}},{"start":{"line":177,"column":4},"end":{"line":177,"column":4}}]},"36":{"line":183,"type":"if","locations":[{"start":{"line":183,"column":2},"end":{"line":183,"column":2}},{"start":{"line":183,"column":2},"end":{"line":183,"column":2}}]},"37":{"line":183,"type":"binary-expr","locations":[{"start":{"line":183,"column":5},"end":{"line":183,"column":13}},{"start":{"line":183,"column":17},"end":{"line":183,"column":36}}]},"38":{"line":186,"type":"if","locations":[{"start":{"line":186,"column":2},"end":{"line":186,"column":2}},{"start":{"line":186,"column":2},"end":{"line":186,"column":2}}]},"39":{"line":186,"type":"binary-expr","locations":[{"start":{"line":186,"column":5},"end":{"line":186,"column":18}},{"start":{"line":186,"column":22},"end":{"line":186,"column":40}}]},"40":{"line":198,"type":"if","locations":[{"start":{"line":198,"column":4},"end":{"line":198,"column":4}},{"start":{"line":198,"column":4},"end":{"line":198,"column":4}}]},"41":{"line":198,"type":"binary-expr","locations":[{"start":{"line":198,"column":7},"end":{"line":198,"column":17}},{"start":{"line":198,"column":19},"end":{"line":198,"column":29}}]},"42":{"line":201,"type":"if","locations":[{"start":{"line":201,"column":4},"end":{"line":201,"column":4}},{"start":{"line":201,"column":4},"end":{"line":201,"column":4}}]},"43":{"line":210,"type":"if","locations":[{"start":{"line":210,"column":2},"end":{"line":210,"column":2}},{"start":{"line":210,"column":2},"end":{"line":210,"column":2}}]},"44":{"line":210,"type":"binary-expr","locations":[{"start":{"line":210,"column":5},"end":{"line":210,"column":24}},{"start":{"line":210,"column":28},"end":{"line":210,"column":38}}]},"45":{"line":215,"type":"if","locations":[{"start":{"line":215,"column":2},"end":{"line":215,"column":2}},{"start":{"line":215,"column":2},"end":{"line":215,"column":2}}]},"46":{"line":218,"type":"if","locations":[{"start":{"line":218,"column":4},"end":{"line":218,"column":4}},{"start":{"line":218,"column":4},"end":{"line":218,"column":4}}]},"47":{"line":219,"type":"if","locations":[{"start":{"line":219,"column":6},"end":{"line":219,"column":6}},{"start":{"line":219,"column":6},"end":{"line":219,"column":6}}]},"48":{"line":219,"type":"binary-expr","locations":[{"start":{"line":219,"column":9},"end":{"line":219,"column":19}},{"start":{"line":219,"column":23},"end":{"line":219,"column":33}}]},"49":{"line":222,"type":"if","locations":[{"start":{"line":222,"column":13},"end":{"line":222,"column":13}},{"start":{"line":222,"column":13},"end":{"line":222,"column":13}}]},"50":{"line":222,"type":"binary-expr","locations":[{"start":{"line":222,"column":16},"end":{"line":222,"column":26}},{"start":{"line":222,"column":30},"end":{"line":222,"column":40}}]},"51":{"line":225,"type":"if","locations":[{"start":{"line":225,"column":13},"end":{"line":225,"column":13}},{"start":{"line":225,"column":13},"end":{"line":225,"column":13}}]},"52":{"line":225,"type":"binary-expr","locations":[{"start":{"line":225,"column":16},"end":{"line":225,"column":26}},{"start":{"line":225,"column":30},"end":{"line":225,"column":40}}]},"53":{"line":228,"type":"if","locations":[{"start":{"line":228,"column":6},"end":{"line":228,"column":6}},{"start":{"line":228,"column":6},"end":{"line":228,"column":6}}]},"54":{"line":229,"type":"if","locations":[{"start":{"line":229,"column":8},"end":{"line":229,"column":8}},{"start":{"line":229,"column":8},"end":{"line":229,"column":8}}]},"55":{"line":239,"type":"if","locations":[{"start":{"line":239,"column":2},"end":{"line":239,"column":2}},{"start":{"line":239,"column":2},"end":{"line":239,"column":2}}]},"56":{"line":246,"type":"if","locations":[{"start":{"line":246,"column":2},"end":{"line":246,"column":2}},{"start":{"line":246,"column":2},"end":{"line":246,"column":2}}]},"57":{"line":246,"type":"binary-expr","locations":[{"start":{"line":246,"column":5},"end":{"line":246,"column":15}},{"start":{"line":246,"column":19},"end":{"line":246,"column":29}}]},"58":{"line":249,"type":"if","locations":[{"start":{"line":249,"column":4},"end":{"line":249,"column":4}},{"start":{"line":249,"column":4},"end":{"line":249,"column":4}}]},"59":{"line":249,"type":"binary-expr","locations":[{"start":{"line":249,"column":7},"end":{"line":249,"column":17}},{"start":{"line":249,"column":21},"end":{"line":249,"column":31}}]},"60":{"line":252,"type":"if","locations":[{"start":{"line":252,"column":4},"end":{"line":252,"column":4}},{"start":{"line":252,"column":4},"end":{"line":252,"column":4}}]},"61":{"line":253,"type":"binary-expr","locations":[{"start":{"line":253,"column":12},"end":{"line":253,"column":39}},{"start":{"line":253,"column":43},"end":{"line":253,"column":52}}]},"62":{"line":260,"type":"if","locations":[{"start":{"line":260,"column":2},"end":{"line":260,"column":2}},{"start":{"line":260,"column":2},"end":{"line":260,"column":2}}]},"63":{"line":260,"type":"binary-expr","locations":[{"start":{"line":260,"column":5},"end":{"line":260,"column":16}},{"start":{"line":260,"column":20},"end":{"line":260,"column":42}}]},"64":{"line":270,"type":"if","locations":[{"start":{"line":270,"column":2},"end":{"line":270,"column":2}},{"start":{"line":270,"column":2},"end":{"line":270,"column":2}}]},"65":{"line":270,"type":"binary-expr","locations":[{"start":{"line":270,"column":5},"end":{"line":270,"column":18}},{"start":{"line":270,"column":22},"end":{"line":270,"column":35}},{"start":{"line":270,"column":39},"end":{"line":270,"column":54}},{"start":{"line":270,"column":58},"end":{"line":270,"column":73}}]},"66":{"line":287,"type":"if","locations":[{"start":{"line":287,"column":2},"end":{"line":287,"column":2}},{"start":{"line":287,"column":2},"end":{"line":287,"column":2}}]},"67":{"line":292,"type":"if","locations":[{"start":{"line":292,"column":5},"end":{"line":292,"column":5}},{"start":{"line":292,"column":5},"end":{"line":292,"column":5}}]},"68":{"line":297,"type":"if","locations":[{"start":{"line":297,"column":2},"end":{"line":297,"column":2}},{"start":{"line":297,"column":2},"end":{"line":297,"column":2}}]},"69":{"line":297,"type":"binary-expr","locations":[{"start":{"line":297,"column":5},"end":{"line":297,"column":20}},{"start":{"line":297,"column":24},"end":{"line":297,"column":34}}]},"70":{"line":304,"type":"cond-expr","locations":[{"start":{"line":304,"column":22},"end":{"line":304,"column":23}},{"start":{"line":304,"column":24},"end":{"line":304,"column":25}}]},"71":{"line":306,"type":"if","locations":[{"start":{"line":306,"column":4},"end":{"line":306,"column":4}},{"start":{"line":306,"column":4},"end":{"line":306,"column":4}}]},"72":{"line":306,"type":"binary-expr","locations":[{"start":{"line":306,"column":7},"end":{"line":306,"column":16}},{"start":{"line":306,"column":20},"end":{"line":306,"column":43}}]},"73":{"line":320,"type":"if","locations":[{"start":{"line":320,"column":2},"end":{"line":320,"column":2}},{"start":{"line":320,"column":2},"end":{"line":320,"column":2}}]},"74":{"line":320,"type":"binary-expr","locations":[{"start":{"line":320,"column":5},"end":{"line":320,"column":15}},{"start":{"line":320,"column":19},"end":{"line":320,"column":30}}]},"75":{"line":325,"type":"if","locations":[{"start":{"line":325,"column":4},"end":{"line":325,"column":4}},{"start":{"line":325,"column":4},"end":{"line":325,"column":4}}]},"76":{"line":329,"type":"if","locations":[{"start":{"line":329,"column":4},"end":{"line":329,"column":4}},{"start":{"line":329,"column":4},"end":{"line":329,"column":4}}]},"77":{"line":331,"type":"if","locations":[{"start":{"line":331,"column":6},"end":{"line":331,"column":6}},{"start":{"line":331,"column":6},"end":{"line":331,"column":6}}]},"78":{"line":331,"type":"binary-expr","locations":[{"start":{"line":331,"column":9},"end":{"line":331,"column":12}},{"start":{"line":331,"column":16},"end":{"line":331,"column":35}}]},"79":{"line":332,"type":"switch","locations":[{"start":{"line":333,"column":10},"end":{"line":333,"column":19}},{"start":{"line":334,"column":10},"end":{"line":345,"column":18}},{"start":{"line":346,"column":10},"end":{"line":346,"column":19}},{"start":{"line":347,"column":10},"end":{"line":347,"column":19}},{"start":{"line":348,"column":10},"end":{"line":348,"column":19}},{"start":{"line":349,"column":10},"end":{"line":349,"column":19}},{"start":{"line":350,"column":10},"end":{"line":350,"column":19}},{"start":{"line":351,"column":10},"end":{"line":353,"column":18}},{"start":{"line":354,"column":10},"end":{"line":354,"column":19}},{"start":{"line":355,"column":10},"end":{"line":358,"column":17}},{"start":{"line":359,"column":10},"end":{"line":360,"column":21}}]},"80":{"line":335,"type":"if","locations":[{"start":{"line":335,"column":12},"end":{"line":335,"column":12}},{"start":{"line":335,"column":12},"end":{"line":335,"column":12}}]},"81":{"line":340,"type":"if","locations":[{"start":{"line":340,"column":14},"end":{"line":340,"column":14}},{"start":{"line":340,"column":14},"end":{"line":340,"column":14}}]},"82":{"line":363,"type":"if","locations":[{"start":{"line":363,"column":8},"end":{"line":363,"column":8}},{"start":{"line":363,"column":8},"end":{"line":363,"column":8}}]},"83":{"line":363,"type":"binary-expr","locations":[{"start":{"line":363,"column":11},"end":{"line":363,"column":22}},{"start":{"line":363,"column":26},"end":{"line":363,"column":47}}]},"84":{"line":367,"type":"if","locations":[{"start":{"line":367,"column":11},"end":{"line":367,"column":11}},{"start":{"line":367,"column":11},"end":{"line":367,"column":11}}]},"85":{"line":373,"type":"if","locations":[{"start":{"line":373,"column":2},"end":{"line":373,"column":2}},{"start":{"line":373,"column":2},"end":{"line":373,"column":2}}]},"86":{"line":391,"type":"switch","locations":[{"start":{"line":392,"column":4},"end":{"line":394,"column":11}},{"start":{"line":395,"column":4},"end":{"line":397,"column":11}},{"start":{"line":398,"column":4},"end":{"line":399,"column":28}}]},"87":{"line":412,"type":"if","locations":[{"start":{"line":412,"column":6},"end":{"line":412,"column":6}},{"start":{"line":412,"column":6},"end":{"line":412,"column":6}}]},"88":{"line":413,"type":"if","locations":[{"start":{"line":413,"column":8},"end":{"line":413,"column":8}},{"start":{"line":413,"column":8},"end":{"line":413,"column":8}}]},"89":{"line":413,"type":"binary-expr","locations":[{"start":{"line":413,"column":11},"end":{"line":413,"column":30}},{"start":{"line":413,"column":34},"end":{"line":413,"column":82}}]},"90":{"line":422,"type":"if","locations":[{"start":{"line":422,"column":6},"end":{"line":422,"column":6}},{"start":{"line":422,"column":6},"end":{"line":422,"column":6}}]}}}} -------------------------------------------------------------------------------- /coverage/lcov.info: -------------------------------------------------------------------------------- 1 | TN: 2 | SF:/Users/fanqi/Documents/mine/lucefer/continue-assign-parser/src/compiler/parser.js 3 | FN:4,Node 4 | FN:10,parse 5 | FN:25,parseProgram 6 | FN:52,parseScriptBody 7 | FN:60,parseStatementListItem 8 | FN:75,parseVariableDeclarationList 9 | FN:80,parseVariableDeclaration 10 | FN:94,parseEqualVariableDeclaration 11 | FN:120,(anonymous_9) 12 | FN:152,isPunctuator 13 | FNF:10 14 | FNH:10 15 | FNDA:12,Node 16 | FNDA:2,parse 17 | FNDA:2,parseProgram 18 | FNDA:2,parseScriptBody 19 | FNDA:2,parseStatementListItem 20 | FNDA:2,parseVariableDeclarationList 21 | FNDA:2,parseVariableDeclaration 22 | FNDA:4,parseEqualVariableDeclaration 23 | FNDA:2,(anonymous_9) 24 | FNDA:4,isPunctuator 25 | DA:1,1 26 | DA:2,1 27 | DA:4,1 28 | DA:8,1 29 | DA:10,1 30 | DA:11,2 31 | DA:12,2 32 | DA:13,2 33 | DA:14,2 34 | DA:16,2 35 | DA:17,2 36 | DA:22,2 37 | DA:25,1 38 | DA:26,2 39 | DA:27,2 40 | DA:28,2 41 | DA:29,2 42 | DA:30,2 43 | DA:31,2 44 | DA:32,2 45 | DA:33,2 46 | DA:34,4 47 | DA:35,1 48 | DA:36,1 49 | DA:40,2 50 | DA:41,1 51 | DA:44,2 52 | DA:45,1 53 | DA:47,1 54 | DA:48,1 55 | DA:49,1 56 | DA:52,1 57 | DA:53,2 58 | DA:54,2 59 | DA:55,2 60 | DA:56,2 61 | DA:57,2 62 | DA:60,1 63 | DA:61,2 64 | DA:62,2 65 | DA:65,2 66 | DA:66,2 67 | DA:67,2 68 | DA:68,2 69 | DA:69,0 70 | DA:72,0 71 | DA:75,1 72 | DA:76,2 73 | DA:77,2 74 | DA:78,2 75 | DA:80,1 76 | DA:81,2 77 | DA:84,2 78 | DA:85,0 79 | DA:87,2 80 | DA:88,2 81 | DA:89,2 82 | DA:90,2 83 | DA:94,1 84 | DA:95,4 85 | DA:96,4 86 | DA:97,4 87 | DA:98,7 88 | DA:99,7 89 | DA:100,7 90 | DA:101,7 91 | DA:102,7 92 | DA:103,7 93 | DA:105,4 94 | DA:106,0 95 | DA:108,4 96 | DA:109,1 97 | DA:110,1 98 | DA:111,1 99 | DA:112,1 100 | DA:113,3 101 | DA:114,3 102 | DA:116,4 103 | DA:117,2 104 | DA:118,0 105 | DA:120,2 106 | DA:121,2 107 | DA:124,2 108 | DA:126,4 109 | DA:127,4 110 | DA:128,1 111 | DA:129,1 112 | DA:130,1 113 | DA:131,0 114 | DA:133,1 115 | DA:135,1 116 | DA:136,0 117 | DA:137,0 118 | DA:139,0 119 | DA:141,1 120 | DA:142,1 121 | DA:144,0 122 | DA:147,4 123 | DA:148,0 124 | DA:152,1 125 | DA:153,4 126 | DA:154,0 127 | DA:156,4 128 | DA:161,1 129 | LF:104 130 | LH:92 131 | BRDA:31,1,0,2 132 | BRDA:31,1,1,0 133 | BRDA:34,2,0,1 134 | BRDA:34,2,1,3 135 | BRDA:40,3,0,1 136 | BRDA:40,3,1,1 137 | BRDA:44,4,0,1 138 | BRDA:44,4,1,1 139 | BRDA:56,5,0,2 140 | BRDA:56,5,1,2 141 | BRDA:61,6,0,2 142 | BRDA:61,6,1,0 143 | BRDA:62,7,0,0 144 | BRDA:62,7,1,2 145 | BRDA:84,8,0,0 146 | BRDA:84,8,1,2 147 | BRDA:84,9,0,2 148 | BRDA:84,9,1,2 149 | BRDA:101,10,0,7 150 | BRDA:101,10,1,4 151 | BRDA:105,11,0,0 152 | BRDA:105,11,1,4 153 | BRDA:108,12,0,1 154 | BRDA:108,12,1,3 155 | BRDA:113,13,0,3 156 | BRDA:113,13,1,0 157 | BRDA:116,14,0,2 158 | BRDA:116,14,1,2 159 | BRDA:116,15,0,4 160 | BRDA:116,15,1,4 161 | BRDA:117,16,0,0 162 | BRDA:117,16,1,2 163 | BRDA:127,17,0,1 164 | BRDA:127,17,1,3 165 | BRDA:127,18,0,4 166 | BRDA:127,18,1,3 167 | BRDA:129,19,0,1 168 | BRDA:129,19,1,0 169 | BRDA:129,20,0,1 170 | BRDA:129,20,1,1 171 | BRDA:129,20,2,0 172 | BRDA:129,20,3,0 173 | BRDA:130,21,0,0 174 | BRDA:130,21,1,1 175 | BRDA:136,22,0,0 176 | BRDA:136,22,1,0 177 | BRDA:141,23,0,1 178 | BRDA:141,23,1,0 179 | BRDA:147,24,0,0 180 | BRDA:147,24,1,4 181 | BRDA:147,25,0,4 182 | BRDA:147,25,1,2 183 | BRDA:153,26,0,0 184 | BRDA:153,26,1,4 185 | BRDA:153,27,0,4 186 | BRDA:153,27,1,0 187 | BRF:56 188 | BRH:39 189 | end_of_record 190 | TN: 191 | SF:/Users/fanqi/Documents/mine/lucefer/continue-assign-parser/src/compiler/type/token.js 192 | FNF:0 193 | FNH:0 194 | DA:1,1 195 | DA:12,1 196 | LF:2 197 | LH:2 198 | BRF:0 199 | BRH:0 200 | end_of_record 201 | TN: 202 | SF:/Users/fanqi/Documents/mine/lucefer/continue-assign-parser/src/compiler/type/syntax.js 203 | FNF:0 204 | FNH:0 205 | DA:1,1 206 | DA:15,1 207 | LF:2 208 | LH:2 209 | BRF:0 210 | BRH:0 211 | end_of_record 212 | TN: 213 | SF:/Users/fanqi/Documents/mine/lucefer/continue-assign-parser/src/compiler/tokenizer.js 214 | FN:13,isIdStart 215 | FN:18,isIdPart 216 | FN:23,isKeyword 217 | FN:51,getId 218 | FN:67,scanId 219 | FN:88,getNextToken 220 | FN:120,scanHexLiteral 221 | FN:136,scanBinaryliteral 222 | FN:163,isOctalDigit 223 | FN:167,scanOctalLiteral 224 | FN:194,isImplicitOctal 225 | FN:207,scanNumberLiteral 226 | FN:268,isLineTerminal 227 | FN:275,throwUnexpectedToken 228 | FN:278,isHexDigit 229 | FN:281,isDecimalDigit 230 | FN:284,scanUnicode 231 | FN:302,scanHexEscaped 232 | FN:315,scanStringLiteral 233 | FN:383,scanPuntuator 234 | FN:404,tokenizer 235 | FNF:21 236 | FNH:19 237 | FNDA:64,isIdStart 238 | FNDA:49,isIdPart 239 | FNDA:13,isKeyword 240 | FNDA:26,getId 241 | FNDA:26,scanId 242 | FNDA:59,getNextToken 243 | FNDA:1,scanHexLiteral 244 | FNDA:1,scanBinaryliteral 245 | FNDA:419,isOctalDigit 246 | FNDA:4,scanOctalLiteral 247 | FNDA:4,isImplicitOctal 248 | FNDA:7,scanNumberLiteral 249 | FNDA:90,isLineTerminal 250 | FNDA:1,throwUnexpectedToken 251 | FNDA:3,isHexDigit 252 | FNDA:25,isDecimalDigit 253 | FNDA:0,scanUnicode 254 | FNDA:0,scanHexEscaped 255 | FNDA:3,scanStringLiteral 256 | FNDA:23,scanPuntuator 257 | FNDA:3,tokenizer 258 | DA:1,1 259 | DA:3,1 260 | DA:4,1 261 | DA:5,1 262 | DA:7,1 263 | DA:8,1 264 | DA:9,1 265 | DA:10,1 266 | DA:13,1 267 | DA:14,64 268 | DA:18,1 269 | DA:19,49 270 | DA:23,1 271 | DA:24,13 272 | DA:26,6 273 | DA:28,4 274 | DA:31,3 275 | DA:34,0 276 | DA:38,0 277 | DA:41,0 278 | DA:43,0 279 | DA:45,0 280 | DA:47,0 281 | DA:51,1 282 | DA:52,26 283 | DA:53,26 284 | DA:54,26 285 | DA:55,26 286 | DA:56,49 287 | DA:57,49 288 | DA:58,23 289 | DA:60,26 290 | DA:63,26 291 | DA:67,1 292 | DA:68,26 293 | DA:69,26 294 | DA:70,26 295 | DA:71,26 296 | DA:72,13 297 | DA:73,13 298 | DA:74,3 299 | DA:75,10 300 | DA:76,1 301 | DA:77,9 302 | DA:78,1 303 | DA:80,8 304 | DA:82,26 305 | DA:88,1 306 | DA:89,59 307 | DA:90,59 308 | DA:91,0 309 | DA:95,59 310 | DA:96,59 311 | DA:97,26 312 | DA:98,26 313 | DA:101,33 314 | DA:102,11 315 | DA:103,11 316 | DA:105,22 317 | DA:106,3 318 | DA:107,3 319 | DA:109,19 320 | DA:110,0 321 | DA:111,0 322 | DA:113,0 323 | DA:115,19 324 | DA:116,7 325 | DA:118,12 326 | DA:120,1 327 | DA:121,1 328 | DA:122,1 329 | DA:123,3 330 | DA:124,1 331 | DA:126,2 332 | DA:128,1 333 | DA:129,0 334 | DA:131,1 335 | DA:136,1 336 | DA:137,1 337 | DA:139,1 338 | DA:140,3 339 | DA:141,3 340 | DA:142,1 341 | DA:145,2 342 | DA:149,1 343 | DA:150,0 344 | DA:152,1 345 | DA:153,1 346 | DA:154,0 347 | DA:157,1 348 | DA:163,1 349 | DA:165,419 350 | DA:167,1 351 | DA:168,4 352 | DA:169,4 353 | DA:170,4 354 | DA:171,4 355 | DA:172,4 356 | DA:174,4 357 | DA:175,4 358 | DA:176,8 359 | DA:177,8 360 | DA:178,4 361 | DA:180,4 362 | DA:183,4 363 | DA:184,0 364 | DA:186,4 365 | DA:187,1 366 | DA:189,3 367 | DA:194,1 368 | DA:195,4 369 | DA:196,4 370 | DA:197,403 371 | DA:198,403 372 | DA:199,0 373 | DA:201,403 374 | DA:202,0 375 | DA:205,4 376 | DA:207,1 377 | DA:208,7 378 | DA:209,7 379 | DA:210,7 380 | DA:211,0 381 | DA:213,7 382 | DA:214,7 383 | DA:215,7 384 | DA:216,7 385 | DA:217,7 386 | DA:218,7 387 | DA:219,6 388 | DA:220,1 389 | DA:221,1 390 | DA:222,5 391 | DA:223,1 392 | DA:224,1 393 | DA:225,4 394 | DA:226,0 395 | DA:228,4 396 | DA:229,4 397 | DA:230,4 398 | DA:234,1 399 | DA:235,1 400 | DA:237,1 401 | DA:239,1 402 | DA:240,0 403 | DA:241,0 404 | DA:242,0 405 | DA:244,0 406 | DA:246,1 407 | DA:247,0 408 | DA:248,0 409 | DA:249,0 410 | DA:250,0 411 | DA:252,0 412 | DA:253,0 413 | DA:254,0 414 | DA:257,0 415 | DA:260,1 416 | DA:261,0 417 | DA:263,1 418 | DA:268,1 419 | DA:269,90 420 | DA:270,90 421 | DA:271,1 422 | DA:273,89 423 | DA:275,1 424 | DA:276,1 425 | DA:278,1 426 | DA:279,3 427 | DA:281,1 428 | DA:282,25 429 | DA:284,1 430 | DA:285,0 431 | DA:286,0 432 | DA:287,0 433 | DA:288,0 434 | DA:290,0 435 | DA:291,0 436 | DA:292,0 437 | DA:293,0 438 | DA:295,0 439 | DA:297,0 440 | DA:298,0 441 | DA:300,0 442 | DA:302,1 443 | DA:303,0 444 | DA:304,0 445 | DA:305,0 446 | DA:306,0 447 | DA:307,0 448 | DA:308,0 449 | DA:310,0 450 | DA:313,0 451 | DA:315,1 452 | DA:316,3 453 | DA:317,3 454 | DA:318,3 455 | DA:319,3 456 | DA:320,3 457 | DA:321,0 458 | DA:323,3 459 | DA:324,13 460 | DA:325,13 461 | DA:326,3 462 | DA:327,3 463 | DA:329,10 464 | DA:330,0 465 | DA:331,0 466 | DA:332,0 467 | DA:335,0 468 | DA:336,0 469 | DA:337,0 470 | DA:339,0 471 | DA:340,0 472 | DA:341,0 473 | DA:343,0 474 | DA:345,0 475 | DA:352,0 476 | DA:353,0 477 | DA:356,0 478 | DA:357,0 479 | DA:358,0 480 | DA:360,0 481 | DA:363,0 482 | DA:364,0 483 | DA:367,10 484 | DA:368,0 485 | DA:370,10 486 | DA:373,3 487 | DA:374,3 488 | DA:380,0 489 | DA:383,1 490 | DA:384,23 491 | DA:385,23 492 | DA:389,23 493 | DA:390,23 494 | DA:391,23 495 | DA:393,11 496 | DA:394,11 497 | DA:396,12 498 | DA:397,12 499 | DA:399,0 500 | DA:401,23 501 | DA:402,23 502 | DA:404,1 503 | DA:405,3 504 | DA:406,3 505 | DA:407,3 506 | DA:408,3 507 | DA:409,3 508 | DA:410,3 509 | DA:411,80 510 | DA:412,80 511 | DA:413,1 512 | DA:414,1 513 | DA:419,1 514 | DA:420,1 515 | DA:422,79 516 | DA:423,20 517 | DA:424,20 518 | DA:426,59 519 | DA:431,3 520 | DA:433,1 521 | LF:263 522 | LH:189 523 | BRDA:14,1,0,64 524 | BRDA:14,1,1,64 525 | BRDA:14,1,2,64 526 | BRDA:19,2,0,49 527 | BRDA:19,2,1,49 528 | BRDA:19,2,2,49 529 | BRDA:19,2,3,26 530 | BRDA:24,3,0,6 531 | BRDA:24,3,1,4 532 | BRDA:24,3,2,3 533 | BRDA:24,3,3,0 534 | BRDA:24,3,4,0 535 | BRDA:24,3,5,0 536 | BRDA:24,3,6,0 537 | BRDA:24,3,7,0 538 | BRDA:24,3,8,0 539 | BRDA:26,4,0,6 540 | BRDA:26,4,1,6 541 | BRDA:26,4,2,6 542 | BRDA:28,5,0,4 543 | BRDA:28,5,1,4 544 | BRDA:28,5,2,4 545 | BRDA:28,5,3,4 546 | BRDA:28,5,4,4 547 | BRDA:31,6,0,3 548 | BRDA:31,6,1,3 549 | BRDA:31,6,2,3 550 | BRDA:31,6,3,3 551 | BRDA:31,6,4,3 552 | BRDA:31,6,5,3 553 | BRDA:34,7,0,0 554 | BRDA:34,7,1,0 555 | BRDA:34,7,2,0 556 | BRDA:34,7,3,0 557 | BRDA:34,7,4,0 558 | BRDA:34,7,5,0 559 | BRDA:34,7,6,0 560 | BRDA:34,7,7,0 561 | BRDA:38,8,0,0 562 | BRDA:38,8,1,0 563 | BRDA:38,8,2,0 564 | BRDA:38,8,3,0 565 | BRDA:38,8,4,0 566 | BRDA:38,8,5,0 567 | BRDA:41,9,0,0 568 | BRDA:41,9,1,0 569 | BRDA:41,9,2,0 570 | BRDA:43,10,0,0 571 | BRDA:43,10,1,0 572 | BRDA:43,10,2,0 573 | BRDA:57,11,0,23 574 | BRDA:57,11,1,26 575 | BRDA:71,12,0,13 576 | BRDA:71,12,1,13 577 | BRDA:73,13,0,3 578 | BRDA:73,13,1,10 579 | BRDA:75,14,0,1 580 | BRDA:75,14,1,9 581 | BRDA:77,15,0,1 582 | BRDA:77,15,1,8 583 | BRDA:77,16,0,9 584 | BRDA:77,16,1,8 585 | BRDA:90,17,0,0 586 | BRDA:90,17,1,59 587 | BRDA:96,18,0,26 588 | BRDA:96,18,1,33 589 | BRDA:101,19,0,11 590 | BRDA:101,19,1,22 591 | BRDA:101,20,0,33 592 | BRDA:101,20,1,33 593 | BRDA:101,20,2,33 594 | BRDA:101,20,3,33 595 | BRDA:105,21,0,3 596 | BRDA:105,21,1,19 597 | BRDA:105,22,0,22 598 | BRDA:105,22,1,22 599 | BRDA:109,23,0,0 600 | BRDA:109,23,1,19 601 | BRDA:110,24,0,0 602 | BRDA:110,24,1,0 603 | BRDA:115,25,0,7 604 | BRDA:115,25,1,12 605 | BRDA:123,26,0,1 606 | BRDA:123,26,1,2 607 | BRDA:128,27,0,0 608 | BRDA:128,27,1,1 609 | BRDA:141,28,0,1 610 | BRDA:141,28,1,2 611 | BRDA:141,29,0,3 612 | BRDA:141,29,1,3 613 | BRDA:149,30,0,0 614 | BRDA:149,30,1,1 615 | BRDA:152,31,0,1 616 | BRDA:152,31,1,0 617 | BRDA:153,32,0,0 618 | BRDA:153,32,1,1 619 | BRDA:153,33,0,1 620 | BRDA:153,33,1,1 621 | BRDA:170,34,0,4 622 | BRDA:170,34,1,0 623 | BRDA:177,35,0,4 624 | BRDA:177,35,1,4 625 | BRDA:183,36,0,0 626 | BRDA:183,36,1,4 627 | BRDA:183,37,0,4 628 | BRDA:183,37,1,0 629 | BRDA:186,38,0,1 630 | BRDA:186,38,1,3 631 | BRDA:186,39,0,4 632 | BRDA:186,39,1,3 633 | BRDA:198,40,0,0 634 | BRDA:198,40,1,403 635 | BRDA:198,41,0,403 636 | BRDA:198,41,1,403 637 | BRDA:201,42,0,0 638 | BRDA:201,42,1,403 639 | BRDA:210,43,0,0 640 | BRDA:210,43,1,7 641 | BRDA:210,44,0,7 642 | BRDA:210,44,1,0 643 | BRDA:215,45,0,7 644 | BRDA:215,45,1,0 645 | BRDA:218,46,0,6 646 | BRDA:218,46,1,1 647 | BRDA:219,47,0,1 648 | BRDA:219,47,1,5 649 | BRDA:219,48,0,6 650 | BRDA:219,48,1,5 651 | BRDA:222,49,0,1 652 | BRDA:222,49,1,4 653 | BRDA:222,50,0,5 654 | BRDA:222,50,1,4 655 | BRDA:225,51,0,0 656 | BRDA:225,51,1,4 657 | BRDA:225,52,0,4 658 | BRDA:225,52,1,4 659 | BRDA:228,53,0,4 660 | BRDA:228,53,1,0 661 | BRDA:229,54,0,4 662 | BRDA:229,54,1,0 663 | BRDA:239,55,0,0 664 | BRDA:239,55,1,1 665 | BRDA:246,56,0,0 666 | BRDA:246,56,1,1 667 | BRDA:246,57,0,1 668 | BRDA:246,57,1,1 669 | BRDA:249,58,0,0 670 | BRDA:249,58,1,0 671 | BRDA:249,59,0,0 672 | BRDA:249,59,1,0 673 | BRDA:252,60,0,0 674 | BRDA:252,60,1,0 675 | BRDA:253,61,0,0 676 | BRDA:253,61,1,0 677 | BRDA:260,62,0,0 678 | BRDA:260,62,1,1 679 | BRDA:260,63,0,1 680 | BRDA:260,63,1,0 681 | BRDA:270,64,0,1 682 | BRDA:270,64,1,89 683 | BRDA:270,65,0,90 684 | BRDA:270,65,1,89 685 | BRDA:270,65,2,89 686 | BRDA:270,65,3,89 687 | BRDA:287,66,0,0 688 | BRDA:287,66,1,0 689 | BRDA:292,67,0,0 690 | BRDA:292,67,1,0 691 | BRDA:297,68,0,0 692 | BRDA:297,68,1,0 693 | BRDA:297,69,0,0 694 | BRDA:297,69,1,0 695 | BRDA:304,70,0,0 696 | BRDA:304,70,1,0 697 | BRDA:306,71,0,0 698 | BRDA:306,71,1,0 699 | BRDA:306,72,0,0 700 | BRDA:306,72,1,0 701 | BRDA:320,73,0,0 702 | BRDA:320,73,1,3 703 | BRDA:320,74,0,3 704 | BRDA:320,74,1,3 705 | BRDA:325,75,0,3 706 | BRDA:325,75,1,10 707 | BRDA:329,76,0,0 708 | BRDA:329,76,1,10 709 | BRDA:331,77,0,0 710 | BRDA:331,77,1,0 711 | BRDA:331,78,0,0 712 | BRDA:331,78,1,0 713 | BRDA:332,79,0,0 714 | BRDA:332,79,1,0 715 | BRDA:332,79,2,0 716 | BRDA:332,79,3,0 717 | BRDA:332,79,4,0 718 | BRDA:332,79,5,0 719 | BRDA:332,79,6,0 720 | BRDA:332,79,7,0 721 | BRDA:332,79,8,0 722 | BRDA:332,79,9,0 723 | BRDA:332,79,10,0 724 | BRDA:335,80,0,0 725 | BRDA:335,80,1,0 726 | BRDA:340,81,0,0 727 | BRDA:340,81,1,0 728 | BRDA:363,82,0,0 729 | BRDA:363,82,1,0 730 | BRDA:363,83,0,0 731 | BRDA:363,83,1,0 732 | BRDA:367,84,0,0 733 | BRDA:367,84,1,10 734 | BRDA:373,85,0,3 735 | BRDA:373,85,1,0 736 | BRDA:391,86,0,11 737 | BRDA:391,86,1,12 738 | BRDA:391,86,2,0 739 | BRDA:412,87,0,1 740 | BRDA:412,87,1,79 741 | BRDA:413,88,0,1 742 | BRDA:413,88,1,0 743 | BRDA:413,89,0,1 744 | BRDA:413,89,1,1 745 | BRDA:422,90,0,20 746 | BRDA:422,90,1,59 747 | BRF:224 748 | BRH:124 749 | end_of_record 750 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const compile = require('./src/index') 2 | 3 | module.exports = compile 4 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "continue-assign-parser", 3 | "version": "1.0.0", 4 | "description": "a parser which can parse assign a value to some variables", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "mocha -u bdd ./test/*.js", 8 | "cov":"istanbul cover ./node_modules/mocha/bin/_mocha test/*.js --report lcovonly -- -R spec && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage" 9 | }, 10 | "bin": { 11 | "aparse": "bin/start" 12 | }, 13 | "keywords": [ 14 | "parser", 15 | "js", 16 | "assign" 17 | ], 18 | "repository": { 19 | "type": "git", 20 | "url": "https://github.com/lucefer/continue-assign-parser.git" 21 | }, 22 | "author": "lucefer", 23 | "license": "MIT", 24 | "devDependencies": { 25 | "chai": "^4.0.2", 26 | "coveralls": "^2.13.1", 27 | "istanbul": "^0.4.5", 28 | "mocha": "^3.4.2" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/compiler/generator.js: -------------------------------------------------------------------------------- 1 | const Syntax=require('./type/syntax') 2 | 3 | function codeGenerator(node,parent_node){ 4 | let str='' 5 | switch(node.type){ 6 | case Syntax.Program: 7 | for(let i = 0;i < node.body.length;i++) { 8 | if(i == node.body.length - 1){ 9 | str += codeGenerator(node.body[i]) 10 | } else { 11 | str += codeGenerator(node.body[i]) + "\n" 12 | } 13 | } 14 | break 15 | case Syntax.VariableDeclaration: 16 | str += node.kind + " " 17 | for(let i = 0;i < node.body.length; i++) { 18 | str += codeGenerator(node.body[i]) + "," 19 | } 20 | str = str.substr(0, str.length-1) 21 | break 22 | case Syntax.AssignmentExpression: 23 | for(let i = 0; i < node.body.length; i++) { 24 | if(i === node.body.length - 1){ 25 | str += codeGenerator(node.body[i]) 26 | } else { 27 | str += codeGenerator(node.body[i]) + "\n" 28 | } 29 | } 30 | break 31 | case Syntax.AssignmentEqual: 32 | if(node.value !== undefined) { 33 | for(let i = 0; i < node.body.length; i++) { 34 | str += (codeGenerator(node.body[i], node) + "=") 35 | } 36 | str += node.value 37 | } 38 | break 39 | case Syntax.Identifier: 40 | if(parent_node && parent_node.type === Syntax.AssignmentEqual) { 41 | return node.value 42 | } else { 43 | if(node.init !== undefined) { 44 | return node.value + "=" + node.init 45 | } else { 46 | return node.value 47 | } 48 | } 49 | break 50 | } 51 | return str 52 | } 53 | 54 | module.exports = codeGenerator 55 | -------------------------------------------------------------------------------- /src/compiler/parser.js: -------------------------------------------------------------------------------- 1 | const Type = require('./type/token') 2 | const Syntax = require('./type/syntax') 3 | 4 | function Node(type, value) 5 | { 6 | 7 | } 8 | let token_list, len, pos, current_token 9 | 10 | function parse(tokens) { 11 | let ast = null 12 | token_list = tokens 13 | len = token_list.length 14 | pos = 0 15 | 16 | try { 17 | ast = parseProgram() 18 | } 19 | catch(ex) { 20 | //console.warn("parse-warn: ",ex) 21 | } 22 | return ast 23 | } 24 | 25 | function parseProgram() { 26 | let body, node 27 | node = new Node() 28 | body = parseScriptBody() 29 | let hasEqual = false 30 | for(let i = 0; i < body.length; i++) { 31 | if(body[i]) { 32 | let variableNode = body[i] 33 | for(let j=0; j < variableNode.body.length; j++){ 34 | if(variableNode.body[j].type === Syntax.EqualVariableDeclaration){ 35 | hasEqual = true 36 | break 37 | } 38 | } 39 | } 40 | if(hasEqual){ 41 | break 42 | } 43 | } 44 | if(!hasEqual){ 45 | return null 46 | } 47 | node.type = Syntax.Program 48 | node.body = body 49 | return node 50 | } 51 | 52 | function parseScriptBody() { 53 | let statement, body = [] 54 | current_token = token_list[pos] 55 | statement = parseStatementListItem() 56 | statement && (body.push(statement)) 57 | return body 58 | } 59 | 60 | function parseStatementListItem() { 61 | if (current_token.type === Type.KEYWORD) { 62 | switch (current_token.value) { 63 | case 'var': 64 | case 'let': 65 | let kind = current_token.value 66 | let node = parseVariableDeclarationList() 67 | node.kind = kind 68 | return node 69 | break 70 | } 71 | } 72 | return null 73 | } 74 | 75 | function parseVariableDeclarationList() { 76 | pos++ 77 | current_token = token_list[pos] 78 | return parseVariableDeclaration() 79 | } 80 | function parseVariableDeclaration() { 81 | let init = null, 82 | id, node = new Node(), 83 | id_list = [] 84 | if(isPunctuator("[") || isPunctuator("{")) { 85 | return null 86 | } 87 | parseEqualVariableDeclaration(id_list) 88 | node.type = Syntax.VariableDeclaration 89 | node.body = id_list 90 | return node 91 | } 92 | 93 | 94 | function parseEqualVariableDeclaration(re) { 95 | let node, equalNode, id_list 96 | current_token = token_list[pos++] 97 | while(current_token.type === Type.IDENTIFIER) { 98 | node = new Node() 99 | node.type = Syntax.Identifier 100 | node.value = current_token.value; 101 | !id_list && (id_list = []) 102 | id_list.push(node) 103 | current_token = token_list[pos++] 104 | } 105 | if(!id_list) { 106 | return 107 | } 108 | if(id_list.length > 1) { 109 | equalNode = new Node() 110 | equalNode.type = Syntax.EqualVariableDeclaration 111 | equalNode.body = id_list 112 | re.push(equalNode) 113 | } else if (id_list.length === 1) { 114 | re.push(node) 115 | } 116 | if(current_token && current_token.value === ',') { 117 | if(equalNode){ 118 | equalNode.init = undefined 119 | } else { 120 | id_list.forEach(function(n){ 121 | n.init = undefined 122 | }) 123 | } 124 | parseEqualVariableDeclaration(re) 125 | } 126 | let init = '' 127 | if(current_token && current_token.value === '=') { 128 | current_token = token_list[pos++] 129 | if (current_token.type === Type.STRING_LITERAL || current_token.type === Type.NUMBER_LITERAL || current_token.type == Type.BOOLEAN_LITERAL || current_token.type == Type.NULL_LITERAL) { 130 | if(current_token.type === Type.STRING_LITERAL) { 131 | init = '"' + current_token.value + '"' 132 | } else { 133 | init = current_token.value 134 | } 135 | current_token = token_list[pos++] 136 | } else if (current_token.type === Syntax.BR) { 137 | current_token = token_list[pos++] 138 | } else { 139 | throw new Error("语法分析错误") 140 | } 141 | if(equalNode) { 142 | equalNode.init = init 143 | } else { 144 | node.init = init 145 | } 146 | } 147 | if(current_token && current_token.value === ',') { 148 | parseEqualVariableDeclaration(re) 149 | } 150 | } 151 | 152 | function isPunctuator(type, value) { 153 | if(current_token.type === Type.PUNCTUATOR && current_token.value === value) { 154 | return true 155 | } 156 | return false 157 | } 158 | 159 | 160 | 161 | module.exports = parse 162 | -------------------------------------------------------------------------------- /src/compiler/tokenizer.js: -------------------------------------------------------------------------------- 1 | const Type = require('./type/token') 2 | 3 | const NumberReg = /[0-9]/ 4 | const LetterReg = /[a-z]/i 5 | const WhitespaceReg = /[\u0020\u00A0\u0009\u000B\u000C]/ 6 | 7 | let pos = 0 8 | let char 9 | let source 10 | let len 11 | 12 | //当前字符是否符合标识符的开始规则 13 | function isIdStart(ch) { 14 | return (ch === '$') || (ch === '_')|| 15 | (LetterReg.test(ch)) 16 | } 17 | //当前字符是否是标识符的一部分 18 | function isIdPart(ch) { 19 | return (ch === '$') || (ch === '_') || // $ and _ 20 | LetterReg.test(ch)|| // a..zA..Z 21 | NumberReg.test(ch) // 0..9 22 | } 23 | 24 | function isKeyword(id) { 25 | switch(id.length) { 26 | case 2: 27 | return (id === 'if') || (id === 'in') || (id === 'do') 28 | case 3: 29 | return (id === 'var') || (id === 'for') || (id === 'new') || 30 | (id === 'try') || (id === 'let') 31 | case 4: 32 | return (id === 'this') || (id === 'else') || (id === 'case') || 33 | (id === 'void') || (id === 'with') || (id === 'enum') 34 | case 5: 35 | return (id === 'while') || (id === 'break') || (id === 'catch') || 36 | (id === 'throw') || (id === 'const') || (id === 'yield') || 37 | (id === 'class') || (id === 'super') 38 | case 6: 39 | return (id === 'return') || (id === 'typeof') || (id === 'delete') || 40 | (id === 'switch') || (id === 'export') || (id === 'import') 41 | case 7: 42 | return (id === 'default') || (id === 'finally') || (id === 'extends') 43 | case 8: 44 | return (id === 'function') || (id === 'continue') || (id === 'debugger') 45 | case 10: 46 | return (id === 'instanceof') 47 | default: 48 | return false 49 | } 50 | } 51 | //获取标识符token 52 | function getId() { 53 | let start, ch 54 | start = pos++ 55 | ch = source[start] 56 | while(pos < len) { 57 | ch = source[pos] 58 | if(isIdPart(ch)) { 59 | ++ pos 60 | } else { 61 | break 62 | } 63 | } 64 | return source.slice(start, pos) 65 | } 66 | 67 | //扫描标识符,得出标识符类型 68 | function scanId(){ 69 | let start, id, type 70 | start = pos 71 | id = getId() 72 | if(id.length === 1){ 73 | type = Type.IDENTIFIER 74 | }else if(isKeyword(id)) { 75 | type = Type.KEYWORD 76 | } else if(id === 'null') { 77 | type = Type.NULL_LITERAL 78 | } else if(id === 'true' || id === 'false'){ 79 | type = Type.BOOLEAN_LITERAL 80 | } else { 81 | type = Type.IDENTIFIER 82 | } 83 | return { 84 | type: type, 85 | value: id 86 | } 87 | } 88 | 89 | function getNextToken(){ 90 | let cp, token 91 | if(pos > len){ 92 | return { 93 | type: Type.EOF 94 | } 95 | } 96 | cp = source[pos] 97 | if(isIdStart(cp)) { 98 | token = scanId() 99 | return token 100 | } 101 | 102 | if(cp === '(' || cp === ')' || cp === ';' || cp ===',') { 103 | token = scanPuntuator() 104 | return token 105 | } 106 | if(cp === '"'|| cp === '\'') { 107 | token = scanStringLiteral() 108 | return token 109 | } 110 | if(cp === ".") { 111 | if(isDecimalDigit(source[pos + 1])) { 112 | return scanNumberLiteral() 113 | } 114 | return scanPuntuator() 115 | } 116 | if(isDecimalDigit(cp)) { 117 | return scanNumberLiteral() 118 | } 119 | return scanPuntuator() 120 | } 121 | function scanHexLiteral() { 122 | let number = '' 123 | while(pos < len) { 124 | if(!isHexDigit(source[pos])) { 125 | break 126 | } 127 | number += source[pos++] 128 | } 129 | if(number.length === 0) { 130 | throwUnexpectedToken() 131 | } 132 | return { 133 | type: Type.NUMBER_LITERAL, 134 | value: parseInt('0x' + number, 16) 135 | } 136 | } 137 | function scanBinaryliteral() { 138 | let number = '', ch 139 | 140 | while(pos < len) { 141 | ch = source[pos] 142 | if(ch != '0' && ch != '1') { 143 | break 144 | } 145 | 146 | number += source[pos++] 147 | 148 | } 149 | 150 | if(number.length === 0) { 151 | throwUnexpectedToken() 152 | } 153 | if(pos < len) { 154 | if(isIdStart(ch) || isDecimalDigit(ch)) { 155 | throwUnexpectedToken() 156 | } 157 | } 158 | return { 159 | type: Type.NUMBER_LITERAL, 160 | value: parseInt(number, 2) 161 | } 162 | 163 | } 164 | function isOctalDigit(ch) { 165 | return "01234567".indexOf(ch) > -1 166 | } 167 | function scanOctalLiteral() { 168 | let number = '', ch, isOctal = false 169 | ch = source[pos] 170 | if(isOctalDigit(ch)) { 171 | isOctal = true 172 | number = "0" + ch 173 | } 174 | pos++ 175 | while(pos < len) { 176 | ch = source[pos] 177 | if(!isOctalDigit(ch)) { 178 | break 179 | }else{ 180 | number += source[pos++] 181 | } 182 | } 183 | if(!isOctal && number.length === 0){ 184 | throwUnexpectedToken() 185 | } 186 | if(isIdStart(ch) || isDecimalDigit(ch)) { 187 | throwUnexpectedToken() 188 | } 189 | return { 190 | type: Type.NUMBER_LITERAL, 191 | value: parseInt(number, 8) 192 | } 193 | } 194 | function isImplicitOctal(){ 195 | let i, ch 196 | for(i = (pos + 1); i 0x10FFFF || ch !== '}') { 314 | throwUnexpectedToken() 315 | } 316 | return String.fromCharCode(code) 317 | } 318 | /** 319 | * [扫描unicode字符串] 320 | * @method scanHexEscaped 321 | * @param {[type]} ch [description] 322 | * @return {[type]} [description] 323 | */ 324 | function scanHexEscaped(ch) { 325 | let length, code = 0 326 | length = ch === 'u'?4:2 327 | for(let i = 0; i < length; i++) { 328 | if(pos < len && isHexDigit(source[pos])) { 329 | ch = source[pos++] 330 | code = code * 16 + "0123456789abcdef".indexOf(ch.toLowerCase()) 331 | } else { 332 | return '' 333 | } 334 | } 335 | return String.fromCharCode(code) 336 | } 337 | /** 338 | * [扫描字符串字面量] 339 | * @method scanStringLiteral 340 | * @return {[type]} [description] 341 | */ 342 | function scanStringLiteral(){ 343 | let cp, start, str = '', ch, isValid = false, unescaped 344 | cp = source[pos] 345 | start = pos 346 | ++pos 347 | if(cp !== '"' && cp !== '\'') { 348 | throw new Error("string literal must starts with a quote") 349 | } 350 | while(pos < len) { 351 | let ch = source[pos++] 352 | if(ch === cp){ 353 | isValid = true 354 | break 355 | } 356 | if(ch === '\\') { 357 | ch = source[pos++] 358 | if(!ch || !isLineTerminal(ch)) { 359 | switch(ch) { 360 | case 'u': 361 | case 'x': 362 | if(source[pos] === '{') { 363 | ++pos 364 | str += scanUnicode() 365 | } else { 366 | unescaped = scanHexEscaped(ch) 367 | if(!unescaped) { 368 | throwUnexpectedToken() 369 | } 370 | str += unescaped 371 | } 372 | break; 373 | case 'r': 374 | case 'n': 375 | case 't': 376 | case 'b': 377 | case 'f': 378 | case 'v': 379 | str += "\\" + ch 380 | break; 381 | case '8': 382 | case '9': 383 | str += ch 384 | throwUnexpectedToken() 385 | break 386 | default: 387 | str += ch 388 | } 389 | } else { 390 | if(ch === "\r" && source[pos] === "\n") { 391 | pos++ 392 | } 393 | } 394 | } else if(isLineTerminal(ch)) { 395 | break 396 | } else { 397 | str += ch 398 | } 399 | } 400 | if(isValid) { 401 | return { 402 | type: Type.STRING_LITERAL, 403 | value: str 404 | } 405 | } 406 | else{ 407 | throwUnexpectedToken() 408 | } 409 | } 410 | /** 411 | * [扫描操作符] 412 | * @method scanPuntuator 413 | * @return {[type]} [description] 414 | */ 415 | function scanPuntuator() { 416 | let ch, token, start 417 | token = { 418 | type: Type.PUNCTUATOR, 419 | value: '' 420 | } 421 | start = pos 422 | ch = source[pos] 423 | switch(ch) { 424 | case ',': 425 | ++pos 426 | break 427 | case '=': 428 | ++pos 429 | break 430 | default: 431 | throwUnexpectedToken() 432 | } 433 | token.value = source.slice(start, pos) 434 | return token 435 | } 436 | function tokenizer(src) { 437 | pos = 0 438 | source = src 439 | let token_list = [] 440 | len = src.length 441 | try { 442 | while(pos < len) { 443 | var cp = src[pos] 444 | if(isLineTerminal(cp)) { 445 | if(!!token_list.length && token_list[token_list.length-1].type !== Type.BR) { 446 | token_list.push({ 447 | type: Type.BR, 448 | value: 'br' 449 | }) 450 | } 451 | pos++ 452 | continue 453 | } 454 | if(WhitespaceReg.test(cp)) { 455 | pos++ 456 | continue 457 | } 458 | token_list.push(getNextToken()) 459 | } 460 | } 461 | catch(ex){ 462 | } 463 | return token_list 464 | } 465 | 466 | module.exports = tokenizer 467 | -------------------------------------------------------------------------------- /src/compiler/transformer.js: -------------------------------------------------------------------------------- 1 | const Syntax=require('./type/syntax') 2 | function tranverser(old_ast, visitor) { 3 | function tranverseArray(array, parent_node) { 4 | array.forEach(function(node) { 5 | tranverseNode(node, parent_node) 6 | }) 7 | } 8 | function tranverseNode(node, parent_node) { 9 | let type = node.type 10 | let method = visitor[type] 11 | if(method && method.enter) { 12 | method.enter(node, parent_node) 13 | } 14 | switch(type) { 15 | case 'Program': 16 | tranverseArray(node.body, node) 17 | break 18 | case 'VariableDeclaration': 19 | tranverseArray(node.body, node) 20 | break 21 | case 'EqualVariableDeclaration': 22 | tranverseArray(node.body, node) 23 | break 24 | case 'Identifier': 25 | break 26 | default:throw new Error("未知的语法类型:"+node.type) 27 | } 28 | if(method && method.exit) { 29 | method.exit(node, parent_node) 30 | } 31 | } 32 | tranverseNode(old_ast, null) 33 | } 34 | 35 | function transformer(old_ast) { 36 | let new_ast = { 37 | type: 'Program', 38 | body: [] 39 | } 40 | old_ast.context = new_ast.body 41 | let visitor = { 42 | 'VariableDeclaration': { 43 | enter(node, node_parent) { 44 | let assignNode = { 45 | type: Syntax.AssignmentExpression, 46 | body:[] 47 | } 48 | let variableNode={ 49 | type: Syntax.VariableDeclaration, 50 | body: [], 51 | kind: node.kind 52 | } 53 | node.assign_context = assignNode.body 54 | node.context = variableNode.body 55 | node_parent.context.push(variableNode) 56 | node_parent.context.push(assignNode) 57 | } 58 | }, 59 | 'EqualVariableDeclaration': { 60 | enter(node,node_parent) { 61 | let assignNode = { 62 | type: 'AssignmentEqual', 63 | body: [], 64 | value: node.init 65 | } 66 | node.other_context = assignNode.body 67 | node_parent.assign_context.push(assignNode) 68 | node.context = node_parent.context 69 | } 70 | }, 71 | 'Identifier': { 72 | enter(node, node_parent) { 73 | if(node_parent.other_context) { 74 | node_parent.other_context.push(node) 75 | } 76 | node_parent.context.push(node) 77 | } 78 | } 79 | } 80 | tranverser(old_ast, visitor) 81 | return new_ast 82 | } 83 | 84 | module.exports = transformer 85 | -------------------------------------------------------------------------------- /src/compiler/type/syntax.js: -------------------------------------------------------------------------------- 1 | const Syntax = { 2 | AssignmentExpression: 'AssignmentExpression', //赋值表达式 3 | AssignmentEqual:'AssignmentEqual',//连等赋值表达式 4 | ArrayExpression: 'ArrayExpression', //数组表达式 5 | ArrayPattern: 'ArrayPattern', //数组结构赋值 6 | Identifier: 'Identifier', //变量表达式 7 | Literal: 'Literal', //字面量 8 | ObjectExpression: 'ObjectExpression', //对象表达式 9 | ObjectPattern: 'ObjectPattern', //对象结构赋值 10 | Program: 'Program', //程序 11 | VariableDeclaration: 'VariableDeclaration', //变量定义 12 | EqualVariableDeclaration: 'EqualVariableDeclaration'//连等赋值变量表达式 13 | } 14 | 15 | module.exports = Syntax 16 | -------------------------------------------------------------------------------- /src/compiler/type/token.js: -------------------------------------------------------------------------------- 1 | const tokenType = { 2 | IDENTIFIER: 1, 3 | KEYWORD: 2, 4 | EOF: 3, 5 | NULL_LITERAL: 4, 6 | BOOLEAN_LITERAL: 5, 7 | PUNCTUATOR: 6, 8 | NUMBER_LITERAL: 7, 9 | BR: 8, 10 | STRING_LITERAL: 9 11 | } 12 | module.exports = tokenType 13 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | const tokenizer = require('./compiler/tokenizer') 2 | const parser = require('./compiler/parser') 3 | const transformer = require('./compiler/transformer') 4 | const generator = require('./compiler/generator') 5 | 6 | function compile(source) { 7 | let token_list, ast, new_ast, code = '' 8 | token_list = tokenizer(source) 9 | if(token_list.length === 0){ 10 | return source 11 | } 12 | ast = parser(token_list) 13 | if(!ast) { 14 | return source 15 | } 16 | new_ast = transformer(ast) 17 | if(new_ast.body.length === 1) { 18 | return source 19 | } 20 | code = generator(new_ast) 21 | return code 22 | } 23 | 24 | module.exports = compile 25 | -------------------------------------------------------------------------------- /test/parser.test.js: -------------------------------------------------------------------------------- 1 | const parser = require('../src/compiler/parser') 2 | const expect = require('chai').expect 3 | describe("【语法分析】测试用例", function() { 4 | it("用例一", function() { 5 | const input = [{ 6 | type: 2, 7 | value: 'let' 8 | }, { 9 | type: 1, 10 | value: 'n' 11 | }, { 12 | type: 6, 13 | value: ',' 14 | }, { 15 | type: 1, 16 | value: 'm' 17 | }, { 18 | type: 1, 19 | value: 'e' 20 | }, { 21 | type: 1, 22 | value: 'f' 23 | }, { 24 | type: 1, 25 | value: 'g' 26 | }, { 27 | type: 6, 28 | value: '=' 29 | }, { 30 | type: 7, 31 | value: 10 32 | }] 33 | const expected = { 34 | "type": "Program", 35 | "body": [{ 36 | "type": "VariableDeclaration", 37 | "body": [{ 38 | "type": "Identifier", 39 | "value": "n" 40 | }, { 41 | "type": "EqualVariableDeclarations", 42 | "body": [{ 43 | "type": "Identifier", 44 | "value": "m" 45 | }, { 46 | "type": "Identifier", 47 | "value": "e" 48 | }, { 49 | "type": "Identifier", 50 | "value": "f" 51 | }, { 52 | "type": "Identifier", 53 | "value": "g" 54 | }], 55 | "init": 10 56 | }], 57 | "kind": "let" 58 | }] 59 | } 60 | const output = parser(input) 61 | console.log(JSON.stringify(output)) 62 | expect(JSON.stringify(output) === JSON.stringify(expected)).to.be.true 63 | }) 64 | it("用例二", function() { 65 | const input = [{ 66 | type: 2, 67 | value: 'let' 68 | }, { 69 | type: 1, 70 | value: 'n' 71 | }, { 72 | type: 6, 73 | value: ',' 74 | }, { 75 | type: 1, 76 | value: 'm' 77 | }, { 78 | type: 2, 79 | value: 'var' 80 | }, { 81 | type: 1, 82 | value: 'f' 83 | }, { 84 | type: 6, 85 | value: '[' 86 | }, { 87 | type: 6, 88 | value: '=' 89 | }, { 90 | type: 7, 91 | value: 10 92 | }] 93 | const expected = { 94 | "type": "Program", 95 | "body": [{ 96 | "type": "VariableDeclaration", 97 | "body": [{ 98 | "type": "Identifier", 99 | "value": "n" 100 | }, { 101 | "type": "EqualVariableDeclarations", 102 | "body": [{ 103 | "type": "Identifier", 104 | "value": "m" 105 | }, { 106 | "type": "Identifier", 107 | "value": "e" 108 | }, { 109 | "type": "Identifier", 110 | "value": "f" 111 | }, { 112 | "type": "Identifier", 113 | "value": "g" 114 | }], 115 | "init": 10 116 | }], 117 | "kind": "let" 118 | }] 119 | } 120 | const output = parser(input) 121 | console.log(JSON.stringify(output)) 122 | expect(JSON.stringify(output) === JSON.stringify(expected)).to.be.true 123 | }) 124 | }) 125 | -------------------------------------------------------------------------------- /test/tokenizer.test.js: -------------------------------------------------------------------------------- 1 | const tokenizer = require('../src/compiler/tokenizer') 2 | const expect = require('chai').expect 3 | 4 | describe("【词法分析】测试用例", function(){ 5 | it("用例一",function(){ 6 | const input = 'let n,m e f g=10' 7 | const expected = [{ 8 | type: 2, 9 | value: 'let' 10 | }, { 11 | type: 1, 12 | value: 'n' 13 | }, { 14 | type: 6, 15 | value: ',' 16 | }, { 17 | type: 1, 18 | value: 'm' 19 | }, { 20 | type: 1, 21 | value: 'e' 22 | }, { 23 | type: 1, 24 | value: 'f' 25 | }, { 26 | type: 1, 27 | value: 'g' 28 | }, { 29 | type: 6, 30 | value: '=' 31 | }, { 32 | type: 7, 33 | value: 10 34 | }] 35 | const output = tokenizer(input) 36 | expect(JSON.stringify(output) === JSON.stringify(expected)).to.be.true 37 | }) 38 | it("用例一",function(){ 39 | const input = `let n,m=true, e f g='10', 40 | fn=null,cc=0x20,zz='\u0039',ff=077,ffg = 'tests测试'` 41 | const expected = [{ 42 | type: 2, 43 | value: 'let' 44 | }, { 45 | type: 1, 46 | value: 'n' 47 | }, { 48 | type: 6, 49 | value: ',' 50 | }, { 51 | type: 1, 52 | value: 'm' 53 | }, { 54 | type: 1, 55 | value: 'e' 56 | }, { 57 | type: 1, 58 | value: 'f' 59 | }, { 60 | type: 1, 61 | value: 'g' 62 | }, { 63 | type: 6, 64 | value: '=' 65 | }, { 66 | type: 7, 67 | value: 10 68 | }] 69 | const output = tokenizer(input) 70 | expect(JSON.stringify(output) === JSON.stringify(expected)).to.be.true 71 | }) 72 | it("用例三",function(){ 73 | const input = `let e f g=011, cc= 0b11,dd=011,ffff=011bb ,ddfd=0o90,hh='\u{fefe}', 74 | fn 75 | =null,cc = 0x20nn, cdf=0x20, zz='\u0039',ffg zzh = 'tests测试', zzn=3.1e+2, zzy=33.1E+10` 76 | const expected = [{ 77 | type: 2, 78 | value: 'let' 79 | }, { 80 | type: 1, 81 | value: 'n' 82 | }, { 83 | type: 6, 84 | value: ',' 85 | }, { 86 | type: 1, 87 | value: 'm' 88 | }, { 89 | type: 1, 90 | value: 'e' 91 | }, { 92 | type: 1, 93 | value: 'f' 94 | }, { 95 | type: 1, 96 | value: 'g' 97 | }, { 98 | type: 6, 99 | value: '=' 100 | }, { 101 | type: 7, 102 | value: 10 103 | }] 104 | const output = tokenizer(input) 105 | expect(JSON.stringify(output) === JSON.stringify(expected)).to.be.true 106 | }) 107 | }) 108 | --------------------------------------------------------------------------------