ANTLR4字符串和注释Lexer

时间:2016-09-02 16:07:08

标签: string comments antlr antlr4 lexer

我是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'|'\"'|'\\'))*'"';

2 个答案:

答案 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;