ANTLR: сопоставить неэкранированные символы? - PullRequest
1 голос
/ 10 декабря 2010

У меня есть правило, как,

charGroup
    : '[' .+ ']';

Но я предполагаю, что это будет соответствовать чему-то вроде [abc\]. Предполагая, что я хочу, чтобы он совпадал только с неэкранированными ] с, как мне это сделать? В регулярном выражении я бы использовал негативный взгляд.

Редактировать: Мне бы тоже хотелось, чтобы это было неловко / лениво, если это возможно. Чтобы соответствовать только [a] в [a][b].

Ответы [ 2 ]

2 голосов
/ 10 декабря 2010

Вы, вероятно, хотели сделать что-то вроде:

charGroup
  :  '[' ('\\' . | ~('\\' | ']'))+ ']'
  ;

, где ~('\\' | ']') соответствует одному символу, отличному от \ и ].Обратите внимание, что вы можете отрицать только отдельные символы!Нет такой вещи как ~('ab').Другая часто совершаемая ошибка состоит в том, что отрицание внутри правил синтаксического анализатора не отрицает символ, а вместо этого токен.Пример может быть в следующем порядке:

foo : ~(A | D);

A : 'a';
B : 'b';
C : 'c';
D : ~A;

Теперь правило синтаксического анализатора foo соответствует либо токену B, либо токену C (поэтому только символы 'b' и 'c') при использовании правила лексера D соответствует любому символу, кроме 'a'.

1 голос
/ 10 декабря 2010

Я бы использовал отрицательный взгляд назад

Разве это не излишне сложно?Как насчет:

charGroup
    : '[' ('\\]' | .)+ ']';
...