-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparser.ts
37 lines (34 loc) · 902 Bytes
/
parser.ts
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
import { openListDelimiters, closeListDelimiters } from './tokenizer'
// A node can be a list, atom, number, string
export function parse (tokens) {
let list
let path = []
for (let i = 0, token; token = tokens[i]; i++) {
if (openListDelimiters.indexOf(token) !== -1) {
if (!list) {
list = []
} else {
setPath([], path, list)
}
path.push(0)
} else if (closeListDelimiters.indexOf(token) !== -1) {
path.pop()
path[path.length - 1]++
} else {
setPath(token, path, list)
path[path.length - 1]++
}
}
return list
}
export function getPath (path, tree) {
let value = tree
for (let i = 0, len = path.length; i < len; i++) {
value = value[path[i]]
}
return value
}
export function setPath (value, path, tree) {
getPath(path.slice(0, path.length - 1), tree)[path[path.length - 1]] = value
return tree
}