2015-01-13 2 views
5

ich eine einfache Grammatik wie folgt:ANTLR4: ignorieren weißen Flächen im Eingabe aber nicht diejenigen, die in Stringliterale

grammar SampleConfig; 

line: ID (WS)* '=' (WS)* string; 

ID: [a-zA-Z]+; 
string: '"' (ESC|.)*? '"' ; 
ESC : '\\"' | '\\\\' ; // 2-char sequences \" and \\ 
WS: [ \t]+ -> skip; 

Die Räume im Eingangs werden komplett ignoriert, einschließlich der in der Stringliteral.

final String input = "key = \"value with spaces in between\""; 
final SampleConfigLexer l = new SampleConfigLexer(new ANTLRInputStream(input)); 
final SampleConfigParser p = new SampleConfigParser(new CommonTokenStream(l)); 
final LineContext context = p.line(); 
System.out.println(context.getChildCount() + ": " + context.getText()); 

Dies druckt die folgende Ausgabe:

3: key="valuewithspacesinbetween" 

Aber ich die weißen Räume im String erwartet wörtlichen, ist es möglich

3: key="value with spaces in between" 

Ist also beibehalten werden, um die Grammatik zu korrigieren Um dieses Verhalten zu erreichen, oder sollte ich einfach CommonTokenStream überschreiben, um Whitespace während des Parsing-Prozesses zu ignorieren?

Antwort

4

Sie sollten keine Leerzeichen in Parserregeln erwarten, da Sie sie in Ihrem Lexer überspringen.

entweder den Sprungbefehl entfernen oder string eine Lexer Regel machen:

STRING : '"' ('\\' [\\"] | ~[\\"\r\n])* '"'; 
+0

den Sprungbefehl zu entfernen, ist genau das, was ich brauchte, – raghavsood33