лексер пропускает токен

Я пытаюсь выполнить базовое сканирование на основе ANTLR. У меня проблема с лексером, который не соответствует разыскиваемым токенам.

lexer grammar DefaultLexer;

ALPHANUM    :   (LETTER | DIGIT)+;
ACRONYM     :   LETTER '.' (LETTER '.')+;
HOST        :   ALPHANUM (('.' | '-') ALPHANUM)+;

fragment
LETTER  :   UNICODE_CLASS_LL | UNICODE_CLASS_LM | UNICODE_CLASS_LO | UNICODE_CLASS_LT | UNICODE_CLASS_LU;

fragment
DIGIT   :   UNICODE_CLASS_ND | UNICODE_CLASS_NL;

Для приведенной выше грамматики строка hello. world, заданная в качестве входных данных, дает только world. В то время как я ожидал бы получить как hello, так и world. Что мне не хватает? Спасибо.

ДОБАВЛЕН:

Хорошо, я узнал, что ввод hello. world соответствует большему количеству символов с использованием правила HOST, чем ALPHANUM, поэтому lexer выберет его. Затем, когда ему не удается сопоставить ввод с правилом HOST, он не «оглядывается» на , потому что именно так работает лексер.

Как мне это обойти?


person Eugene Strizhok    schedule 02.07.2013    source источник


Ответы (1)


В качестве предисловия ANTLR 4 не будет вести себя странно. И ANTLR 3, и ANTLR 4 должны соответствовать ALPHANUM, затем выдавать 2 синтаксические ошибки, затем соответствовать еще ALPHANUM, и я могу с уверенностью заявить, что ANTLR 4 будет вести себя именно так.

  • Похоже, что ваше правило HOST больше подходит для использования в качестве host правила синтаксического анализатора.
  • Вам нужно убедиться и предоставить правило лексера, которое может соответствовать . (либо вместе, либо в виде двух отдельных токенов).
person Sam Harwell    schedule 02.07.2013
comment
Хорошо, я попробую antlr4. - person Eugene Strizhok; 03.07.2013
comment
Я не могу заставить antlr4 генерировать С#. После изменения проекта в соответствии с github.com/sharwell/antlr4cs я получаю Error 16 Unknown build error: Error: Could not find or load main class Studio во время сборки. И если я попытаюсь запустить antlr4-csharp-4.0.1-SNAPSHOT-complete.jar вручную из командной строки, он сгенерирует классы java. - person Eugene Strizhok; 03.07.2013
comment
Хорошо, я смог сгенерировать C # из командной строки, используя те же параметры, что и задача msbuild. До сих пор не знаю, почему это не работает во время сборки. - person Eugene Strizhok; 03.07.2013