के साथ विफल रहा एक सरल व्याकरण है:ANTLR AST नियम RewriteEmptyStreamException
grammar sample;
options { output = AST; }
assignment
: IDENT ':=' expr ';'
;
expr
: factor ('*' factor)*
;
factor
: primary ('+' primary)*
;
primary
: NUM
| '(' expr ')'
;
IDENT : ('a'..'z')+ ;
NUM : ('0'..'9')+ ;
WS : (' '|'\n'|'\t'|'\r')+ {$channel=HIDDEN;} ;
अब मैं कुछ पुनर्लेखन नियम जोड़ने के लिए एक एएसटी उत्पन्न करना चाहते हैं। मैं ऑनलाइन और भाषा पैटर्न पुस्तक में क्या पढ़ा है से, मैं इस तरह व्याकरण को संशोधित करने में सक्षम होना चाहिए:
assignment
: IDENT ':=' expr ';' -> ^(':=' IDENT expr)
;
expr
: factor ('*' factor)* -> ^('*' factor+)
;
factor
: primary ('+' primary)* -> ^('+' primary+)
;
primary
: NUM
| '(' expr ')' -> ^(expr)
;
लेकिन यह काम नहीं करता। हालांकि यह ठीक से संकलित करता है, जब मैं पार्सर चलाता हूं तो मुझे एक रिवाइट EmptyStreamException त्रुटि मिलती है। यहां वह जगह है जहां चीजें अजीब होती हैं।
यदि मैं छद्म टोकन एडीडी और मल्टी को परिभाषित करता हूं और पेड़ नोड अक्षर के बजाय उनका उपयोग करता हूं, तो यह बिना त्रुटि के काम करता है।
tokens { ADD; MULT; }
expr
: factor ('*' factor)* -> ^(MULT factor+)
;
factor
: primary ('+' primary)* -> ^(ADD primary+)
;
वैकल्पिक रूप से, अगर मैं नोड प्रत्यय संकेतन का उपयोग, यह भी ठीक से काम करने के लिए प्रकट होता है:
expr
: factor ('*'^ factor)*
;
factor
: primary ('+'^ primary)*
;
एक बग व्यवहार में इस विसंगति है?
धन्यवाद एक टन @ जोएलपीएम। यही वह है जिसकी तलाश में मैं हूं। मूल्यांकन करते समय हमें घोंसले हुए पेड़ और ढेर के साथ बहने का मुद्दा था।यह हमें एन-आरी पेड़ उत्पन्न करने का मौका देता है और वृक्ष की गहराई को कम करता है –