Ich habe viele ANTLR Grammatiken gesehen, die Verarbeitung von Leerzeichen wie folgt verwenden:ANTLR4: Leer Handhabung
WS: [ \n\t\r]+ -> skip;
// or
WS: [ \n\t\r]+ -> channel(HIDDEN);
So sind die Whitespaces weggeworfen werden jeweils an den verborgenen Kanal senden.
Mit einer Grammatik wie folgt aus:
grammar Not;
start: expression;
expression: NOT expression
| (TRUE | FALSE);
NOT: 'not';
TRUE: 'true';
FALSE: 'false';
WS: [ \n\t\r]+ -> skip;
gültige Eingaben ‚ nicht wahr‘ oder ‚falsch nicht‘, sondern auch ‚nottrue‘, die nicht ein erwünschtes Ergebnis ist. Ändern der Grammatik:
grammar Not;
start: expression;
expression: NOT WS+ expression
| (TRUE | FALSE);
NOT: 'not';
TRUE: 'true';
FALSE: 'false';
WS: [ \n\t\r];
behebt das Problem, aber ich will nicht die Leerzeichen manuell in jeder Regel behandeln.
Im Allgemeinen möchte ich ein Leerzeichen zwischen jedem Token mit einigen Ausnahmen (z. B. '! True' braucht kein Leerzeichen dazwischen).
Gibt es eine einfache Möglichkeit, dies zu tun?
Danke. Das funktioniert wie gewünscht für '* nottrue *' (ungültig) und '*! True *' (gültig). Haben Sie auch eine Idee, wie ich eine Ausnahme von dieser Regel machen kann, so dass es für einige andere Eingaben möglich ist, den Whitespace wegzulassen? Wie '* A B true *', wobei das Leerzeichen zwischen A und B optional ist. Also gilt das auch: '* AB true *', aber '* ABtrue *' nicht. – flux