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;
我必须创建一个程序来计算忽略注释中的代码行数。我是一名使用 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;