我必须创建一个计算代码行的程序,忽略注释中的代码 . 我是一个和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
内的所有内容 .
拜托,你能指出我正确的方向吗?任何帮助将不胜感激 .
1 回答
解决方案
让我们简化你的语法吧!在语法中,我们将忽略词法分析器阶段的空格字符和注释(以及同时不需要的换行符!) . 例如,
COMMENT
部分将匹配一行注释或多行注释,只是跳过它们!接下来,我们将引入
counter
变量来计算仅在content
语法规则中使用的NEWLINE
标记(因为COMMENT
标记被跳过,所以NEWLINE
标记在其中!) .每当我们遇到
NEWLINE
令牌时,我们都会递增counter
变量 .