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开发者_StackOverflow社区 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:
- inside lexer rules it matches any character from the set
\u0000..\uFFFF
; - inside parser rules it matches any token (any lexer rule).
ANTLR produces parsers for context-free languages (CFLs). In that context, not
would translate to complement and and
to intersection. However, CFLs aren't closed under complement and intersection, i.e. not(rule)
is not necessarily a CFG rule.
In other words, it's impossible to implement not
and and
in a sane way, so they're not supported.
精彩评论