ANTLR lexer - 可以选择较短的匹配吗?

时间:2013-12-16 00:50:33

标签: 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”。

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

1 个答案:

答案 0 :(得分:2)

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