ANTLR lexer——人们可以选择较短的匹配吗?

ANTLR lexer——人们可以选择较短的匹配吗?,antlr,lexer,Antlr,Lexer,下面是一个简单的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) ; 在大多数情况下,它的行为和预期的一样,从流

下面是一个简单的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
它将看到“commentandend”一词比“commentandend”一词长。因此,它使用了一个标记“commentandending”,而不是一个标记“ing”


有没有办法改变这种行为?

此语法将解决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);