从Antlr4 ParseTree重新生成源保留空格

时间:2016-06-21 07:51:53

标签: antlr antlr4

我能够使用Java.g4语法并生成词法分析器和解析器。这个语法用于开始。我有一个 ParseTree ,我走了它并改变我想要的东西并将其写回Java源代码文件。虽然ParseTree没有直接改变。

所以例如这是代码。但我也修改方法名称并为方法添加注释。在某些情况下,我还删除了方法参数

    @Override
    public void enterClassDeclaration(JavaParser.ClassDeclarationContext ctx) {
        printer.write( intervals );
        printer.writeList(importFilter );
        ParseTree pt = ctx.getChild(1);
        /*
            The class name is changed by a visitor because
            we get a ParseTree back
         */
        pt.accept(new ParseTreeVisitor<Object>() {

            @Override
            public Object visitChildren(RuleNode ruleNode) {
                return null;
            }

            @Override
            public Object visitErrorNode(ErrorNode errorNode) {
                return null;
            }

            @Override
            public Object visit(ParseTree parseTree) {
                return null;
            }

            @Override
            public Object visitTerminal(TerminalNode terminalNode) {
                String className = terminalNode.getText();
                System.out.println("Name of the class is [ " + className + "]");
                printer.writeText( classModifier.get() + " class " + NEW_CLASS_IDENTIFIER );
                return null;
            }
        });
    }

但我不确定如何在保留所有原始空格的同时打印更改的Java代码。

这是怎么做到的?

更新:似乎空白和评论都在那里,但不容易访问。所以看起来我需要专门跟踪它们并将它们与代码一起编写。但不确定。

更具体地说,代码就是这个。

          package x;

          import java.util.Enumeration;
          import java.util.*;

当我点击第一个ImportDeclarationContext时,我需要存储所有隐藏空间标记。当我写回这段代码时,我也希望包含这些空格。

解决方案:

请勿跳过,但请添加到HIDDEN频道

 //
 // Whitespace and comments
 //

 WS  :  [ \t\r\n\u000C]+ -> channel(HIDDEN)
     ;

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

使用此类代码将其取回

我使用它来获取每个方法之前的空格和注释。但是也应该可以从其他地方获得空白。我想。

((CommonTokenStream) tokens).getHiddenTokensToLeft( classOrInterfaceModifierContext.getStart().getTokenIndex(),
                                                                Token.HIDDEN_CHANNEL);

0 个答案:

没有答案