-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparser.js
38 lines (34 loc) · 1.17 KB
/
parser.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
const program = require('./parserCombinator.js')
function tokenizer(str) {
// [\s,]* 匹配任意个数的空格或逗号,但不捕获
// ~@|[\[\]{}()'`~^@] 捕获 ~@ 符号或 []{}()'`~^@ 中任意一个符号
// "(?:\\.|[^\\"])*" 捕获双引号中的内容,如果中间出现带反斜杠的双引号, 则包含在内
// ;.* 捕获注释
// [^\s\[\]{}('"`,;)]* 捕获所有特殊字符的字符串
let tokens = []
const regex = /[\s,]*(~@|[\[\]{}()'`~^@]|"(?:\\.|[^\\"])*"|;.*|[^\s\[\]{}('"`,;)]*)/g
// 使用带有 /g 参数的正则表达式时,可对同一个字符串多次调用 exec 方法,
// 每次调用都会更新 lastIndex (下一次匹配开始的位置)
let i = 0
while ((match = regex.exec(str))[1] != '') {
// 注释忽略不处理
if (match[0] === ';') continue
tokens.push({
token: match[1],
arrIndex: i++,
strIndex: match.index,
input: match.input
})
}
return tokens
}
function parser(tokens) {
const errManager = {
restTokens: tokens,
errorInfo: ''
}
const { ast, err } = program(tokens, errManager)
if (ast) return ast
throw err.errorInfo
}
module.exports = { tokenizer, parser }