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)运算符:
\u0000..\uFFFF;