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];
должно сработать.