2010-03-29 2 views
1

Могу ли я построить маркерЛексер antlr3 токенов проблему

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

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

PRE: '<<' 
     ; 

Спасибо.

ответ

1

Нет, AFAIK, это невозможно «из коробки». У одного есть look-ahead-control над потоком токенов в лексере или парсере с использованием атрибута 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;).

+0

Глядя на код для IntStream.java, отрицательные целые числа разрешены в качестве параметра в LA и будут получать маркеры с предшествующими совпадениями. Так что это просто вопрос проверки ранее согласованных токенов, надеюсь, что nioo может ограничить, как далеко назад проверить. Возможно, другие языки разные, но Java позволит вам проверять предшествующие токены. – WayneH

+0

@WayneH, я проверю это, спасибо. Надеюсь, nioo тоже прочтет ваш комментарий. –