2014-10-25 1 views
0

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

Файл для анализа:

hello world 
hello world 

Грамматика:

grammar TestLexer; 

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

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

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

Unexpected Result

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

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

ответ

2

Найдено это сам:

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

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

grammar TestLexer; 

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

LINE : ~[\n]; 

будет работать.

+0

Он выбирает самый длинный токен, и если есть более 1 кандидата, он выбирает первый (самый верхний) из них. – Onur

+0

Если вы хотите сделать что-нибудь полезное с LINE в своем парсере или последующей обработке, это должно быть правило анализатора. В большинстве случаев это нормально только для большого количества текста для одного токена для комментариев и т. Д. – Onur

+0

Я хотел использовать его больше для неполной грамматики, где у меня есть токен, который соответствует всему, что еще не охвачено. Поэтому, в конце концов, я больше не ожидаю, что что-то будет соответствовать этому токену. –