ANTLR lexer——人们可以选择较短的匹配吗?
下面是一个简单的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 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);