Pycparser
https://github.com/albertz/pycparser
A c parser dan interpreter ditulis dalam python. Juga termasuk generator antarmuka CTYPES otomatis.
Ini lebih longgar daripada tata bahasa C, yaitu itu harus mendukung superset bahasa C secara umum.
Beberapa dukungan mungkin sedikit tidak lengkap atau salah pada titik ini karena saya tidak benar-benar mengikuti spesifikasi bahasa tetapi lebih meningkatkan parser dengan iterasi pada kode sumber dunia nyata.
Proyek serupa
Generator Antarmuka Parsers / ctypes :
- Pycparser Eli Bendersky. Parser C99 Lengkap Dalam Python Murni. Itu tergantung pada python lex-yacc (ply). (Saya belum mengujinya. Tampaknya menjadi proyek yang paling lengkap dan paling profesional. Jika Anda tidak menginginkan juru bahasa C, ini mungkin proyek yang harus Anda gunakan.)
- Pyclibrary (Github Fork). Cukup lambat dan tidak berhasil dengan baik untuk saya.
- CTypesgen. Juga menggunakan Lex+YACC.
- codegen. Menggunakan GCC-XML. Lihat di bawah tentang kelemahan dari aproach seperti itu.
Penerjemah:
- Cinterpreter. Python.
- Cint. Tidak dalam Python. Mungkin yang paling terkenal.
- Ch. Tidak dalam Python. Tidak terlalu gratis.
- UPS Debugger. Tidak dalam Python.
- Picoc. Tidak dalam Python. "Penerjemah C yang sangat kecil."
- Bic. Tidak dalam Python.
Mengapa proyek ini?
- Menjadi lebih fleksibel. Sekarang jauh lebih mudah dengan parser tulisan tangan untuk melakukan operasi pada tingkat tertentu dari pipa parsing.
- Saya ingin memiliki beberapa kode mandiri yang juga dapat dengan mudah dijalankan di sisi pengguna akhir. Jadi pengguna akhir hanya dapat memperbarui lib dan headernya dan kemudian beberapa aplikasi menggunakan lib python ini akan secara otomatis menggunakan lib yang diperbarui. Ini tidak mungkin jika Anda menghasilkan antarmuka CTYPES secara statis (melalui beberapa alat berbasis GCC-XML atau lebih).
- Saya ingin menerapkan PYSDL dan tidak ingin menerjemahkan header SDL dengan tangan. Juga, saya tidak ingin menggunakan alat yang ada untuk melakukan ini untuk menghindari pemeliharaan lebih lanjut di beberapa waktu nanti. Lihat proyek untuk info lebih lanjut.
- Fungsionalitas ini dapat digunakan dengan cara yang sama untuk banyak perpustakaan C lainnya.
- Tantangan bagi diri saya sendiri. Hanya untuk bersenang-senang. :)
Contoh
- Pysdl. Juga menggunakan pembungkus CTYPES otomatis dan memetakannya ke modul Python.
- Pycpython. Menafsirkan cpython dalam python.
- Pylua. Menafsirkan Lua dalam Python.
Juga lihat contoh tes/test_interpreter. {C, py} 'hello world'.
Coba juga ./demos/interactive_interpreter.py --debug .
Keadaan saat ini
- Banyak program C sederhana harus diuraikan dan ditafsirkan dengan benar sekarang.
- Saya cukup yakin bahwa fungsi typedef pointer ditangani secara tidak benar. Misalnya
typedef void f(); dan typedef void (*f)(); sama saja sekarang. Lihat cpre3_parse_typedef dan lakukan beberapa pengujian jika Anda ingin memperbaikinya. - Banyak fungsi dari pustaka C standar masih hilang.
- Mungkin ada beberapa bug. :)
- C ++ belum didukung. :)
- Gaya kode tidak sesuai dengan pep8 dan konvensi python standar di banyak tempat, karena cukup tua. Juga, mungkin harus direstrukturisasi, karena telah tumbuh terlalu banyak dalam file tunggal. Saya perlahan memperbaiki ini.
Bagaimana cara kerja penerjemah
Ini mungkin agak tidak biasa. Kami membungkus fungsi perpustakaan C standar paling penting langsung ke LIBC asli, melalui ctypes . Kami menerjemahkan kode C yang diuraikan ke Python AST yang setara (via ast ), yang memanfaatkan ctypes . Kemudian kami hanya menjalankan kode Python yang dihasilkan ini. Tapi kita juga bisa membuangnya. Dengan demikian kami dapat mengkompilasi kode C ke program Python yang setara.

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