Проблема с токеном Lexer antlr3 - PullRequest
1 голос
/ 29 марта 2010

Могу ли я построить токен

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

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

PRE: '<<'
       ;

Спасибо.

1 Ответ

1 голос
/ 29 марта 2010

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

...