Вы, вероятно, хотели сделать что-то вроде:
charGroup
: '[' ('\\' . | ~('\\' | ']'))+ ']'
;
, где ~('\\' | ']')
соответствует одному символу, отличному от \
и ]
.Обратите внимание, что вы можете отрицать только отдельные символы!Нет такой вещи как ~('ab')
.Другая часто совершаемая ошибка состоит в том, что отрицание внутри правил синтаксического анализатора не отрицает символ, а вместо этого токен.Пример может быть в следующем порядке:
foo : ~(A | D);
A : 'a';
B : 'b';
C : 'c';
D : ~A;
Теперь правило синтаксического анализатора foo
соответствует либо токену B
, либо токену C
(поэтому только символы 'b'
и 'c'
) при использовании правила лексера D
соответствует любому символу, кроме 'a'
.