Как я могу определить тип идентификаторов при разборе исходного кода Java? - PullRequest
3 голосов
/ 30 июня 2011

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

например, у меня есть foo.x (bar), и мне нужно выяснить тип foo и bar.

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

Это не может быть решено идеально из-за рефлексии, но я надеюсь, что хороший синтаксический анализатор в кратчайшие сроки справится с проблемами определения объема и приведения.

edit: я не могу предположить, чтобудут присутствовать другие исходные файлы, поэтому я не могу просто выполнить вызов метода к его источнику и прочитать подпись из объявления метода

Ответы [ 3 ]

2 голосов
/ 30 июня 2011

Платформа Java Pluggable Annotation Processing (и * связанные API ), разработанные Java, предназначены для моделирования кода Java так, как вы говорите.Вы можете вызывать компилятор Java во время выполнения, предоставляя вам доступ к модели источника, используя API в пакетах javax.lang.model.Вводная статья доступна здесь .

1 голос
/ 30 июня 2011

Что вам нужно, так это все машины разрешения имен и типов.Как заметил другой автор, один из способов добиться этого - злоупотребить компилятором Java.

Но, скорее всего, у вас есть другая цель, помимо компиляции java;как только у вас есть эти имена, вы хотите сделать что-то с ними.Компилятор Java вряд ли вам здесь поможет.

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

Наш инструментарий реинжиниринга программного обеспечения DMS представляет собой обобщенный механизм анализа и преобразования программ.Он анализирует код, создает AST, управляет таблицами символов, предоставляет общие механизмы анализа потоков, поддерживает модификацию (или конструкцию) AST как процедурно, так и с точки зрения шаблонов поверхностного синтаксиса, включая (повторное) создание скомпилированного текста из AST, включая любые комментарии.1011 *

DMS имеет интерфейс Java , который позволяет DMS обрабатывать Java, создавать AST-файлы Java, выполнять все те разрешения имен и типов, которые вы хотите.Да, это большой механизм, эквивалентный тому, что есть у компилятора Java, прочитайте ваше последнее справочное руководство по Java.Вы можете создать любой пользовательский инструмент, который вам нужен, на основе этого фундамента.

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

1 голос
/ 30 июня 2011

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

Возможно, лучшим способом для этого было бы взять компилятор Java из OpenJDK, запустить соответствующие фазы компилятора и извлечь из него типы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...