Проблема с токеном Lexer antlr3

Могу ли я создать токен

ENDPLUS: '+' (options (greedy = false;):.) * '+'
       ;

рассматривается лексером только в том случае, если ему предшествует токен PREбез включения в ENDPLUS?

PRE: '<<'
       ;

Спасибо.


person Community    schedule 29.03.2010    source источник


Ответы (1)


Нет, 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;).

person Bart Kiers    schedule 29.03.2010
comment
Глядя на код для IntStream.java, отрицательные целые числа разрешены в качестве параметра для LA и получат ранее совпадающие токены. Таким образом, это просто вопрос проверки ранее совпадающих токенов, надеюсь, nioo сможет ограничить, насколько далеко назад нужно проверять. Возможно, другие языки отличаются, но Java позволит вам проверить предыдущие токены. - person WayneH; 30.03.2010
comment
@WayneH, я проверю, спасибо. Надеюсь, nioo тоже прочитает ваш комментарий. - person Bart Kiers; 30.03.2010