2016-07-21 4 views
0

Я использую этот javaparser https://github.com/javaparser/javaparser, чтобы разобрать много исходных кодов java для некоторых пользователей github, чтобы сделать из них некоторую статистику (это для университетского проекта). Все, кажется, работает хорошо, но в какой-то момент, определенный исходный код выдает эту ошибку:javaparser - Лексическая ошибка: <EOF> after: ""

Exception in thread "main" com.github.javaparser.TokenMgrError: Lexical error at line 6, column 2. Encountered: <EOF> after : "" 

Это то, что написано в этом файле:

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

Это, как я разобрать файл:

... 

new NodeIterator(new NodeIterator.NodeHandler() { 
    @Override 
    public boolean handle(Node node) { 
     ... 
    }; 
}).explore(JavaParser.parse(file)); 

... 

Это класс 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); 
      } 
     } 
    } 
} 

Я понял проблему, но эта проблема останавливает весь синтаксический анализ. У меня есть много файлов для синтаксического анализа внутри a, поэтому как я могу сделать, чтобы синтаксический анализ других файлов? Или есть инструмент для проверить, есть ли java-файл «хорошо написанный» перед его разоблачением?

ответ

2

Вы не можете решить проблему, потому что это не проблема. Ошибка правильная, поскольку исходный код, который вы пытаетесь проанализировать, неверен. Он имеет комментарий, который не заканчивается до конца файла.

Если вы скомпилируете тот же исходный код с javac, вы также получите сообщение об ошибке. Это более подробно, чем в вашем javaparser, но это также ошибка, потому что источник, который вы пытаетесь проанализировать, имеет эту ошибку.

Javac выход:

Test.java:2: error: unclosed comment 
    /**<caret> 
    ^
Test.java:6: error: reached end of file while parsing 
2 errors 
+0

Итак, есть ли способ проверить, если файл я разборе хорошо написано или пропустить ошибку и продолжает анализировать? –

+0

Не похоже, что эта библиотека имеет возможности восстановления после ошибки синтаксического анализа маркера и в любом случае попадает в конец файла, в то время как токенизация трудно восстановить. Лучше всего либо игнорировать остальную часть файла, либо полный файл. –

+0

Моя проблема заключается в том, что я разбираю много файлов, и каждая из этих ошибок блокирует весь синтаксический анализ, так что вы знаете, как продолжать анализировать остальные файлы или, может быть, инструмент, чтобы проверить, хорошо ли написан файл? или нет? –