Does logical AND and NOT exists in ANTLR?

Victor picture Victor · Apr 3, 2011 · Viewed 7.1k times · Source

Is there NOT logic in ANTLR? Im basically trying to negate a rule that i have and was wondering if its possible, also is there AND logic?

Answer

Bart Kiers picture Bart Kiers · Apr 4, 2011

@larsmans already supplied the answer, I just like to give an example of the legal negations in ANTLR rules (since it happens quite a lot that mistakes are made with them).

The negation operator in ANTLR is ~ (tilde). Inside lexer rules, the ~ negates a single character:

NOT_A : ~'A';

matches any character except 'A' and:

NOT_LOWER_CASE : ~('a'..'z');

matches any character except a lowercase ASCII letter. The lats example could also be written as:

NOT_LOWER_CASE : ~LOWER_CASE;
LOWER_CASE : 'a'..'z';

As long as you negate just a single character, it's valid to use ~. It is invalid to do something like this:

INVALID : ~('a' | 'aa');

because you can't negate the string 'aa'.

Inside parser rules, negation does not work with characters, but on tokens. So the parse rule:

parse
  :  ~B
  ;

A : 'a';
B : 'b';
C : 'c';

does not match any character other than 'b', but matches any token other than the B token. So it'd match either token A (character 'a') or token C (character 'c').

The same logic applies to the . (DOT) operator:

  • inside lexer rules it matches any character from the set \u0000..\uFFFF;
  • inside parser rules it matches any token (any lexer rule).