Скрипт Python для печати всех определений функций файла C / C ++ - PullRequest
7 голосов
/ 25 октября 2009

Я хочу, чтобы скрипт Python распечатывал список всех функций, определенных в файле C / C ++.

например. abc.c определяет две функции как:

void func1() { }
int func2(int i) { printf("%d", i); return 1; }

Я просто хочу найти файл (abc.c) и распечатать все функции, определенные в нем (только имена функций). В приведенном выше примере я хотел бы напечатать func1, func2, используя скрипт Python.

Ответы [ 4 ]

3 голосов
/ 25 октября 2009

Я бы предложил использовать инструмент PLY lex / yacc. Есть встроенный синтаксический анализатор C, и сам синтаксический анализатор довольно быстрый. Как только вы проанализируете файл, вам не составит труда найти все функции.

http://www.dabeaz.com/ply/

2 голосов
/ 25 октября 2009

antlr ваш инструмент

1 голос
/ 25 октября 2009

На этой странице, Синтаксический анализ C ++ , упоминается пара грамматик ANTLR для C ++. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Так как «1003 *» имеет Python API .

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

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

1 голос
/ 25 октября 2009

Чтобы сделать это надежно, вам нужно проанализировать код C или C ++, а затем извлечь определения функций из AST, который создает анализатор.

C довольно легко разобрать. Как упоминает pavpanchekha , синтаксический анализатор PLY поставляется с синтаксическим анализатором C и использовался для создания следующих соответствующих проектов:

Синтаксический анализ кода C ++ более сложен .. "Есть ли хорошая библиотека Python, которая может анализировать C ++" должен помочь:

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

Именно поэтому существуют проекты, такие как GCC_XML , которые можно объединить с библиотекой Python xml.

Наконец, если ваш код вообще не должен быть надежным, вы можете запустить код через переформататор кода, например отступ (для кода C), чтобы выровнять вещи, а затем использовать обычные выражения, соответствующие определению функции. Да, это плохая, хакерская, склонная к ошибкам идея, и вы, вероятно, найдете определения функций в многострочных комментариях и тому подобном, но это может сработать достаточно хорошо.

...