Antlr4 игнорирует токены

В ANTLR 4 я пытаюсь проанализировать текстовый файл, но некоторые из моих определенных токенов постоянно игнорируются в пользу других. Я привел небольшой пример, чтобы показать, что я имею в виду:

Файл для разбора:

hello world
hello world

Грамматика:

grammar TestLexer;

file : line line;
line : 'hello' ' ' 'world' '\n';

LINE : ~[\n]+? '\n';

В книге ANTLR объясняется, что "привет" станет неявным токеном, который помещается перед токеном LINE, и этот порядок токенов имеет значение. Так что я ожидаю, что парсер НЕ будет соответствовать токену LINE, но это так, как показывает получившееся дерево:

Неожиданный результат

Как я могу это исправить, чтобы получить действительные неявные токены?

Btw. Я также пытался писать явные токены до LINE, но это ничего не изменило.

1 ответ

Решение

Нашел это сам

Кажется, что ANTLR сначала выбирает самые длинные токены. Так как LINE всегда будет соответствовать целой строке, это всегда предпочтительнее.

Чтобы по-прежнему включать в грамматику некоторый токен "джокер", он должен быть одним символом. В моем случае

grammar TestLexer;

file : line line;
line : 'hello' ' ' 'world' '\n';

LINE : ~[\n];

должно сработать.

Другие вопросы по тегам