Есть ли хорошая библиотека 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 кажется, что у него хорошая реализация.