ANTLR lexer можно ли предпочесть более короткое совпадение?

Вот простая лексическая грамматика:

lexer grammar TextLexer;

@members
{
protected const int EOF = Eof;
protected const int HIDDEN = Hidden;
}

COMMENT: 'comment' .*? 'end' -> channel(HIDDEN);
WORD: [a-z]+ ;

WS
:   ' ' -> channel(HIDDEN)
;

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

quick brown fox commentandending

он увидит, что слово «commentandending» длиннее комментария «commentandend». Таким образом, получается токен «commentandending», а не токен «ing».

Есть ли способ изменить это поведение?


person William Jockusch    schedule 16.12.2013    source источник


Ответы (1)


Эта грамматика решит проблему в ANTLR4:

lexer grammar TextLexer;

COMMENT_BEGIN: 'comment' -> more,pushMode(MCOMMENT);
WORD_BEGIN: [a-z] -> more, pushMode(MWORD);

WS: ' ' -> channel(HIDDEN);

mode MCOMMENT;
COMMENT: .+? 'end'-> mode(DEFAULT_MODE);

mode MWORD;
WORD: [a-z]+ -> mode(DEFAULT_MODE);
person CoronA    schedule 10.03.2015