2017-12-31 16 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를 생성해야한다. 이제는 for 루프를 구문 분석하는 메서드가 주석 처리되었지만 (필자는 완료하지 못했습니다) 어쨌든 동일한 오류가 발생했습니다. javaparser가 잘못된 문장을 파싱 할 수는 있지만 "", "< =", "+", "-"와 관련된 문제가 있습니다. 이 명소를 지우면 모든 것이 효과가 있습니다. 여기javaparse를 사용하여 for-loop을 구문 분석하는 동안 오류가 발생했습니다.

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"); 
} 
} 

: 내가 분석 할 여기

enter image description here

내 Class.java입니다 : 내가 javaparser 코어-3.1.0.jar 여기

를 사용하는 것은 내 오류입니다 내 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 파일에서 Java가 아닌 것을 구문 분석하는 "올바른"방법은 없습니다.

코드가 JavaParser 파일에서 어떻게 끝 났는지 궁금합니다. 코드 생성기에서 오류가 발생 했습니까? 부정확 한 파일을 리버스 엔지니어링하는 대신 발전기를 고칠 수있는 기회가 있습니까?

면책 조항 : 저는 JavaParser 제공자입니다.

+0

고맙습니다. Class.java에서이 잘못된 코드를 직접 작성했으며 모든 것이 정상이지만이 심볼에 "<", "=>", "+", "-"문제가 있습니다. 이 기호가 없으면 파싱됩니다. – Viola

관련 문제