2016-05-12 18 views
3

Ich versuche eine Grammatik in antlr4 zu schreiben. Aber ich kann Whitespaces in meinen Regeln nicht selektiv ignorieren. Meine Grammatik anhängen. Hier sollte ich ein Leerzeichen (ein Token von WHITESPACE) zulassen, wenn das Token mit alphaNumericWSC übereinstimmt, aber an allen anderen Stellen möchte ich den WHITESPACE überspringen.Wie Antlr-Grammatik Strings mit Leerraum erkennen?

WHITESPACE : [ \t\n\r]+ -> skip 
alphaNumericWSC : AlphaNumeric (',' AlphaNumeric)* 
       | AlphaNumeric (' ' AlphaNumeric)* 
       ; 

Mit anderen Worten möchte ich den Whitespace nicht nur in dieser Regel alphaNumericWSC ignorieren.

Vielen Dank im Voraus für die Hilfe.

+2

Sie eine lexikalische Regel für Strings verwenden sollte, 'string:‚„‘ ~ ‚“‘‚"‘ '(note '' 'ist' '' ohne Leerzeichen. Die Gierigkeit des ANTLR-Lexers wird die Aufgabe erledigen. – Mephy

+0

Whitespace ist für Lexer, nicht für Parser. – EJP

Antwort

2

Die angegebene Lexer-Whitespace-Regel verbraucht alle Leerzeichen, bevor sie den Parser erreicht. Wenn Leerzeichen für den Parser wichtig sind, sollten Sie sie daher nicht verwenden.

ANTLR bietet Lexer-Modi, die zum Umschalten zwischen whitespace-sensitiven und insensitiven Quellregionen verwendet werden können. Modi erfordern die Identifizierung einiger eindeutiger Quellenmerkmale, die zum Umschalten zwischen Modi verwendet werden können. Die Frage ist genau wann AlphaNumeric (' ' AlphaNumeric)* gültig ist. Wenn es speziell anwendbar Marker, sagt := führende und ; zum Beispiel Hinter, definieren Sie den Modus:

alphaNumericWSC : AlphaNumeric (Comma AlphaNumeric)* 
       | AlphaNumeric (WS AlphaNumeric)* 
       ; 


AlphaNumeric : AlphaNum ; 
Mark   : ':=' -> pushMode(WSS); 
Semi   : ';' ; 
Comma   : ',' ; 
WHITESPACE : [ \t\n\r]+ -> skip; 

mode WSS; 
WS   : ' '+ ; 
AlphaNumeric2 : AlphaNum -> type(AlphaNumeric); 
Semi2   : ';'  -> type(Semi), popMode(); 
WHITESPACE2 : [\t\n\r]+ -> skip; 

fragment AlphaNum : .... ;