ANTLR4 字符串和注释词法分析器

ANTLR4 String and Comments Lexer

我是 ANTLR 的新手所以我希望你明确地为我解释。

我在 ANTLR 中有一个 /* 注释 */ (BC) 词法分析器,我希望它是这样的:

/* sample */ => BC
/* s
a
m
p
l
e */ => BC
"" => STRING
" " => STRING
"a" => STRING
"hello world " => STRING

但我得到了这个:

/* sample */
/* s
a
m
p
l
e */ => BC
""
" "
"a"
"hello world " => STRING

它只需要第一个 /* 和最后一个 */,与我的字符串标记相同。这是评论的代码:

BC: '/*'.*'*/';

和字符串:

STRING: '"'(~('"')|(' '|'\b'|'\f'|'r'|'\n'|'\t'|'\"'|'\'))*'"';

Lexer 规则默认是 greedy,这意味着它们会尝试消耗最长的匹配序列。所以他们在最后一个结束分隔符处停止。

要使规则成为非贪婪规则,请使用非贪婪规则:

BC: '/*' .*? '*/';

这将在第一个收盘*/停止,这正是您所需要的。

与您的 STRING 相同。在 The Definitive ANTLR4 Reference,第 285 页中了解它。

您也可以使用以下没有非贪婪语法的代码片段(更一般的解释):

MultilineCommentStart:        '/*' -> more, mode(COMMENTS);

mode COMMENTS;

MultilineComment:             '*/' -> mode(DEFAULT_MODE);
MultilineCommentNotAsterisk: ~'*'+ -> more;
MultilineCommentAsterisk:     '*'  -> more;