2016-07-24 26 views
0

我的java应用程序必须解析很多java源代码,我正在使用这个解析器https://github.com/javaparser/javaparserJava - 检查java文件是否写得很好

这是我称之为解析单个文件的另一功能的功能:

private static void createSimplifiedAST(String userFolder, String userProjectFolder, ArrayList userProjectFiles){ 
    File projectDir = new File(usersFolderPath + userFolder + "/" + userProjectFolder); 

    // explore all java files inside a directory (user's project folder) 
    new DirExplorer((level, path, file) -> path.endsWith(".java"), (level, path, file) -> { 
     System.out.println(path); 
     System.out.println(Strings.repeat("=", path.length())); 

     // create root of simplified AST of user's single file 
     TreeNode<String> projectSingleFile = new ArrayMultiTreeNode<String>("projectFileTreeRoot"); 

     // create simplified AST of user's single file 
     declarationNumber = 0; 
     forNumber = 0; 
     forEachNumber = 0; 
     whileNumber = 0; 
     try { 
      iterateASTNodes(file, projectSingleFile); 
     } catch (ParseException ex) { 
      Logger.getLogger(JavaSourceCodeParser.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException ex) { 
      Logger.getLogger(JavaSourceCodeParser.class.getName()).log(Level.SEVERE, null, ex); 
     } 

     // prints single file tree 
     System.out.println(projectSingleFile); 

     // save simplified ASTs to txts 
     saveASTToTxt(userFolder, userProjectFolder, file, projectSingleFile); 

     // add simplified AST of single file to user's project files array list 
     userProjectFiles.add(projectSingleFile); 

    }).explore(projectDir); 
} 

这是解析单个文件的功能:

private static void iterateASTNodes(File file, TreeNode<String> treeNode) throws ParseException, IOException{ 
    try { 
     new NodeIterator(new NodeIterator.NodeHandler() { 
      @Override 
      public boolean handle(Node node) { 
       if (node instanceof VariableDeclarator) { 
        treeNode.add(new ArrayMultiTreeNode<>("declaration" + declarationNumber)); 
        declarationNumber++; 
        return false; 
       } else if (node instanceof ForStmt) { 
        treeNode.add(new ArrayMultiTreeNode<>("for" + forNumber)); 
        forNumber++; 
        iterateASTNodesWrapper(node, treeNode.find("for" + (forNumber - 1))); 
        return false; 
       } else if (node instanceof ForeachStmt) { 
        treeNode.add(new ArrayMultiTreeNode<>("foreach" + forEachNumber)); 
        forEachNumber++; 
        iterateASTNodesWrapper(node, treeNode.find("foreach" + (forEachNumber - 1))); 
        return false; 
       } else if (node instanceof WhileStmt) { 
        treeNode.add(new ArrayMultiTreeNode<>("while" + whileNumber)); 
        whileNumber++; 
        iterateASTNodesWrapper(node, treeNode.find("while" + (whileNumber - 1))); 
        return false; 
       } else { 
        return true; 
       } 
      } 
     }).explore(JavaParser.parse(file)); 
    } catch (ParseException | IOException ex) { 
     System.err.println(" ERROR: lexical error!"); 
    } 
} 

这是NodeIterator类:

public class NodeIterator { 
    public interface NodeHandler { 
     boolean handle(Node node); 
    } 

    private NodeHandler nodeHandler; 

    public NodeIterator(NodeHandler nodeHandler) { 
     this.nodeHandler = nodeHandler; 
    } 

    public void explore(Node node) { 
     if (nodeHandler.handle(node)) { 
      for (Node child : node.getChildrenNodes()) { 
       explore(child); 
      } 
     } 
    } 
} 

而且DirExplorer类:

public class DirExplorer { 
    public interface FileHandler { 
     void handle(int level, String path, File file); 
    } 

    public interface Filter { 
     boolean interested(int level, String path, File file); 
    } 

    private FileHandler fileHandler; 
    private Filter filter; 

    public DirExplorer(Filter filter, FileHandler fileHandler) { 
     this.filter = filter; 
     this.fileHandler = fileHandler; 
    } 

    public void explore(File root) { 
     explore(0, "", root); 
    } 

    private void explore(int level, String path, File file) { 
     try { 
      if (file.isDirectory()) { 
       for (File child : file.listFiles()) { 
        explore(level + 1, path + "/" + child.getName(), child); 
       } 
      } else { 
       if (filter.interested(level, path, file)) { 
        fileHandler.handle(level, path, file); 
       } 
      } 
     } catch (Exception e) { 
      System.out.println(" ERROR: something went wrong!\n"); 
     } 
    } 
} 

当我运行该程序,在某些时候,它停止在解析该文件:

public class Test { 
    /**<caret> 
    public void foo() { 
    } 
} 

我已经认识到它停止,因为词法错误的,这样的:

Exception in thread "main" com.github.javaparser.TokenMgrError: Lexical error at line 6, column 2. Encountered: <EOF> after : "" 
at com.github.javaparser.ASTParserTokenManager.getNextToken(ASTParserTokenManager.java:2480) 
at com.github.javaparser.ASTParser.jj_ntk(ASTParser.java:9154) 
at com.github.javaparser.ASTParser.ClassOrInterfaceBody(ASTParser.java:829) 
at com.github.javaparser.ASTParser.ClassOrInterfaceDeclaration(ASTParser.java:470) 
at com.github.javaparser.ASTParser.TypeDeclaration(ASTParser.java:398) 
at com.github.javaparser.ASTParser.CompilationUnit(ASTParser.java:203) 
at com.github.javaparser.JavaParser.parse(JavaParser.java:111) 
at com.github.javaparser.JavaParser.parse(JavaParser.java:158) 
at com.github.javaparser.JavaParser.parse(JavaParser.java:177) 
at javasourcecodeparser.JavaSourceCodeParser.iterateASTNodes(JavaSourceCodeParser.java:89) 
at javasourcecodeparser.JavaSourceCodeParser.lambda$createSimplifiedAST$1(JavaSourceCodeParser.java:178) 
at javasourcecodeparser.DirExplorer.explore(DirExplorer.java:35) 
at javasourcecodeparser.DirExplorer.explore(DirExplorer.java:31) 
at javasourcecodeparser.DirExplorer.explore(DirExplorer.java:31) 
at javasourcecodeparser.DirExplorer.explore(DirExplorer.java:31) 
at javasourcecodeparser.DirExplorer.explore(DirExplorer.java:31) 
at javasourcecodeparser.DirExplorer.explore(DirExplorer.java:31) 
at javasourcecodeparser.DirExplorer.explore(DirExplorer.java:31) 
at javasourcecodeparser.DirExplorer.explore(DirExplorer.java:31) 
at javasourcecodeparser.DirExplorer.explore(DirExplorer.java:24) 
at javasourcecodeparser.JavaSourceCodeParser.createSimplifiedAST(JavaSourceCodeParser.java:194) 
at javasourcecodeparser.JavaSourceCodeParser.main(JavaSourceCodeParser.java:225) 

现在,这个错误停止了整个程序,我无法解析其他“好”的代码。

我想要的是,该程序必须跳过带有词法错误的文件,并继续解析其他文件。

任何想法?也许试图编译每个文件并解析它只有编译成功?

+0

问题要求我们推荐或找到一本书,***工具,软件库***,教程或其他非现场资源,因为它们倾向于吸引自以为是的答案和垃圾邮件,所以不适合堆栈溢出。相反,请描述问题以及到目前为止解决问题所做的工作。 –

回答

1

您还没有表现出我们的堆栈跟踪,但我想到的是,异常被抛出在调用此方法:

JavaParser.parse(file) 

如果是的话,解决的方法就是调整你的代码,以便您可以捕获抛出的异常通过该呼叫,然后继续下一个文件。

+0

是的,我已经尝试过使用try-catch语句,但是错误终止程序,但是我不知道我是否正确使用它,所以你可以给我一个try catch的例子吗? –

+0

您如何向我们展示您尝试的代码。实际的代码。另外,实际的堆栈跟踪。 –

+0

你确定你在'iterateASTNodes'中捕获正确的异常吗?栈跟踪表示它是'TokenMgrError' ... –