我能够使用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);