用antlr(使用Java)解析文件后如何保存文件



我正在研究一个项目,在该项目中,我正在使用C源文件并在每个函数调用开始时注入一些代码。Main加载文件并将其变成字符串。

main.java

            String inputFilename = args[0];
            byte[] bytes = Files.readAllBytes(Paths.get(inputFilename));
            String code = new String(bytes, StandardCharsets.UTF_8);
            Translator translator = new Translator(code);
            translator.translate();

Translator类创建ANTLRInputStreamCLexerCParserCommonTokenStream。然后它使用CodeListener类行走。

Translator.java

public Translator(String code){
    ANTLRInputStream inputStream = new ANTLRInputStream(code);
    CLexer lexer = new CLexer(inputStream);
    tokens = new CommonTokenStream(lexer);
    CParser parser = new CParser(tokens);
    parseTree = parser.compilationUnit();
}
void translate(){
    walker = new ParseTreeWalker();
    CodeListener listener = new CodeListener(tokens);
    walker.walk(listener, parseTree);
    parsedCode = listener.rewriter.getText();
    saveFile();
}
void saveFile(){
    try (PrintStream out = new PrintStream(new FileOutputStream("filename.txt"))){
        out.print(parsedCode);
    } catch (Exception e){
        e.printStackTrace();
    }
}

}

CodeListener类插入了功能主体开头的评论,//hey look a function

codelistener.java

public TokenStreamRewriter rewriter;
String parsedCode = "";
 @Override
public void enterFunctionDefinition(CParser.FunctionDefinitionContext ctx) {
    String returnType = ctx.declarationSpecifiers().getText();
    String functionBody = ctx.compoundStatement().getText();
    rewriter.insertBefore(ctx.compoundStatement().getStart(), "//hey look a function ");
}

我找到了修改后的流,但是有什么方法可以获取新修改的代码?如下所示,如何将其保存到parsedcode.c之类的文件中?

code.c

int main(){ 
    foo();
    bar();
}
void foo(){
   //does something
}
void bar(){
   //does something else
}

parsedCode.c

int main(){
    //hey look a function 
    foo();
    bar();
}
void foo(){
   //hey look a function
   //does something
}
void bar(){
   //hey look a function
   //does something else
}

您不能只致电toString()TokenStreamRewriter上的任何内容并保存字符串?

相关内容

  • 没有找到相关文章

最新更新