Разбор исходного кода Java - PullRequest
8 голосов
/ 31 марта 2011

Меня просят разработать программное обеспечение, которое должно быть способно создавать блок-схему / поток управления входного исходного кода Java.Поэтому я начал исследовать его и пришел к следующим решениям:

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

  1. Разобрать исходный код, написав мои собственные грамматики (я думаю, это сложное решение).Я думаю использовать Antlr для этого.
  2. Чтение файлов исходного кода в виде текста и поиск определенных шаблонов (может стать неэффективным)

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

Я хорошо разбираюсь в языках .NET, но это мой первый большой проект на Java.У меня есть базовые знания по проектированию компиляторов, поэтому написание грамматики для меня не должно быть невозможным.

Извините, если мне неясно.Пожалуйста, попросите каких-либо разъяснений.

Ответы [ 9 ]

7 голосов
/ 31 марта 2011

Я бы пошел с Antlr и использовал бы существующую грамматику Java: https://github.com/antlr/grammars-v4

3 голосов
/ 31 марта 2011

Все инструменты, обрабатывающие код Java, обычно сначала решают, хотят ли они обрабатывать файлы языка Java или байтового кода Java. Это стратегическое решение, которое зависит от вашего варианта использования. Я мог бы представить оба изображения для генерации блок-схемы. Когда вы решили этот вопрос. Уже есть несколько фреймворков или библиотек, которые могут вам помочь в этом. Для разработки байт-кода есть: ASM , JavaAssist , Soot и BCEL , которые кажутся мертвыми. Для анализа и анализа языка Java существуют: Polyglot , компилятор eclipse и javac. Все они включают в себя полный интерфейс компилятора для Java и с открытым исходным кодом.

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

2 голосов
/ 03 апреля 2012

Eclipse имеет библиотеку для анализа исходного кода и создания из него абстрактного синтаксического дерева, которое позволит вам извлечь то, что вы хотите.

Смотрите здесь для учебника http://www.vogella.de/articles/EclipseJDT/article.html

Смотрите здесь для API http://help.eclipse.org/indigo/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/package-summary.html#package_description

1 голос
/ 31 марта 2011

Теперь у меня есть два способа распознавания:

У вас есть намного больше способов, чем это. JavaCC поставляется с уже созданной грамматикой Java 1.5. Я уверен, что другие генераторы парсеров тоже самое. У вас нет причин писать собственную грамматику или создавать собственный синтаксический анализатор.

И, в частности, «чтение [входных] файлов исходного кода в виде текста и поиск определенных шаблонов» вообще не является жизнеспособным выбором, поскольку он не выполняет синтаксический анализ и, следовательно, не может правильно распознавать программы на Java.

0 голосов
/ 01 апреля 2011

Наш DMS Software Reengineering Toolkit - это механизм анализа и преобразования программ общего назначения, со встроенной возможностью синтаксического анализа, построения AST, построения таблиц символов, извлечения управления и потока данных, преобразования AST, довольно печати AST назадв текст и т. д.

DMS параметризован с помощью явного определения языка и имеет большой набор ранее существовавших определений .

DMS Java Front End уже вычисляет графы управления и потока данных , поэтому ваша проблема сводится к их экспорту.

РЕДАКТИРОВАТЬ 19.07.2014: Теперь обрабатывает Java 8.

0 голосов
/ 31 марта 2011

Более разумным решением является использование Java-анализатора Eclipse.Подробнее здесь: http://www.ibm.com/developerworks/opensource/library/os-ast/

0 голосов
/ 31 марта 2011

Или еще проще: используйте отражение. Вы должны быть в состоянии скомпилировать исходники, загрузить классы с помощью java classloader и проанализировать их оттуда. Я думаю, что это гораздо проще, чем любой анализ.

0 голосов
/ 31 марта 2011

Я бы сделал так, чтобы проанализировать скомпилированный код.Это позволит вам читать файлы без исходного кода и избегать синтаксического анализа кода самостоятельно.Я бы использовал Objectwebs ASM для чтения файлов классов.

0 голосов
/ 31 марта 2011

Ваши входные файлы написаны на Java, а программное обеспечение должно быть написано на Java, но это ваш первый проект на Java? Прежде всего, я бы предложил изучать язык с помощью небольших проектов. Также вам нужно научиться использовать графику в Java (есть различные библиотеки). Затем вы должны сосредоточиться на том, что вы хотите показать на своих графиках. Или достаточно текста?

...