Есть хорошая библиотека Python, которая может анализировать C++?
Google не нашел ничего, что казалось уместным.
У меня есть куча существующего, работающего кода C++, и я хотел бы использовать python для его обхода и выяснения отношений между классами и т. Д.
РЕДАКТИРОВАТЬ: Просто хотел отметить: я не думаю, что мне нужно или не хочу анализировать каждый бит C++; Мне просто нужно что-то достаточно умное, чтобы разобраться в объявлениях переменных классов, функций и членов, и пропустить определения функций.
13 ответов
C++, как известно, трудно анализировать. Большинство людей, которые пытаются сделать это правильно, в конечном итоге разбирают компилятор. Фактически, именно поэтому (частично) началась LLVM: Apple нужен был способ, которым они могли бы анализировать C++ для использования в XCode, который соответствовал бы тому, как компилятор анализировал его.
Вот почему есть такие проекты, как GCC_XML, которые вы можете объединить с библиотекой Python xml.
Некоторые некомпиляционные проекты, которые, кажется, хорошо справляются с синтаксическим анализом C++:
- Eclipse CDT
- OpenGrok
- Doxygen
Не ответ как таковой, но просто чтобы продемонстрировать, насколько сложен правильный синтаксический анализ C++. Моя любимая демка:
template<bool> struct a_t;
template<> struct a_t<true> {
template<int> struct b {};
};
template<> struct a_t<false> {
enum { b };
};
typedef a_t<sizeof(void*)==sizeof(int)> a;
enum { c, d };
int main() {
a::b<c>d; // declaration or expression?
}
Это совершенно допустимый стандарт C++, но точное значение закомментированной строки зависит от вашей реализации. Если sizeof(void*)==sizeof(int)
(типично для 32-битных платформ), это объявление локальной переменной d
типа a::b<c>
, Если условие не выполняется, то это неоперативное выражение ((a::b < c) > d)
, Добавление конструктора для a::b
фактически позволит вам выявить разницу через наличие / отсутствие побочных эффектов.
Вы не найдете встроенную библиотеку Python для этого. Синтаксический анализ C++ является трудоемким, и было написано немного парсеров, которые не являются частью компилятора. Вы можете найти хорошее резюме проблем здесь.
Лучшая ставка может быть clang, так как его поддержка C++ хорошо известна. Хотя это не решение Python, звучит так, как будто его можно будет повторно использовать в оболочке Python, учитывая акцент на инкапсуляцию и хороший дизайн при его разработке.
Pycparser является полным и функциональным парсером для ANSI C. Возможно, вы можете расширить его до C++:-)
Если вы отформатировали свои комментарии совместимым способом, doxygen делает фантастическую работу. Он даже будет рисовать диаграммы наследования, если у вас установлен graphviz.
Например, запустив doxygen для следующего:
/// <summary>
/// A summary of my class
/// </summary>
public class MyClass
{
protected:
int m_numOfWidgets; /// Keeps track of the number of widgets stored
public:
/// <summary>
/// Constructor for the class.
/// </summary>
/// <param paramName="numOfWidgets">Specifies how many widgets to start with</param>
MyClass(int numOfWidgets)
{
m_numOfWidgets = numOfWidgets;
}
/// <summary>
/// Increments the number of widgets stored by the amount supplied.
/// </summary>
/// <param paramName="numOfWidgets">Specifies how many widgets to start with</param>
/// <returns>The number of widgets stored</returns>
IncreaseWidgets(int numOfWidgetsToAdd)
{
m_numOfWidgets += numOfWidgets;
return m_numOfWidgets;
}
};
Превратит все эти комментарии в записи в файлах.html. С более сложным дизайном, результат еще более выгоден - часто намного легче, чем пытаться просмотреть источник.
Эта страница показывает грамматику C++, написанную на Antlr, и вы можете сгенерировать код Python из нее.
Также, кажется, был кто-то, кто работал над синтаксическим анализатором C++ в pyparsing, но я не смог выяснить, кто или его текущий статус.
Вот проект SourceForge, который утверждает, что анализирует заголовки C++. Как отмечали другие комментаторы, общего решения не существует, но вам кажется, что этого будет достаточно для ваших нужд. (Я просто наткнулся на это по аналогичной необходимости и сам еще не пробовал.)
Проект Clang предоставляет библиотеки для простого анализа кода C++.
Либо с помощью Clang и GCC вы можете создать XML-представление кода
Если вы предпочитаете более Pythonian решение, вы также можете найти грамматику Yacc C++ и использовать py-ply (Yacc для Python), но это решение, которое требует больше работы
Я бы следил за http://gcc.gnu.org/wiki/plugins, так как кажется, что плагины - это путь. Кроме того, gcc-python-plugin, похоже, имеет хорошую реализацию.
Випа pyparsing показывает этот пример - все, что она делает, это разбирает объявления структуры, так что это может дать вам лишь представление о масштабах проблемы.
Я предлагаю вам (или даже лучше, вашему работодателю) выложить 200 долларов и купить Enterprise Architect у sparxsystems. Это программное обеспечение удивительно мощное по цене и включает в себя довольно хорошие функции обратного инжиниринга кода. Вы потратите гораздо больше, чем это в свое время, чтобы выполнить только около 2% работы. В этом случае "покупает" побеждает "делать".