我是ANTLR的新手,所以我希望你的家伙明确地向我解释。
我在ANTLR中有一个/ *注释* /(BC)lexer,我希望它是这样的:
/* sample */ => BC
/* s
a
m
p
l
e */ => BC
"" => STRING
" " => STRING
"a" => STRING
"hello world \1" => STRING
但我得到了这个:
/* sample */
/* s
a
m
p
l
e */ => BC
""
" "
"a"
"hello world \1" => STRING
它只接受第一个/ *和最后一个* /,与我的String标记相同。这是评论代码:
BC: '/*'.*'*/';
字符串:
STRING: '"'(~('"')|(' '|'\b'|'\f'|'r'|'\n'|'\t'|'\"'|'\\'))*'"';
答案 0 :(得分:3)
Lexer规则默认为贪心,这意味着他们会尝试使用最长的匹配序列。所以他们停在最后一个结算分隔符。
要使规则不贪婪,请使用,以及非常规规则:
BC: '/*' .*? '*/';
这将停在第一次结束*/
,这正是您所需要的。
与您的STRING相同。请参阅 The Definitive ANTLR4 Reference ,第285页。
答案 1 :(得分:1)
此外,您可以使用以下代码片段而不使用非贪婪语法(更常见的灵魂):
MultilineCommentStart: '/*' -> more, mode(COMMENTS);
mode COMMENTS;
MultilineComment: '*/' -> mode(DEFAULT_MODE);
MultilineCommentNotAsterisk: ~'*'+ -> more;
MultilineCommentAsterisk: '*' -> more;