Есть ли хорошая библиотека Python, которая может анализировать С++?

Google не отображал ничего, что казалось актуальным.

У меня есть куча существующего, работающего кода на С++, и я бы хотел использовать python для сканирования через него и выяснения отношений между классами и т.д.

EDIT: просто хотел указать: я не думаю, что мне нужно или нужно разобрать каждый бит С++; Мне просто нужно что-то достаточно умное, чтобы забирать объявления классов, функций и членов, а также пропускать определения функций.

Ответ 1

С++, как известно, трудно разобрать. Большинство людей, которые пытаются это сделать, в конечном итоге разделяют компилятор. На самом деле это (частично), почему LLVM началось: Apple нуждалась в способе, которым они могли бы анализировать С++ для использования в XCode, который соответствовал тому, как компилятор разбирал его.

Вот почему есть проекты вроде GCC_XML, которые вы могли бы комбинировать с библиотекой xml python.

Некоторые проекты, не связанные с компилятором, которые, похоже, очень хорошо разбираются в синтаксическом анализе С++:

  • Eclipse CDT
  • OpenGrok
  • Doxygen

Ответ 2

Не ответ как таковой, а просто, чтобы продемонстрировать, насколько корректным является синтаксический анализ С++. Моя любимая демонстрация:

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?
}

Это вполне допустимый, совместимый с С++ язык, но точное значение строки с комментариями зависит от вашей реализации. Если sizeof(void*)==sizeof(int) (типичный на 32-разрядных платформах), это объявление локальной переменной d типа a::b<c>. Если условие не выполняется, то это выражение не-op ((a::b < c) > d). Добавление конструктора для a::b позволит вам разоблачить разницу через наличие/отсутствие побочных эффектов.

Ответ 3

Вы не сможете найти библиотеку Python для входа в нее. Parsing С++ - это неудобно, и было написано несколько парсеров, которые не являются частью компилятора. Вы можете найти хорошее резюме проблем здесь.

Лучшая ставка может быть clang, так как ее поддержка на С++ устоявшихся. Хотя это не решение Python, похоже, что он будет поддаваться повторному использованию в оболочке Python, учитывая акцент на инкапсуляцию и хороший дизайн в своем развитии.

Ответ 4

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

Ответ 5

Если вы отформатировали свои комментарии совместимым способом, 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. С более сложным дизайном, результат еще более выгоден - часто намного легче, чем пытаться просмотреть источник.

Ответ 6

Pycparser - полный и функциональный парсер для ANSI C. Возможно, вы можете расширить его до С++: -)

Ответ 7

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

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

Ответ 8

Нет (свободной) хорошей библиотеки для синтаксического анализа С++ на любом языке.
Возможно, ваш лучший выбор - Dehydra плагин g++, clang или Elsa.

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

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

Ответ 12

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

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

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

Ответ 13

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