@ larsmans уже предоставили ответ, я просто хотел бы привести пример юридических отрицаний в правилах ANTLR (так как с ними часто случается ошибка).
Оператор отрицания в ANTLR равен ~
(тильда). Внутри правил лексера, ~
отрицает один символ:
NOT_A : ~'A';
соответствует любому символу, кроме 'A'
и:
NOT_LOWER_CASE : ~('a'..'z');
соответствует любому символу, кроме строчной буквы ASCII. Пример лат также может быть записан как:
NOT_LOWER_CASE : ~LOWER_CASE;
LOWER_CASE : 'a'..'z';
Пока вы отрицаете только один символ, допустимо использовать ~
. неверно делать что-то вроде этого:
INVALID : ~('a' | 'aa');
потому что вы не можете отрицать строку 'aa'
.
Внутри правил парсера отрицание не работает с символами, но с токенами. Итак, правило parse
:
parse
: ~B
;
A : 'a';
B : 'b';
C : 'c';
не не соответствует любому символу, кроме 'b'
, но соответствует любому токену, кроме B
. Таким образом, он будет соответствовать токену A
(символ 'a'
) или токену C
(символ 'c'
).
Та же логика применяется к оператору .
(DOT):
- внутри правил лексера соответствует любому символу из набора
\u0000..\uFFFF
;
- внутри правил парсера он соответствует любому токену (любому правилу лексера).