Могу ли я создать токен
ENDPLUS: '+' (options (greedy = false;):.) * '+'
;
рассматривается лексером только в том случае, если ему предшествует токен PRE
без включения в ENDPLUS?
PRE: '<<'
;
Спасибо.
Могу ли я создать токен
ENDPLUS: '+' (options (greedy = false;):.) * '+'
;
рассматривается лексером только в том случае, если ему предшествует токен PRE
без включения в ENDPLUS?
PRE: '<<'
;
Спасибо.
Нет, AFAIK, это невозможно "из коробки". Только упреждающий контроль над потоком токенов в лексере или синтаксическом анализаторе осуществляется с помощью атрибута input
и вызова для него LA(int)
(упреждающего просмотра). Например, следующее правило лексера:
Token
: {input.LA(2) == 'b'}? .
;
соответствует любому одиночному символу, если за этим единственным символом следует b
. К сожалению, в потоке токенов нет функции input.LA(-1)
, за которой можно было бы следить. Часть {...}?
называется «синтаксическим предикатом», если вам интересно или вы хотите найти ее в Google.
Обсуждение и некоторые советы о том, как решить эту проблему, приведены здесь: http://www.antlr.org/pipermail/antlr-interest/2004-July/008673.html
Обратите внимание, что это {greedy=false;}
, а не (greedy=false;)
.