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?
@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:
\u0000..\uFFFF
;