ANTLR中是否存在逻辑AND和NOT?

Vic*_*tor 7 grammar antlr formal-languages

ANTLR中没有逻辑吗?我基本上试图否定我所拥有的规则,并且想知道它是否可能,是否存在AND逻辑?

Bar*_*ers 12

@larsmans已经提供了答案,我只想举例说明ANTLR规则中的法律否定(因为它发生了很多错误,因为它们发生了错误).

ANTLR中的否定运算符是~(代字号).在lexer规则中,~否定单个字符:

NOT_A : ~'A';
Run Code Online (Sandbox Code Playgroud)

匹配任何字符,除了'A'和:

NOT_LOWER_CASE : ~('a'..'z');
Run Code Online (Sandbox Code Playgroud)

匹配除小写ASCII字母以外的任何字符.lats示例也可以写成:

NOT_LOWER_CASE : ~LOWER_CASE;
LOWER_CASE : 'a'..'z';
Run Code Online (Sandbox Code Playgroud)

只要你否定一个字符,就可以使用它~.做这样的事情是无效的:

INVALID : ~('a' | 'aa');
Run Code Online (Sandbox Code Playgroud)

因为你不能否定字符串'aa'.

在解析器规则内部,否定不适用于字符,而是适用于令牌.所以parse规则:

parse
  :  ~B
  ;

A : 'a';
B : 'b';
C : 'c';
Run Code Online (Sandbox Code Playgroud)

匹配以外的任何字符'b',但比其他任何令牌匹配B的令牌.所以它匹配令牌A(字符'a')或令牌C(字符'c').

相同的逻辑适用于.(DOT)运算符:

  • 在lexer规则中,它匹配集合中的任何字符\u0000..\uFFFF;
  • 在解析器规则内,它匹配任何标记(任何词法分析器规则).


Fre*_*Foo 7

ANTLR为无上下文语言(CFL)生成解析器.在这种情况下,not将转化为补充和and交叉.但是,CFL在补充和交叉下不会关闭,即not(rule)不一定是CFG规则.

换句话说,这是不可能实现not,并and在一个健全的方式,所以他们不支持.