हां, यह संभव है। ऐसा करने के लिए आप जो कार्यान्वयन चाहते हैं उस पर निर्भर करेगा।
पहले, अपने नोड को परिभाषित: यहां एक नमूना है कि आप के लिए काम कर सकते हैं है
class ParseTreeNode {
private final String name;
private final List<ParseTreeNode> children = /* new */;
public ParseTreeNode(String name) {
this.name = name;
}
public void addChild(ParseTreeNode child) {
children.add(child);
}
इसके बाद, आप एकीकृत करने के लिए है कि आपके पुनरावर्ती वंश कार्यों में की आवश्यकता होगी:
class RDParser {
ParseTreeNode parse(Input input) {
ParseTreeNode root = createParseTreeNodeNamed("Root")
switch (input.nextToken()) {
case OPT1:
root.addChild(createParseTreeNodeNamed("Opt1"));
break;
case OPT2:
while (/*someCondition*/) {
root.addChild(createParseTreeNodeNamed("Opt2-sibling" + /* i */));
}
case SUBTREE:
ParseTreeNode subtree = createParseTreeNodeNamed("Subtree");
root.addChild(subtree);
parseSubtree(subtree, input);
break;
default:
error("Input %s was not in the expected first/follow sets", input.nextToken());
}
}
void parseSubtree(ParseTreeNode node, Input input) {
node.addChild(createParseTreeNodeNamed("subtree-child"));
/* ... */
}
/* and other functions do similarly */
ParseTreeNode createParseTreeNodeNamed(String name) {
return new ParseTreeNode(name);
}
}
आप के रूप में अपने पार्स पेड़ को नीचे उतरो, शायद आप जो भी नया "रूट" नोड भेजना चाहते हैं, ताकि बच्चों को इसमें जोड़ा जा सके। वैकल्पिक रूप से, parseSubtree
एक नोड बना और वापस कर सकता है, जिसे रूट नोड में जोड़ा जाएगा।
आप उपर्युक्त प्रक्रिया का उपयोग कर पार्स पेड़ या एक साधारण सार पेड़ बना सकते हैं। चूंकि पार्स फ़ंक्शन रूट नोड देता है, जो कि किसी भी और सभी बच्चों के नोड्स का संदर्भ देगा, आपके पास पार्सिंग के बाद पार्स पेड़ तक पूर्ण पहुंच होगी।
चाहे आप एक विषम या सजातीय पार्स पेड़ का उपयोग करते हैं, आपको इसे उपयोगी बनाने के लिए पर्याप्त जानकारी संग्रहीत करने की आवश्यकता होगी।
स्रोत
2010-03-10 20:01:54
उत्कृष्ट उत्तर, कालेब। यह मुझे तुरंत जा रहा है, और मुझे लगता है कि मैं इसे खुद लिखने में सक्षम हो जाऊंगा! लेकिन क्या आप "पार्स पेड़" और "अमूर्त पेड़" और "' विषम 'और "समरूप" पर्स पेड़ों के बीच अंतर पर स्पष्टीकरण दे सकते हैं? (मुझे अभी तक अंतर नहीं पता है लेकिन मुझे जानना अच्छा लगेगा!) – bodacydo
सजातीय - एक पेड़ जिसमें एक ही प्रकार के नोड होते हैं। विषम - एक पेड़ जिसमें विभिन्न प्रकार के नोड होते हैं। एक पार्स पेड़ इनपुट डेटा की संरचना का प्रतिनिधित्व करता है और आमतौर पर अनावश्यक वाक्यविन्यास होता है। एक सार वाक्यविन्यास पेड़ वह है जो आवश्यक संरचना और सूचना को बनाए रखता है लेकिन अनावश्यक संरचना या वाक्यविन्यास को समाप्त करता है। मैंने अपनी पोस्ट को संशोधित करने के लिए संशोधित किया कि पेड़ कैसे गहरा होता है - मुझे उम्मीद है कि यह स्पष्ट करता है। –
व्याख्या करने के लिए धन्यवाद! मैं पहले ही कार्यान्वित कर रहा हूं। :) मैं पूछूंगा कि मैं अटक गया हूं। मेरा पेड़ अमूर्त, विषम वृक्ष होने जा रहा है। :) – bodacydo