2013-02-21 33 views
7

मैं बेस क्लास श्रोता को विस्तारित कर रहा हूं और कुछ मूल्यों में पढ़ने का प्रयास कर रहा हूं, हालांकि आदेश में कोई पदानुक्रम नहीं लगता है। इस प्रकारएएनटीएलआर 4: वृक्ष निर्माण

एक मेरी व्याकरण का संस्करण है कटौती:

start: config_options+ 
config_options: (KEY) EQUALS^ (PATH | ALPHANUM) (' '|'\r'|'\n')* ; 

KEY: 'key' ; 
EQUALS: '=' ; 
ALPHANUM: [0-9a-zA-Z]+ ; 

हालांकि इस कार्यान्वयन की पार्स पेड़ config_options स्तर (टर्मिनल स्तर) पर सपाट है iethe शासन शुरू config_options के कई बच्चे हैं, लेकिन बराबर होती है config_options के उप-नियमों की जड़ नहीं है, सभी टोकन के पास रूट नोड के रूप में नियम config_options है। मैं टर्मिनलों में से एक को रूट नोड कैसे बना सकता हूं?

इस विशेष नियम में मैं नहीं चाहता कि किसी भी रिक्त स्थान पर कब्जा कर लिया जाए, मुझे पता है कि>> लेक्सर के लिए निर्देशित छोड़ दिया गया है, हालांकि कुछ ऐसे मामले हैं जहां मुझे अंतरिक्ष चाहिए। स्ट्रिंग में यानी ' "' (ALPHANUM | '') '"'

(नोट:^काम करने के लिए प्रतीत नहीं होता है) इनपुट के लिए

एक उदाहरण है:

कुंजी = abcdefg

कुंजी = 90weata

कुंजी = acbefg9

सभी मैं करना चाहता हूँ कुंजी और मान जोड़े निकालने है। मैं उम्मीद करता हूं कि '=' जड़ होगी और दो बच्चे कुंजी और मूल्य होंगे।

उत्तर

7

जब आप अपने व्याकरण तैयार करते हैं तो ^ ऑपरेटर, जो ANTLR 4. ANTLR 4 में हटा दिया गया था के उपयोग पर एक सिंटैक्स त्रुटि हो रही किया जाना चाहिए पार्स पेड़, जड़ों की जो परोक्ष नियमों से परिभाषित कर रहे हैं उत्पन्न करता है आपके व्याकरण में दूसरे शब्दों में, आपके द्वारा पार्स पेड़ नोड्स के ऊपर दिए गए व्याकरण के लिए start और config_options होगा।

उत्पन्न config_options नियम Config_optionsContext का एक उदाहरण वापस आ जाएगी, जो निम्न विधियों में शामिल हैं:

  • KEY() रिटर्न KEY टोकन के लिए एक TerminalNode
  • EQUALS() (EQUALS टोकन के लिए एक ही)
  • PATH() (PATH टोकन के लिए एक ही)
  • ALPHANUM() (ALPHANUM टोकन के लिए एक ही)

आप एक TerminalNode पर getSymbol() फोन Token पाने के लिए कर सकते हैं उदाहरण।

+0

आप टर्मिनलों के बीच संबंध परिभाषित करने में सक्षम कैसे होंगे? यानी बराबर चिह्न के बच्चे मिलते हैं। या यह एएनटीएलआर 4 में मान्य विचार नहीं है? क्या पार्स पेड़ के बजाय एएसटी बनाने का कोई तरीका है? – Har

+1

@ user1932405, उदाहरण के लिए एक अतिरिक्त नियम, 'मान' बनाएं:' config_options: कुंजी इक्विटी मान; मूल्य: (पथ | अल्फानम) ('' | '\ r' | '\ n') *; –

+0

ओह ठीक है, इसके लिए धन्यवाद, इसलिए बीमार को पार्स नियमों के आधार पर एएसटी बनाना है, न कि टोकन। – Har

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