java - 为 Antlr Java 8 语法添加注释

标签 java antlr grammar abstract-syntax-tree

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

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

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

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)
    ;

来自:https://stackoverflow.com/a/17960734/2801237

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

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

关于java - 为 Antlr Java 8 语法添加注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37504826/

相关文章:

Java 多输入对话框

java - 在 Antlr 3 中生成自定义 JavaDoc

java - 使用 url 表达式

java - 我无法将jsp页面连接到mysql服务器

c++ - Ant : C++ target with visual studio 2008

python - python 2.7 中没有名为 antlr4 的模块

javascript - PEGJS:如何将 NOT (!) 逻辑运算符添加到解析 AND (&&) OR (||) 逻辑语句的语法中

grammar - 上下文无关语言的闭包性质

闭包和上下文无关语法

java - Hadoop 2.6.x 和 Amazon AWS SDK Library 冲突 http-core 冲突