Как разобрать файл заголовка C? - PullRequest
17 голосов
/ 23 декабря 2009

Кто-нибудь знает хитрый способ использования заголовочных файлов C в Python? Например, у меня есть программа на C, которая включает в себя глобальную переменную:

typedef struct ImageInfo
{
    uint8_t revisionMajor;
    uint8_t revisionMinor;
    uint16_t checksum;    

} ImageInfo;

ImageInfo gImageInfo;   /* Placed at a specific address by the linker */

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

Ответы [ 4 ]

23 голосов
/ 23 декабря 2009

Это было упомянуто вчера на SO; У меня еще не было возможности проверить это более подробно, но я имею в виду. pycparser, «синтаксический анализатор C и генератор AST, написанный на Python».

https://github.com/eliben/pycparser

12 голосов
/ 23 декабря 2009

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

8 голосов
/ 23 декабря 2009

Взгляните на pygccxml . Я использую его для построения в памяти графиков моего исходного кода C / C ++, которые я могу использовать в качестве основы для многих задач генерации кода.

PS: Когда я только начинал с генерации кода на основе Python, я на самом деле пытался написать парсер сам: избавь себя от боли и даже не ходи туда! (похоже, вы уже все выяснили ...) pygccxml - это все, что вы хотите, и даже больше:)

4 голосов
/ 12 марта 2012

С этой же целью я рассматриваю Пиклибиблиотека , это не полный синтаксический анализатор C, но он предназначен для синтаксического анализа заголовочных файлов C, поэтому его гораздо проще использовать, чем pycparser или некоторый парсер, основанный на gccxml: хотя он слабо документирован, просто попробуйте CParser.py testHeader.h, и вы увидите, как он работает .

Зависит от pyparsing и, насколько я понимаю, это чистый python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...