2010-03-10 8 views
7

क्या एक ही समय में एक पार्स पेड़ उत्पन्न करना संभव है क्योंकि मैं रिकर्सिव वंश पार्सर का उपयोग यह जांचने के लिए करता हूं कि डेटा व्याकरण से मेल खाता है या नहीं?क्या व्याकरण को सत्यापित करने और एक ही समय में पार्स पेड़ बनाने के लिए रिकर्सिव डेसेंट पार्सर का उपयोग करना संभव है?

यदि हां, तो मैं पेड़ बनाने के लिए किस दृष्टिकोण का उपयोग करूंगा जैसा कि मैं बार-बार वंश करता हूं?

धन्यवाद, बोडा साइडो।

नोट: मैं पार्सिंग के लिए नया हूं। (एसओ पर पहले से ही कई प्रश्न पूछे गए हैं, और मैं इसके साथ बेहतर हो रहा हूं।)

उत्तर

6

हां, यह संभव है। ऐसा करने के लिए आप जो कार्यान्वयन चाहते हैं उस पर निर्भर करेगा।

पहले, अपने नोड को परिभाषित: यहां एक नमूना है कि आप के लिए काम कर सकते हैं है

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 एक नोड बना और वापस कर सकता है, जिसे रूट नोड में जोड़ा जाएगा।

आप उपर्युक्त प्रक्रिया का उपयोग कर पार्स पेड़ या एक साधारण सार पेड़ बना सकते हैं। चूंकि पार्स फ़ंक्शन रूट नोड देता है, जो कि किसी भी और सभी बच्चों के नोड्स का संदर्भ देगा, आपके पास पार्सिंग के बाद पार्स पेड़ तक पूर्ण पहुंच होगी।

चाहे आप एक विषम या सजातीय पार्स पेड़ का उपयोग करते हैं, आपको इसे उपयोगी बनाने के लिए पर्याप्त जानकारी संग्रहीत करने की आवश्यकता होगी।

+1

उत्कृष्ट उत्तर, कालेब। यह मुझे तुरंत जा रहा है, और मुझे लगता है कि मैं इसे खुद लिखने में सक्षम हो जाऊंगा! लेकिन क्या आप "पार्स पेड़" और "अमूर्त पेड़" और "' विषम 'और "समरूप" पर्स पेड़ों के बीच अंतर पर स्पष्टीकरण दे सकते हैं? (मुझे अभी तक अंतर नहीं पता है लेकिन मुझे जानना अच्छा लगेगा!) – bodacydo

+1

सजातीय - एक पेड़ जिसमें एक ही प्रकार के नोड होते हैं। विषम - एक पेड़ जिसमें विभिन्न प्रकार के नोड होते हैं। एक पार्स पेड़ इनपुट डेटा की संरचना का प्रतिनिधित्व करता है और आमतौर पर अनावश्यक वाक्यविन्यास होता है। एक सार वाक्यविन्यास पेड़ वह है जो आवश्यक संरचना और सूचना को बनाए रखता है लेकिन अनावश्यक संरचना या वाक्यविन्यास को समाप्त करता है। मैंने अपनी पोस्ट को संशोधित करने के लिए संशोधित किया कि पेड़ कैसे गहरा होता है - मुझे उम्मीद है कि यह स्पष्ट करता है। –

+0

व्याख्या करने के लिए धन्यवाद! मैं पहले ही कार्यान्वित कर रहा हूं। :) मैं पूछूंगा कि मैं अटक गया हूं। मेरा पेड़ अमूर्त, विषम वृक्ष होने जा रहा है। :) – bodacydo

संबंधित मुद्दे