给 Antlr 添加注释 Java 8 语法

Adding Comments to Antlr Java 8 grammar

我希望在使用 antlr 的 Java8 语法时将 'comments' 记录到 AST 中(不是对它们做任何事情,而是为了以后的再现而存储)。 https://github.com/antlr/grammars-v4/blob/master/java8/Java8.g4

IE:我想将 java 源代码文件读入 AST,然后最终再次输出,但要包含

我想知道是否对语法进行了简单的调整以允许这样做...(或者如果我天真的想法必须将 'comments' 整合到每个表达式中是可悲的事实重要...) 如果是...那是什么?

COMMENT
    :   '/*' .*? '*/' -> skip
    ;

LINE_COMMENT
    :   '//' ~[\r\n]* -> skip
    ;

据我所知,您可以通过以下方式将评论保留在自己的 'channel' 中:

将此添加到语法中:

@lexer::members {
    public static final int WHITESPACE = 1;
    public static final int COMMENTS = 2;
}

并更改为:

COMMENT
    : '/*' .*? '*/' -> channel(COMMENTS)
    ;

LINE_COMMENT
    : '//' ~[\r\n]* -> channel(COMMENTS)
    ;

来自:

官方'documentation'(实际上他的书看起来真的是'real'文档)简单的提到了这一点:

https://github.com/antlr/antlr4/blob/master/doc/grammars.md

这本书的(一个版本)说

you can send different tokens to the parser on different channels. For example, you might want whitespace and regular comments on one channel and Javadoc comments on another when parsing Java


这是我收到的来自 antlr 一代的警告:(我读到你可以忽略这些,但是......可能有更好的方法来做到这一点)

warning(155): java8comments.g4:1725:35: rule WS contains a lexer command with an unrecognized constant value; lexer interpreters may produce incorrect output

warning(155): java8comments.g4:1729:33: rule DOC_COMMENT contains a lexer command with an unrecognized constant value; lexer interpreters may produce incorrect output

warning(155): java8comments.g4:1733:31: rule COMMENT contains a lexer command with an unrecognized constant value; lexer interpreters may produce incorrect output

warning(155): java8comments.g4:1737:31: rule LINE_COMMENT contains a lexer command with an unrecognized constant value; lexer interpreters may produce incorrect output