首页 文章

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

提问于
浏览
0

我必须创建一个计算代码行的程序,忽略注释中的代码 . 我是一个和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*/ ,解析器会识别这个,这是错误的:

enter image description here

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

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

1 回答

  • 1

    解决方案

    让我们简化你的语法吧!在语法中,我们将忽略词法分析器阶段的空格字符和注释(以及同时不需要的换行符!) . 例如, 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;
    

相关问题