pycparser
https://github.com/albertz/pycparser
用Python写的C解析器和口译员。还包括自动CTYPES接口发生器。
它比C语法更松散,即它应该支持C语言的超集。
目前,某些支持可能有些不完整或错误,因为我并没有真正严格遵循语言规格,而是通过在现实世界中的源代码上改善解析器。
类似的项目
解析器 / ctypes接口生成器:
- Eli Bendersky的Pycparser。完整的C99解析器中的Pure Python。这取决于Python Lex-Yacc(ply)。 (我还没有测试过。似乎是最完整,最专业的项目。如果您不想要C解释器,这可能是您应该使用的项目。)
- 绿色(github叉)。非常慢,对我来说效果不佳。
- CTYPESGEN。还使用Lex+Yacc。
- 代码根。使用GCC-XML。请参阅下面关于这种剥夺的缺点。
口译员:
- CINTERPRETER。 Python。
- Cint。不在python。可能是最著名的。
- ch。不在python。不是真正的免费。
- UPS调试器。不在python。
- picoc。不在python。 “一个很小的C口译员。”
- Bic。不在python。
为什么这个项目?
- 更灵活。现在,使用手写解析器可以在解析管道的某些级别上进行操作要容易得多。
- 我想拥有一些独立的代码,这些代码也很容易在最终用户方面运行。因此,最终用户可以只需更新LIB及其标题,然后使用此Python Lib的某些应用程序将自动使用更新的LIB。如果您通过静态生成CTYPES接口(通过某些基于GCC-XML的工具左右),则不可能。
- 我想实现PYSDL,并且不想手工翻译SDL标题。另外,我不想使用现有的工具来避免在以后的某个时间进行进一步维护工作。有关更多信息,请参见项目。
- 此功能可以类似地用于许多其他C库。
- 对我自己的挑战。只是为了好玩。 :)
例子
- pysdl。还使用自动CTYPES包装器并将其映射到Python模块。
- pycpython。在Python中解释Cpython。
- pylua。在Python中解释Lua。
另请参阅tests/test_interpreter。{c,py} 'Hello World'示例。
还可以尝试./demos/interactive_interpreter.py --debug 。
当前状态
- 现在应该解析许多简单的C程序并正确解释。
- 我很确定功能指针TypedEF被错误地处理。例如
typedef void f();和typedef void (*f)();现在是一样的。请参阅cpre3_parse_typedef ,如果要解决此问题,请进行一些测试。 - 标准C库中的许多功能仍然缺少。
- 可能有一些错误。 :)
- C ++尚不支持。 :)
- 代码样式在许多地方都不符合PEP8和标准Python约定,因为它很旧。另外,它可能应该进行重组,因为它在单个文件中已经变得过多。我正在慢慢解决这个问题。
口译员如何工作
这可能有点不寻常。我们通过ctypes将最重要的标准C库直接包装到本机LIBC。我们将解析的C代码转换为等效的Python AST(VIA ast ),该AST大量使用ctypes 。然后,我们只运行此生成的Python代码。但是我们也可以丢弃它。因此,我们可以将C代码编译到等效的Python程序。

--- Albert Zeyer,http://www.az2000.de