开发者

Does logical AND and NOT exists in ANTLR?

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜