2017-12-31 48 views
0

これまでの質問はHow to parse a for-loop using Javaparser?です。私はこの不適切なfor-loop:FOR(j, k, 15, >, -);を正しい形式に構文解析しようとしています:for (var j = k; j > 15; j--){}。 Class.javaをクラスClassAltered.javaに解析することを意味します。私のコードでは、新しいクラスClassAltered.javaを正しいloop-forで作成する必要があります。今、forループを解析する私のメソッドはコメントされています(私はそれを終了していません)、とにかく私は同じエラーがあります。 javaparserが間違った文を解析できると確信していますが、 ">"、 "< ="、 "+"、 " - "の問題があります。この場所を削除すれば、すべてが機能します。 私はここでjavaparserコア-3.1.0.jarjavaparseを使用してfor-loopを解析中にエラーが発生しました

を使用するには、私のエラーです:ここでは

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); 
    } 
}*/ 
} 

答えて

0

私はあなたがrelする必要はないと思いますJavaParserが間違ったステートメントを処理する途中で。誤った文の解析は、複雑で脆弱なものです。 Javaファイルではないものを解析する「正しい」方法はありません。

コードがJavaParserファイルでどのようになってしまったのでしょうか。コード生成プログラムによって生成されたのでしょうか?あなたは間違ったファイルをリバースエンジニアリングするのではなく、そのジェネレータを修正できますか?

免責事項:私は

+0

JavaParser寄稿していますが、あなたの答えをいただき、ありがとうございます。私は自分自身のためにClass.javaでこの不正なコードを作成しましたが、すべてはOKですが、このシンボル "<", "=>"、 "+"、 " - "に問題があります。この記号がなければ、それは解析されます。 – Viola

関連する問題