2015-01-13 4 views
5

mam prostą gramatykę, co następuje:ANTLR4: ignorowanie spacji na wejściu, ale nie te, w napisowych

grammar SampleConfig; 

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

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

Przestrzenie w wejściu są całkowicie ignorowane, w tym w ciągu dosłownym.

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

Drukuje następujące dane wyjściowe:

3: key="valuewithspacesinbetween" 

Ale spodziewałem białe przestrzenie w ciągu dosłownym być zachowana, tzn

3: key="value with spaces in between" 

Czy to możliwe, aby poprawić gramatykę Aby osiągnąć to zachowanie, czy powinienem po prostu przesłonić CommonTokenStream, aby zignorować białe spacje podczas procesu parsowania?

Odpowiedz

4

Nie należy oczekiwać żadnych spacji w regułach analizatora składni, ponieważ pomija się je w lexer.

Albo usunąć polecenie pomijania lub dokonać string regułę Lexer:

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

usunięcie polecenia pomijania jest dokładnie to, co potrzebne – raghavsood33