Я обычно использую, находят как это:
find . -iname '' -exec cmd '{}' \;
' {}' будет заменен именем файла, и \; необходимо для завершения цепочки выполнения. Однако, если это не работает с Вашей функцией, Вы, возможно, должны были бы выполнить ее через удар:
find .. |sed -e "s/.*/cmd '&'/"|bash
Находят печать каждым файлом на строке, sed просто префиксы это с Вашей командой, и затем передают его по каналу для избиения за выполнение. Пропустите |bash сначала для наблюдения то, что произойдет.
C ++, как известно, сложен для синтаксического анализа. Большинство людей, которые пытаются сделать это правильно, в конечном итоге разбирают компилятор. Фактически (отчасти) именно поэтому был запущен LLVM: Apple требовался способ синтаксического анализа C ++ для использования в XCode, который соответствовал бы способу его анализа компилятором.
Вот почему существуют такие проекты, как GCC_XML , которые можно комбинировать с xml-библиотекой python.
Вот некоторые некомпиляторные проекты, которые, кажется, неплохо справляются с синтаксическим анализом C ++:
Вы не найдете подключаемой библиотеки 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, но я не смог выяснить, кто или его текущий статус.
Нет (бесплатной) хорошей библиотеки для синтаксического анализа C ++ на любом языке.
Ваш лучший выбор, вероятно, - плагин Dehydra g ++, clang или Elsa .
Этот пример показан в вики-странице pyparsing - все, что он делает, - это объявления структуры синтаксического анализа, так что это может дать вам только Оцените масштабы проблемы.
Я предлагаю вам (или, что еще лучше, вашему работодателю) выложить 200 долларов и купить Enterprise Architect у sparxsystems . Это программное обеспечение невероятно мощное по своей цене и включает в себя довольно хорошие функции обратного проектирования кода. Вы потратите гораздо больше в свободное время, чтобы выполнить лишь около 2% работы. В этом случае «покупка» побеждает «делать».
Ctypes использует gcc-xml для генерации кода. Возможно, что и cpptypes. Даже если это не так, вы можете использовать gcc-xml для генерации XML из вашего файла C ++, а затем проанализировать xml с помощью одного из встроенных или сторонних анализаторов Python XML.
Не ответ как таковой, но просто чтобы продемонстрировать, насколько на самом деле сложен синтаксический анализ 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
. Добавление конструктора для a :: b
фактически позволит вам выявить разницу через наличие / отсутствие побочных эффектов.
Вот проект SourceForge, который утверждает, что анализирует заголовки C ++. Как отмечали другие комментаторы, общего решения нет, но вам кажется, что этого будет достаточно для ваших нужд. (Я просто наткнулся на него для аналогичной потребности и сам еще не пробовал.)
Проект Clang предоставляет библиотеки только для синтаксического анализа кода C ++.
С помощью Clang и GCC вы можете сгенерировать XML-представление кода.
Если вы предпочитаете более Pythonian решение, вы также можете искать грамматику C ++ yacc и использовать py-ply (Yacc для Python), но это кажется решение, требующее дополнительной работы
В течение многих лет я использовал pygccxml, который является очень хорошей оберткой Python вокруг GCC-XML. Это очень полнофункциональный пакет, который является основой для некоторых хорошо используемых инструментов генерации кода, таких как py++ того же автора.