Если вам нужны только имена классов и методов внутри классов, вы можете настроить набор регулярных выражений для выбора различных токенов (идентификаторы, "{", "}", оператор, число, строка) и crummy parser (называемый "островным анализатором") для распознавания последовательности токенов, которые составляют объявления классов и объявлений методов. (Подсказка: для Java и C ++, убедитесь, что вы как-то соответствует
соответствующий {...} ").
Этот трюк работает для классов и методов, потому что, по сути, так работают настоящие компиляторы: они разбивают входной поток на токены (обычно используя обобщение регулярных выражений, называемое "генераторы лексеров"), а затем используют анализатор для определения реальная структура кода, а также классы и методы довольно легко обнаружить в синтаксисе. (Это решение является некой чистой версией того, что написал ОП).
Если вы хотите получить любую другую информацию из исходного кода Java или C ++ (например, типы аргументов метода и т. Д.), Вам, вероятно, понадобится инструмент, который фактически анализирует языки и создает таблицы символов, чтобы у вас была возможность узнать, что означают идентификаторы, найденные в разных местах.
(РЕДАКТИРОВАТЬ: ОП указал, что он хочет выяснить, какая функция вызывает какую-либо другую функцию. Он не может сделать это разумно без полнофункционального интерфейса пользователя (парсер + таблица символов как минимум).
Вы можете получить различные инструменты для анализа C ++ (GCC, Clang, Elsa, ...) и различные другие инструменты для анализа Java (ANTLR, javacc, ...). Вы обнаружите, что GCC довольно трудно поддается общим задачам, Clang и Elsa менее проблематичны. ANTLR и Javacc будут анализировать код Java, но AFAIK не будут создавать таблицы символов, поэтому они не очень удобны для задач общего назначения. Вы обнаружите, что работа с инструментом C ++ окажется совершенно другой, чем работа с инструментом Java, поскольку ни один из этих инструментов не имеет общей инфраструктуры компилятора.
То, как вы извлекаете имена классов и методов из каждого из них, будет отличаться в деталях, но большинство из них предлагают какой-то способ пролезть через дерево разбора (и вы кодируете какое-то специальное совпадение для того, что вы хотите найти, например, , синтаксис объявления класса) и / или перемещаться по таблицам символов (и выплевывать символы, помеченные как имена «классов» или «методов»). Чтобы найти правильный синтаксис, вам необходимо детально знать структуру дерева и тестировать множество кодов для соответствия правильным структурам дерева.
Если вы действительно хотите обрабатывать оба языка и использовать для этого единую инфраструктуру, вы можете рассмотреть наш DMS Software Reengineering Toolkit . DMS не зависит от языка, но может быть настроен на произвольные языки, а затем анализировать эти языки, создавать таблицы абстрактных символов и различные виды анализа потоков. DMS имеет как полный C ++ Front end (со встроенным препроцессором и обработкой C ++ в его различных формах, включая новый стандарт C ++ 11), так и Java Front end , обрабатывающий все диалекты Java до 1.6 (с 1.7 происходит на мгновение).
Чтобы выполнить операции OP (изначально заявленные) по поиску классов и методов, вы должны указать DMS проанализировать файл и затем пролезть по деревьям или таблицам символов, как и для других инструментов. Вы можете кодировать специальное сопоставление деревьев в DMS, но проще писать шаблоны:
pattern match_class_declaration(i: identifier, b: statements): class_declaration
= " class \i { \b } ";
может использоваться с DMS для соответствия тем деревьям, которые являются объявлениями классов, и будет возвращать «i» (и «b», которые нас не интересуют), связанные с соответствующими поддеревьями. «i», конечно, содержит имя класса, которое вы хотите. Другие шаблоны могут использоваться для распознавания других конструкций, таких как имена классов, которые наследуют, или реализуют интерфейсы, или методы, которые возвращают некоторый тип или методы, которые возвращают void.
Дело в том, что вам не нужно знать древовидную структуру, чтобы использовать такие шаблоны.
Чтобы пойти дальше, кажется, что OP хочет это сделать (например, построить информацию о вызывающем абоненте / вызываемом абоненте), вам необходимо построить графы потоков управления, выполнить анализ точек и т. Д. DMS обеспечивает поддержку для этого.
Хорошая новость: одна инфраструктура поддерживает оба языка;Вы даже можете смешивать C ++ и Java в DMS, не путая их.Более сложная новость заключается в том, что DMS - довольно сложный зверь, но это потому, что он должен обрабатывать все сложности C ++ и Java (а также многих других языков).Все еще лучше, чем работать с двумя различными синтаксическими анализаторами языка с двумя радикально различными реализациями и, таким образом, с двумя полными наборами кривых обучения.