Создание отчета AST из Java исходного кода без его фактического запуска - PullRequest
0 голосов
/ 08 марта 2020

Так что я провожу весь день, пытаясь понять, как работать с ANTLR. У меня есть куча Java файлов исходного кода. Моя цель - использовать ANTLR для создания AST для каждого из этих файлов. В конце концов, AST будет преобразован в JSON, так что будет проще проанализировать каждый из них с помощью динамического c языка, такого как python. Преобразование будет использовать решение в этом topi c (хотя, если у кого-то есть лучшее решение, я буду рад услышать). Мне удалось запустить пример basi c на странице Getting-Start * . Теперь я пытаюсь выяснить, как создать AST для одного из моих Java файлов исходного кода. Как сказано на странице Getting-Start * , я могу использовать для этого Java грамматику . Я скачал JavaParser.g4 и JavaLexer.g4. Я попытался запустить:

java -Xmx500M -cp "/p/antlr-4.8-complete.jar:$CLASSPATH" org.antlr.v4.Tool JavaParser.g4

Но я получаю ошибку:

JavaParser.g4:32:21: cannot find tokens file ./JavaLexer.tokens

Я думаю, мне нужно как-то создать этот файл, но я не мог понять, как, из документов. Поэтому я попытался найти этот файл в Github и нашел его здесь . Я скачал его, и оно выглядело нормально:

java -Xmx500M -cp "/p/antlr-4.8-complete.jar:$CLASSPATH" org.antlr.v4.Tool JavaParser.g4
javac JavaP*.java // Also tried javac Java*.java
java -Xmx500M -cp "/p/antlr-4.8-complete.jar:$CLASSPATH" org.antlr.v4.gui.TestRig JavaParser r -gui

Но я получаю:

Exception in thread "main" java.lang.ClassCastException: class JavaParser                                                                                                                                            
        at java.lang.Class.asSubclass(Class.java:3404)                                                                                                                                                               
        at org.antlr.v4.gui.TestRig.process(TestRig.java:135)                                                                                                                                                        
        at org.antlr.v4.gui.TestRig.main(TestRig.java:119) 

Не уверен, что я делаю неправильно или я делаю правильные вещи, чтобы решить моя проблема. Все, что я хочу сделать, это создать AST файла /tmp/file.java, и я даже не уверен, где мне следует включить его в команды. Итак, мои вопросы:

  1. Как мне создать AST для файла /tmp/file.java?
  2. Можно ли создать файл AST без фактической записи Java кода? Я видел много мест, где они предлагают написать Java код и скомпилировать его с Maven или другим инструментом. Я предпочитаю не делать этого, если это возможно, лучше использовать параметр командной строки.
  3. Прошло много времени с тех пор, как JSON topi c (упоминалось выше) был обновлен. Что-то изменилось? Можно ли создать отчет JSON без фактического запуска Java?

Как вы можете видеть, я действительно запутался, поэтому я ценю любую помощь!

РЕДАКТИРОВАТЬ : небольшое уточнение - мне не нужно изображение AST, скорее, чтобы создать отчет JSON. Если нет простого способа сделать это, я уверен, что в ANTLR есть какой-то необработанный файл с этой информацией, который я мог бы проанализировать и преобразовать в JSON. Хотя, где находятся эти необработанные данные?

1 Ответ

0 голосов
/ 17 марта 2020

Надеюсь, ваш путь к классу верен. Ему нужен текущий каталог в дополнение к инструменту ANTLR jar. Так что-то вроде .;C:\...\antlr.jar. Что касается использования ANTLR в грамматике Java, вы можете сделать это:

$ antlr4 JavaLexer.g4 JavaParser.g4
$ javac Java*.java
$ grun Java compilationUnit -tree -gui

-gui отобразит окно, которое может занять некоторое время. Не забудьте отправить EOF в среду выполнения ANTLR после того, как вы наберете что-то для stdin. (CTLR + Z для Windows, CTLR + D для Linux) Кроме того, вы можете ввести файл в качестве дополнительного аргумента для grun.

Из двух файлов .g4, я не смог бы Сказать, что имя грамматики было Java. Я только догадался, основываясь на контексте. compilationUnit - это имя первого правила грамматики, с которого начинаются все файлы java. Это можно сделать, открыв JavaParser.g4 и прочитав первое правило.

Вот псевдонимы, которые я использовал для Git Bash.

$ alias
alias antlr4='java -Xmx500M org.antlr.v4.Tool'
alias grun='java -Xmx500M org.antlr.v4.gui.TestRig'
...