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;
我是 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;