Есть хорошая библиотека 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 фактически позволит вам выявить разницу через наличие / отсутствие побочных эффектов.

В течение многих лет я использовал pygccxml, который является очень хорошей оболочкой Python для GCC-XML. Это очень полнофункциональный пакет, который лежит в основе некоторых хорошо используемых инструментов генерации кода, таких как py++ от того же автора.

Вы не найдете встроенную библиотеку 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++ на любом языке.
Ваш лучший выбор - плагин Dehydra g ++, clang или Elsa.

Эта страница показывает грамматику C++, написанную на Antlr, и вы можете сгенерировать код Python из нее.

Также, кажется, был кто-то, кто работал над синтаксическим анализатором C++ в pyparsing, но я не смог выяснить, кто или его текущий статус.

Вот проект SourceForge, который утверждает, что анализирует заголовки C++. Как отмечали другие комментаторы, общего решения не существует, но вам кажется, что этого будет достаточно для ваших нужд. (Я просто наткнулся на это по аналогичной необходимости и сам еще не пробовал.)

http://sourceforge.net/projects/cppheaderparser/

Проект Clang предоставляет библиотеки для простого анализа кода C++.

Либо с помощью Clang и GCC вы можете создать XML-представление кода

Если вы предпочитаете более Pythonian решение, вы также можете найти грамматику Yacc C++ и использовать py-ply (Yacc для Python), но это решение, которое требует больше работы

Я бы следил за http://gcc.gnu.org/wiki/plugins, так как кажется, что плагины - это путь. Кроме того, gcc-python-plugin, похоже, имеет хорошую реализацию.

Ctypes использует gcc-xml для генерации кода. Возможно, что cpptypes тоже. Даже если это не так, вы можете использовать gcc-xml для генерации XML из вашего файла C++, а затем проанализировать xml с помощью одного из встроенных или сторонних анализаторов Python XML.

Випа pyparsing показывает этот пример - все, что она делает, это разбирает объявления структуры, так что это может дать вам лишь представление о масштабах проблемы.

Я предлагаю вам (или даже лучше, вашему работодателю) выложить 200 долларов и купить Enterprise Architect у sparxsystems. Это программное обеспечение удивительно мощное по цене и включает в себя довольно хорошие функции обратного инжиниринга кода. Вы потратите гораздо больше, чем это в свое время, чтобы выполнить только около 2% работы. В этом случае "покупает" побеждает "делать".

Другие вопросы по тегам