簡體   English   中英

使用javaparse解析for循環時出錯

[英]Error while parsing for-loop using javaparse

這是我先前的問題的延續: 如何使用Javaparser解析for循環? 我試圖解析這個不正確的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

這是我的錯誤:

在此處輸入圖片說明

這是我要解析的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貢獻者

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM