निम्नलिखित लाइनों के साथ कैसे करने के लिए स्पष्ट रूप से प्रतिनिधित्व करते हैं.बी[सी.d][e].एफ[जी[h[मैं.j]]] एक वस्तु के रूप में पेड़?, कैसे आप लिखने के लिए एक एल्गोरिथ्म उत्पन्न करने के लिए है कि जे एस AST से अभिव्यक्ति a.b[c.d][e].f[g[h[i.j]]]
? मैं कोशिश कर रहा हूँ लिखने के लिए एक पार्सर उत्पन्न करने के लिए कुछ प्रकार की वस्तु संरचना से इस अभिव्यक्ति (आदर्श रूप में अधिक से अधिक सहज जे एस AST MemberExpression
एक है, इसलिए है कि अन्य प्रश्न). मैं होगा की तरह देखने के लिए कैसे एल्गोरिथ्म काम करता है का निर्माण करने के लिए जावास्क्रिप्ट 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 में इस सवाल है, तो मैं काम कर सकते हैं कि.