向Antlr Java 8语法添加注释

向Antlr Java 8语法添加注释,java,antlr,grammar,abstract-syntax-tree,Java,Antlr,Grammar,Abstract Syntax Tree,我希望在使用antlr的Java8语法时,将“注释”记录到AST中(不是为了对它们做任何事情,而是为了以后的复制而存储) IE:我想将java源代码文件读入AST,然后最终再次输出,但要包含 我想知道是否有一个简单的语法调整,将允许这。。。(或者如果我的天真想法是必须将“评论”整合到每个表达中,这是令人悲哀的事实……)如果是这样的话。。。这是什么 COMMENT : '/*' .*? '*/' -> skip ; LINE_COMMENT : '//' ~

我希望在使用antlr的Java8语法时,将“注释”记录到AST中(不是为了对它们做任何事情,而是为了以后的复制而存储)

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

我想知道是否有一个简单的语法调整,将允许这。。。(或者如果我的天真想法是必须将“评论”整合到每个表达中,这是令人悲哀的事实……)如果是这样的话。。。这是什么

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

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

据我所见,您可以通过以下方式将评论保留在自己的“频道”中:

将此添加到语法中:

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

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

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

官方的“文档”(实际上看起来他的书是真正的“真实”文档)简要地提到了这一点:

这本书的(一个版本)说

您可以在不同的通道上向解析器发送不同的令牌。 例如,您可能需要在一个页面上添加空格和常规注释 解析Java时通道和Javadoc对另一个通道的注释


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

警告(155):java8comments.g4:1725:35:规则WS包含具有无法识别的常量值的lexer命令;lexer解释器可能产生不正确的输出

警告(155):java8comments.g4:1729:33:rule DOC_COMMENT包含具有无法识别的常量值的lexer命令;lexer解释器可能产生不正确的输出

警告(155):java8comments.g4:1733:31:规则注释包含具有无法识别的常量值的lexer命令;lexer解释器可能产生不正确的输出

警告(155):java8comments.g4:1737:31:规则行注释包含具有无法识别的常量值的lexer命令;lexer解释器可能产生不正确的输出


不需要定义自己的lexer成员。只需在中使用:
channels{WHITESPACE,COMMENTS}
lexer@MikeLischke我已经添加了从语法生成时得到的警告,但是在使用生成的文件时它似乎工作正常。。。但是当我尝试将您的评论添加到语法文件中时,我得到了[组合语法中不支持自定义频道]。(我可能遗漏了一些明显的东西(仅从antlr开始),但我不确定如何执行您的建议)啊,忘了提一下:就像lexer+parser的单个选项一样,通道也仅在非组合语法中受支持(即,lexer和parser语法有一个单独的文件)。