gpt4 book ai didi

java - 如何在使用 ANTLR (使用 java)解析文件后保存文件?

转载 作者:行者123 更新时间:2023-11-30 06:28:53 28 4
gpt4 key购买 nike

我正在开发一个项目,其中我获取一个 C 源文件并在每个函数调用开始时注入(inject)一些代码。 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();

翻译器类创建ANTLRInputStreamCLexerCParserCommonTokenStream。然后它使用 CodeListener 类遍历树。

翻译器.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 之类的文件中,如下例所示?

代码.c

int main(){ 
foo();
bar();
}

void foo(){
//does something
}

void bar(){
//does something else
}

解析代码.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上的任何东西来保存字符串吗?

关于java - 如何在使用 ANTLR (使用 java)解析文件后保存文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46536056/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com