Существует ли хорошая библиотека Python, которая может проанализировать C++? [закрытый]

Я обычно использую, находят как это:

find . -iname '' -exec cmd '{}' \;

' {}' будет заменен именем файла, и \; необходимо для завершения цепочки выполнения. Однако, если это не работает с Вашей функцией, Вы, возможно, должны были бы выполнить ее через удар:

find .. |sed -e "s/.*/cmd '&'/"|bash

Находят печать каждым файлом на строке, sed просто префиксы это с Вашей командой, и затем передают его по каналу для избиения за выполнение. Пропустите |bash сначала для наблюдения то, что произойдет.

50
задан csbrooks 18 September 2009 в 03:49
поделиться

12 ответов

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

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

Вот некоторые некомпиляторные проекты, которые, кажется, неплохо справляются с синтаксическим анализом C ++:

  • Eclipse CDT
  • OpenGrok
  • Doxygen
32
ответ дан 7 November 2019 в 10:53
поделиться

Вы не найдете подключаемой библиотеки Python для этого. Анализировать C ++ сложно, и было написано несколько парсеров, не являющихся частью компилятора. Вы можете найти хорошее резюме проблем здесь .

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

5
ответ дан 7 November 2019 в 10:53
поделиться

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

4
ответ дан 7 November 2019 в 10:53
поделиться

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

3
ответ дан 7 November 2019 в 10:53
поделиться

На этой странице показан Грамматика C ++ написана в Antlr, и вы можете сгенерировать из нее код Python .

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

1
ответ дан 7 November 2019 в 10:53
поделиться

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

1
ответ дан 7 November 2019 в 10:53
поделиться

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

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

0
ответ дан 7 November 2019 в 10:53
поделиться

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

0
ответ дан 7 November 2019 в 10:53
поделиться

Не ответ как таковой, но просто чтобы продемонстрировать, насколько на самом деле сложен синтаксический анализ 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 . Если условие не выполняется, то это выражение без операции ((a :: b d) . Добавление конструктора для a :: b фактически позволит вам выявить разницу через наличие / отсутствие побочных эффектов.

44
ответ дан 7 November 2019 в 10:53
поделиться

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

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

1
ответ дан 7 November 2019 в 10:53
поделиться

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

С помощью Clang и GCC вы можете сгенерировать XML-представление кода.

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

0
ответ дан 7 November 2019 в 10:53
поделиться

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

5
ответ дан 7 November 2019 в 10:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: