下沿线的 如何清楚的表示。b[c。d][e]。f[g[h[i。j]]]作为一个对象树?, 你会怎么写的一个算法产生的,JS AST从表达式 a.b[c.d][e].f[g[h[i.j]]]
? 我想写一个分析程序产生某种形式的对象结构,从这一表(理想的情况更加直观的比JS AST MemberExpression
一,因此,其它问题)。 我想看看如何算法的工作构建JavaScript MemberExpression
树。
目前,我有这样的算法产生 的某些种类的 树木(但它似乎是不正确的前):
const patterns = [
[/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*/, 'name'],
[/^\[/, 'open'],
[/^\]/, 'close'],
[/^\./, 'stem']
]
console.log(parsePath('a.b[c.d][e].f[g[h[i.j]]]'))
function parsePath(str) {
let node
let nest = []
let result = nest
let stack = [nest]
while (str.length) {
nest = stack[stack.length - 1]
p:
for (let pattern of patterns) {
let match = str.match(pattern[0])
if (match) {
if (pattern[1] === 'name') {
node = {
form: `term`,
name: match[0],
link: []
}
nest.push(node)
} else if (pattern[1] === 'stem') {
stack.push(node.link)
} else if (pattern[1] === 'open') {
node = {
form: 'read',
link: []
}
nest.push(node)
stack.push(node.link)
} else if (pattern[1] === 'close') {
stack.pop()
}
str = str.substr(match[0].length)
break p
}
}
}
return result[0]
}
所希望的结果是这个(或更好、更直观数据结构,如果你是那么倾向于创建一个):
{
"type": "MemberExpression",
"object": {
"type": "MemberExpression",
"object": {
"type": "MemberExpression",
"object": {
"type": "MemberExpression",
"object": {
"type": "MemberExpression",
"object": {
"type": "Identifier",
"name": "a"
},
"property": {
"type": "Identifier",
"name": "b"
},
"computed": false
},
"property": {
"type": "MemberExpression",
"object": {
"type": "Identifier",
"name": "c"
},
"property": {
"type": "Identifier",
"name": "d"
},
"computed": false
},
"computed": true
},
"property": {
"type": "Identifier",
"name": "e"
},
"computed": true
},
"property": {
"type": "Identifier",
"name": "f"
},
"computed": false
},
"property": {
"type": "MemberExpression",
"object": {
"type": "Identifier",
"name": "g"
},
"property": {
"type": "MemberExpression",
"object": {
"type": "Identifier",
"name": "h"
},
"property": {
"type": "MemberExpression",
"object": {
"type": "Identifier",
"name": "i"
},
"property": {
"type": "Identifier",
"name": "j"
},
"computed": false
},
"computed": true
},
"computed": true
},
"computed": true
}
原因我苦苦挣扎的(部分)是我不喜欢这个 MemberExpression
树形结构,这是落后的感觉并不是非常直观的。 所以如果你可以构建一个更简单的更简单的数据结构,将是理想(这是其他问题),但如果不再只是一个算法建造这会让我去的。
就个人而言,我宁愿尝试产生这种结构,因为我找到它更加直观:
{
type: 'site',
site: [
{
type: 'term',
term: 'a'
},
{
type: 'term',
term: 'b'
},
{
type: 'sink',
sink: [
{
type: 'term',
term: 'c'
},
{
type: 'term',
term: 'd'
}
]
},
{
type: 'sink',
sink: [
{
type: 'term',
term: 'e'
}
]
},
{
type: 'term',
term: 'f'
},
{
type: 'sink',
sink: [
{
type: 'term',
term: 'g'
},
{
type: 'sink',
sink: [
{
type: 'term',
term: 'h'
},
{
type: 'sink',
sink: [
{
type: 'term',
term: 'i'
},
{
type: 'term',
term: 'j'
}
]
}
]
}
]
}
]
}
但无论哪一个对我的作品(或两者)。
如果我们有第二个,我的下一个问题将如何转换,数据结构进入 MemberExpression
树的数据结构:)但是我会试着做我自己的第一个。 所以它可能是更好地构造的成员在这个问题,那么我可以工作。