ผู้เล่น pycparser
https://github.com/albertz/pycparser
ตัว แยกวิเคราะห์และล่ามที่เขียนใน Python ยังรวมถึงเครื่องกำเนิดอินเตอร์เฟส ctypes อัตโนมัติ
มันหลวมกว่าไวยากรณ์ C เช่นควรสนับสนุน superset ของภาษา C โดยทั่วไป
การสนับสนุนบางอย่างอาจไม่สมบูรณ์หรือผิดในจุดนี้เพราะฉันไม่ได้ติดตามรายละเอียดภาษาอย่างเคร่งครัด แต่จะปรับปรุงตัวแยกวิเคราะห์โดยการทำซ้ำในซอร์สโค้ดในโลกแห่งความเป็นจริง
โครงการที่คล้ายกัน
เครื่องกำเนิดอินเทอร์เฟซ Parsers / ctypes :
- Pycparser ของ Eli Bendersky C99 Parser สมบูรณ์ใน Pure Python มันขึ้นอยู่กับ Python Lex-yacc (Ply) (ฉันยังไม่ได้ทดสอบมันดูเหมือนจะเป็นโครงการที่สมบูรณ์และเป็นมืออาชีพมากที่สุดถ้าคุณไม่ต้องการล่าม C นี่อาจเป็นโครงการที่คุณควรใช้)
- Pyclibrary (GitHub Fork) ค่อนข้างช้าและไม่ได้ผลดีสำหรับฉัน
- Ctypesgen ยังใช้ Lex+Yacc
- Codegen ใช้ GCC-XML ดูด้านล่างเกี่ยวกับข้อเสียของ aproach ดังกล่าว
ล่าม:
- Cinterpreter งูหลาม
- cint. ไม่ได้อยู่ใน Python อาจเป็นคนที่มีชื่อเสียงที่สุด
- ch. ไม่ได้อยู่ใน Python ไม่ฟรีจริงๆ
- ดีบักเกอร์ UPS ไม่ได้อยู่ใน Python
- picoc. ไม่ได้อยู่ใน Python "ล่ามที่เล็กมาก"
- Bic. ไม่ได้อยู่ใน Python
ทำไมโครงการนี้?
- มีความยืดหยุ่นมากขึ้น ตอนนี้มันง่ายกว่ามากด้วยตัวแยกวิเคราะห์ที่เขียนด้วยมือเพื่อดำเนินการในบางระดับของท่อแยกวิเคราะห์
- ฉันต้องการมีรหัสที่มีอยู่ในตัวเองซึ่งสามารถทำงานได้อย่างง่ายดายในด้านผู้ใช้ปลายทาง ดังนั้นผู้ใช้ปลายทางสามารถอัปเดต LIB และส่วนหัวได้จากนั้นแอปพลิเคชันบางอย่างที่ใช้ Python LIB นี้จะใช้ LIB ที่อัปเดตโดยอัตโนมัติ สิ่งนี้เป็นไปไม่ได้หากคุณสร้างอินเทอร์เฟซ CTYPES แบบคงที่ (ผ่านเครื่องมือที่ใช้ GCC-XML บางอย่าง)
- ฉันต้องการใช้ PYSDL และไม่ต้องการแปลส่วนหัว SDL ด้วยมือ นอกจากนี้ฉันไม่ต้องการใช้เครื่องมือที่มีอยู่ในการทำสิ่งนี้เพื่อหลีกเลี่ยงการดูแลงานต่อไปในภายหลัง ดูโครงการสำหรับข้อมูลเพิ่มเติม
- ฟังก์ชั่นนี้สามารถใช้งานได้ในทำนองเดียวกันสำหรับไลบรารี C อื่น ๆ อีกมากมาย
- ความท้าทายสำหรับตัวเอง เพื่อความสนุกสนาน -
ตัวอย่าง
- pysdl นอกจากนี้ยังใช้ wrapper ctypes อัตโนมัติและแผนที่ไปยังโมดูล Python
- pycpython ตีความ cpython ใน Python
- Pylua ตีความ Lua ใน Python
ดู ตัวอย่างการทดสอบ/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 และอนุสัญญา Python มาตรฐานในหลาย ๆ ที่เนื่องจากค่อนข้างเก่า นอกจากนี้มันควรจะมีการปรับโครงสร้างใหม่เนื่องจากมีการเติบโตมากเกินไปในไฟล์เดียว ฉันค่อยๆแก้ไขปัญหานี้
ล่ามทำงานอย่างไร
นี่อาจเป็นเรื่องผิดปกติเล็กน้อย เราห่อฟังก์ชั่นไลบรารี C มาตรฐานที่สำคัญที่สุดโดยตรงไปยัง LIBC ดั้งเดิมผ่าน ctypes เราแปลรหัส C ที่แยกวิเคราะห์เป็น Python AST ที่เทียบเท่า (ผ่าน ast ) ซึ่งใช้ประโยชน์จาก ctypes อย่างหนัก จากนั้นเราเพิ่งเรียกใช้รหัส Python ที่สร้างขึ้นนี้ แต่เราสามารถทิ้งมันได้ ดังนั้นเราสามารถรวบรวมรหัส C เป็นโปรแกรม Python เทียบเท่า

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