다음의 라인을 따라 하는 방법을 명확히 나타냅니다.b[c.d][e].f[g[h[i.j]]]로 object tree?, 어떻게 당신이 쓰는 알고리즘을 생성하는 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
트리/데이터 구조)그러나 내가 하려고 노력하는 자신이 처음이다. 그래서 그것은 아마도 더 나은 건설 MemberExpression 에 이 질문은 내가 할 수 있습 안내,다국어 구사 가능 직.