Pycparser
https://github.com/albertz/pycparser
A C Parser и интерпретатор, написанный на Python. Также включает в себя автоматический генератор интерфейса CTYPES.
Это более свободнее, чем грамматика C, то есть он должен поддерживать суперсет языка C в целом.
Некоторая часть поддержки может немного неполной или неправильной на данный момент, потому что я действительно не строго следил за языковыми характеристиками, а скорее улучшил анализатор итерацией на исходном коде реального мира.
Подобные проекты
Парсеры / ctypes Generators:
- Эли Бендерский Пикпарсер. Полный анализатор C99 в Pure Python. Это зависит от Python lex-yacc (ply). (Я еще не проверил это. Кажется, самый полный и самый профессиональный проект. Если вы не хотите переводчика C, это, вероятно, проект, который вы должны использовать.)
- Пиклибрика (вилка GitHub). Довольно медленный и не работал для меня так хорошо.
- ctypesgen. Также использует LEX+YACC.
- CodeGen. Использует GCC-XML. См. Ниже о недостатках такого атоирования.
Переводчики:
- Cinterpreter. Питон.
- Прозрачный Не в питоне. Наверное, самый известный.
- Гнездо Не в питоне. Не совсем бесплатно.
- отладчик UPS. Не в питоне.
- Пикок. Не в питоне. «Очень маленький переводчик С».
- Бич Не в питоне.
Почему этот проект?
- Быть более гибким. Сейчас намного проще с рукописным анализатором для выполнения операций на определенных уровнях трубы анализа.
- Я хотел иметь какой-то автономный код, который также может легко работать на стороне конечного пользователя. Таким образом, конечный пользователь может просто обновить LIB и его заголовки, а затем какое-то приложение, использующее этот Python Lib, автоматически использует обновленную LIB. Это невозможно, если вы сгенерировали статически интерфейс CTYPES (через какой-то инструмент на основе GCC-XML или около того).
- Я хотел внедрить PYSDL и не хотел переводить заголовки SDL вручную. Кроме того, я не хотел использовать существующие инструменты для этого, чтобы избежать дальнейшего обслуживания работы в более позднее время. Смотрите проект для получения дополнительной информации.
- Эта функция может использоваться аналогичным образом для многих других библиотек C.
- Вызов для себя. Просто для развлечения. :)
Примеры
- Pysdl. Также использует автоматическую обертку CTYPES и отображает ее на модуль Python.
- Pycpython. Интерпретировать cpython в Python.
- Пилуа. Интерпретировать Луа в Python.
Также см. Пример Tests/test_interpreter. {C, py} 'Hello World.
Также попробуйте ./demos/interactive_interpreter.py --debug .
Текущее состояние
- Многие простые программы C должны быть проанализированы и интерпретируют правильно.
- Я совершенно уверен, что функции указателя Typedefs обрабатываются неправильно. Например,
typedef void f(); и typedef void (*f)(); сейчас то же самое. См. cpre3_parse_typedef и проведите некоторое тестирование, если вы хотите это исправить. - Многие функции из стандартной библиотеки C все еще отсутствуют.
- Там могут быть некоторые ошибки. :)
- C ++ еще не поддерживается. :)
- Стиль кода не соответствует конвенциям PEP8 и стандартным питонам во многих местах, так как он довольно старый. Кроме того, он, вероятно, должен быть реструктурирован, так как он слишком сильно вырос в отдельных файлах. Я медленно это исправляю.
Как работает переводчик
Это, вероятно, немного необычно. Мы обертываем наиболее важные стандартные функции библиотеки C непосредственно на родной LIBC через ctypes . Мы переводим проанализированный код C на эквивалентный Python AST (через ast ), который широко использует ctypes . Затем мы просто запускаем этот сгенерированный код Python. Но мы также можем сбросить его. Таким образом, мы можем скомпилировать C -код в эквивалентную программу Python.

--- Альберт Зейер, http://www.az2000.de