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