2013-03-19 8 views
12

मैं कई ANTLR व्याकरण है कि इस तरह से व्हाइटस्पेस से निपटने का उपयोग देखा है।ANTLR4:</p> <pre><code>WS: [ ntr]+ -> skip; // or WS: [ ntr]+ -> channel(HIDDEN); </code></pre> <p>तो व्हाइटस्पेस दूर फेंक दिया जाता है क्रमशः छिपा चैनल पर भेज दें: व्हाइटस्पेस से निपटने

इस तरह एक व्याकरण के साथ

:

grammar Not; 

start:  expression; 
expression: NOT expression 
      | (TRUE | FALSE); 

NOT: 'not'; 
TRUE: 'true'; 
FALSE: 'false'; 
WS: [ \n\t\r]+ -> skip; 

मान्य इनपुट हैं 'सच नहीं' या 'नहीं झूठी' लेकिन यह भी 'nottrue' जो एक वांछित परिणाम नहीं है। के व्याकरण बदलने:

grammar Not; 

start:  expression; 

expression: NOT WS+ expression 
      | (TRUE | FALSE); 

NOT: 'not'; 

TRUE: 'true'; 
FALSE: 'false'; 

WS: [ \n\t\r]; 

फिक्स समस्या है, लेकिन मैं प्रत्येक नियम में मैन्युअल रूप से व्हाइटस्पेस को संभालने के लिए नहीं करना चाहती।

आम तौर पर मैं कुछ अपवादों के साथ प्रत्येक टोकन के बीच एक सफेद जगह चाहता हूं (उदा। '! सच' के बीच में एक सफेद जगह की आवश्यकता नहीं है)।

क्या ऐसा करने का कोई आसान तरीका है?

उत्तर

11

IDENTIFIER लेक्सर नियम जोड़ें जो शब्दों को नहीं संभालते हैं।

IDENTIFIER : [a-zA-Z]+; 

अब पाठ nottrue एक भी IDENTIFIER टोकन जो अपने पार्सर not true में अलग खोजशब्दों के स्थान पर स्वीकार नहीं करेगा है।

सुनिश्चित करें कि आपके अन्य कीवर्ड के बाद परिभाषित किया गया है। लेक्सर को पता चलेगा कि NOT और IDENTIFIER टेक्स्ट not से मेल खाते हैं, और व्याकरण में दिखाई देने वाले पहले व्यक्ति को टोकन प्रकार असाइन करेंगे।

+0

धन्यवाद। यह '* नोट्रू *' (अमान्य) और '*! सच *' (वैध) के लिए वांछित के रूप में काम करता है। क्या आपको यह भी पता है कि मैं इस नियम का अपवाद कैसे बना सकता हूं, ताकि व्हाइटस्पेस को छोड़ने के लिए कुछ अन्य इनपुटों के लिए यह संभव हो? '* ए बी सच्चा *' की तरह, जहां ए और बी के बीच व्हाइटस्पेस वैकल्पिक है। तो यह भी मान्य है: '* एबी सच *', लेकिन '* ABtrue *' नहीं। – flux

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