Antlr4:如何匹配多行注释中的行尾?

Antlr4: How can I match end of lines inside multiline comments?

我必须创建一个程序来计算忽略注释中的代码行数。我是一名使用 Antlr 的 新手 ,在尝试了很多之后,我最接近的解决方案是这个错误的语法:

grammar Comments;
comment         :   startc content endc;
startc          :   '/*';
endc            :   '*/';
content         :   newline | contenttext;
contenttext     :   CONTENTCHARS+;
newline         :   '\r\n';
CONTENTCHARS
    :   ~'*' '/'
    |   ~'/' .
    ;
WS              :   [ \r\t]+ -> skip;

如果我尝试使用 /*hello\r\nworld*/,解析器会识别出这个错误:

为了计算行数,解析器需要检测换行符、多行注释内外。我想我的问题是我不知道怎么说“匹配 /**/ except \r\n.[=16= 中的所有内容]

拜托,你能给我指明正确的方向吗?任何帮助将不胜感激。

解决方案

让我们来简化您的语法!在语法中,我们将在词法分析器阶段忽略空白字符和注释(同时忽略不需要的换行符!)。例如 COMMENT 部分将匹配一行注释或多行注释并跳过它们!

接下来,我们将介绍 counter 变量,用于计算仅在 content 语法规则中使用的 NEWLINE 个标记(因为 COMMENT 标记被跳过,所以 NEWLINE令牌在里面!)。

每当我们遇到 NEWLINE 标记时,我们都会增加 counter 变量。

grammar Comments;

@lexer::members {
    int counter = 0;
}

WS : [ \r\t]+ -> skip;
COMMENT : '/*' .*? '*/' NEWLINE? -> skip;
TEXT : [a-zA-Z0-9]+;
NEWLINE : '\r'? '\n' { {System.out.println("Newlines so far: " + (++counter)); } };

content: (TEXT | COMMENT | NEWLINE )* EOF;