gpt4 book ai didi

java - 使用 javaparse 解析 for 循环时出错

转载 作者:行者123 更新时间:2023-12-02 02:24:09 26 4
gpt4 key购买 nike

这是我上一个问题的连续:How to parse a for-loop using Javaparser? 。我正在尝试将这个不正确的 for 循环: FOR(j, k, 15, >, -); 解析为正确的形式: for (var j = k; j > 15 ; j--){}。意思就是将Class.java解析为类ClassAltered.java。我的代码应该使用正确的循环创建新类 ClassAltered.java 。现在我解析 for 循环的方法已被注释(我还没有完成),但无论如何我有同样的错误。我确信 javaparser 可以解析不正确的语句,但我对“">”、“<=”、“+”、“-”有问题。如果我删除这个景点,一切都会正常。我使用javaparser-core-3.1.0.jar

这是我的错误:

enter image description here

这是我要解析的 Class.java:

public class Class {
public static void main(String[] args) {
method1();
method2();
}

public static void method1() {
FOR(j, k, 15, >, -);
System.out.println("FOR(j, k, 15, >, -) test");
}

public static void method2() {
FOR(j, 0, 10, <=, +);
System.out.println("FOR(j, 0, 10, <=, +) test");
}
}

这是我的 Main.class:

 import com.github.javaparser.JavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.expr.*;
import com.github.javaparser.ast.stmt.ForStmt;

import javax.tools.*;

import java.io.*;
import java.util.*;

public class Main {

public static void main(String[] args) throws IOException {
final String fileName = "Class.java";
final String alteredFileName = "src\\ClassAltered.java";
CompilationUnit cu;
try(FileInputStream in = new FileInputStream(fileName)){
cu = JavaParser.parse(in);
}

//cu.getChildNodesByType(ForStmt.class)
//.forEach(Main::setForStatement);

cu.getClassByName("Class").get().setName("ClassAltered");

try(FileWriter output = new FileWriter(new File(alteredFileName), false)) {
output.write(cu.toString());
}

File[] files = {new File(alteredFileName)};
String[] options = { "-d", "out//production//Synthesis" };

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
try (StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null)) {
Iterable<? extends JavaFileObject> compilationUnits =
fileManager.getJavaFileObjectsFromFiles(Arrays.asList(files));
compiler.getTask(
null,
fileManager,
diagnostics,
Arrays.asList(options),
null,
compilationUnits).call();

diagnostics.getDiagnostics().forEach(d -> System.out.println(d.getMessage(null)));
}
}

/*private static void setForStatement(ForStmt forStmt) {

MethodCallExpr initializer = (MethodCallExpr) forStmt.getInitialization().get(0);

if (initializer.getArguments().size() == 5
&& initializer.getArgument(1) instanceof IntegerLiteralExpr
&& initializer.getArgument(2) instanceof IntegerLiteralExpr) {
IntegerLiteralExpr a1 = (IntegerLiteralExpr) initializer.getArgument(1);
IntegerLiteralExpr a2 = (IntegerLiteralExpr) initializer.getArgument(2);
}
}*/
}

最佳答案

我认为您不应该转述 JavaParser 处理错误语句的方式。解析不正确的语句是一件复杂而脆弱的事情。没有“正确”的方法来解析 Java 文件中非 Java 的内容。

我想知道该代码如何最终出现在 JavaParser 文件中:它是由某些错误的代码生成器生成的吗?您有机会修复该生成器而不是对不正确的文件进行逆向工程吗?

免责声明:我是 JavaParser 贡献者

关于java - 使用 javaparse 解析 for 循环时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48041650/

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