2015-01-13 10 views
5

Ho una semplice grammatica come segue:ANTLR4: ignorare gli spazi bianchi in ingresso, ma non quelli in stringhe letterali

grammar SampleConfig; 

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

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

Gli spazi in ingresso sono completamente ignorati, compresi quelli nella stringa letterale.

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()); 

Questa stampa il seguente output:

3: key="valuewithspacesinbetween" 

Ma, mi aspettavo gli spazi bianchi nella stringa letterale da conservare, cioè

3: key="value with spaces in between" 

E 'possibile correggere la grammatica per ottenere questo comportamento o devo semplicemente ignorare CommonTokenStream per ignorare gli spazi bianchi durante il processo di analisi?

risposta

4

Non ci si dovrebbe aspettare spazi nelle regole del parser poiché si stanno saltando nel lexer.

O rimuovere il comando di salto o fare string una regola lexer:

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

rimozione del comando di salto è esattamente quello che mi serviva – raghavsood33

Problemi correlati