Как анализировать исходные файлы Java с помощью Clojure - PullRequest
5 голосов
/ 21 февраля 2012

Я пытаюсь проанализировать исходные файлы Java с помощью Clojure, но не могу найти способ сделать это.

Сначала я подумал об использовании плагина Eclipse AST (скопировав необходимые JAR-файлы в мой проект Clojure), но я сдался, увидев API Eclipse AST (посетитель на основе посетителя).

Затем я попытался создать анализатор Java с ANTLR. Я могу найти только одну грамматику Java 1.6 для ANTLR (http://openjdk.java.net/projects/compiler-grammar/antlrworks/Java.g), и она не компилируется с последним ANTLR ( здесь - это ошибки, которые я получаю).

Теперь я понятия не имею, как я могу это сделать. В худшем случае я попытаюсь использовать Eclipse AST.

Кто-нибудь знает лучший способ для анализа файлов Java с Clojure?

Спасибо.

Редактировать: Чтобы уточнить мою точку зрения: Мне нужно найти некоторые конкретные вызовы методов в проектах Java и проверить их параметры (у нас есть несколько определений метода с различными типами параметров). Сейчас у меня есть простое решение, написанное на Java (Eclipse AST), но я хочу максимально использовать Clojure в этом проекте.

Ответы [ 2 ]

4 голосов
/ 21 февраля 2012

... и он не компилируется с последним ANTLR ...

Я не мог воспроизвести это.

Используя ANTLR v3.2, я получил несколько предупреждений, но без ошибок. Используя ANTLR v3.3 и v3.4 (последняя версия), у меня нет проблем с генерацией парсера.

Вы не упомянули, как вы (пытаетесь) сгенерировать лексер / парсер, но вот как это работает для меня:

java -cp antlr-3.4.jar org.antlr.Tool Java.g

РЕДАКТИРОВАТЬ 1

Вот мой вывод при запуске команд:

ls
wget http://www.antlr.org/download/antlr-3.4-complete.jar
wget http://openjdk.java.net/projects/compiler-grammar/antlrworks/Java.g
java -cp antlr-3.4-complete.jar org.antlr.Tool Java.g
ls

enter image description here

Как видите, .java файлы лексера и парсера созданы правильно.

РЕДАКТИРОВАТЬ 2

Вместо того, чтобы генерировать синтаксический анализатор самостоятельно (из грамматики), вы можете использовать существующий синтаксический анализатор, такой как this one (Java 1.5 только AFAIK) и вызывать его из своего кода Clojure.

2 голосов
/ 21 февраля 2012

Это немного зависит от того, что вы хотите сделать - что вы надеетесь получить от анализа?

Если вы хотите на самом деле скомпилировать Java или хотя бы собрать AST, то вам, вероятно, нужно идти по маршруту ANTLR или Eclipse AST. Java не так уж плох в разборе языка, но вы все еще, вероятно, не хотите изобретать слишком много колес ..... так что вы могли бы также использовать Eclipse и OpenJDK.

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

  • fnparse (Clojure, не уверен, насколько хорошо поддерживается)
  • jparsec (Java, но, вероятно, его довольно легко использовать из Clojure)
...