Pycparser
https://github.com/albertz/pycparser
محلل ج ومترجم مكتوبة في بيثون. يتضمن أيضًا مولد واجهة Ctypes التلقائي.
إنه أكثر مرونة من قواعد اللغة C ، أي أنه يجب أن تدعم مجموعة من لغة C بشكل عام.
قد يكون بعض الدعم غير مكتمل أو خاطئ بعض الشيء في هذه المرحلة لأنني لم أتابع بشكل صارم حقًا مواصفات اللغة ، بل قمت بتحسين المحلل المحلل من خلال التكرار على رمز المصدر في العالم الحقيقي.
مشاريع مماثلة
مولدات الواجهة المحلية / ctypes :
- إيلي بندرسكي بيكبارسر. أكمل C99 Parser في Python النقي. ذلك يعتمد على Python Lex-Yacc (Ply). (لم أختبرها بعد. يبدو أن المشروع الأكثر اكتمالا والأكثر احترافية. إذا كنت لا تريد مترجم C ، فربما يكون هذا هو المشروع الذي يجب أن تستخدمه.)
- Pyclibrary (Github Fork). هو بطيء جدا ولم يعمل هذا جيدا بالنسبة لي.
- ctypesgen. يستخدم أيضًا LEX+YACC.
- Codegen. يستخدم GCC-XML. انظر أدناه عن عيوب مثل هذا aprock.
المترجمون المترجمون:
- cinterpreter. بيثون.
- كينت. ليس في بيثون. ربما الأكثر شهرة.
- الفصل. ليس في بيثون. ليس مجاني حقا.
- UPS Debugger. ليس في بيثون.
- بيكوك. ليس في بيثون. "مترجم C صغير جدًا."
- bic. ليس في بيثون.
لماذا هذا المشروع؟
- كن أكثر مرونة. أصبح الأمر أسهل بكثير الآن مع محلل مكتوب بخط اليد للقيام بعمليات على مستويات معينة من أنبوب التحليل.
- كنت أرغب في الحصول على بعض التعليمات البرمجية المستقلة التي يمكن أن تعمل بسهولة على جانب المستخدم النهائي. لذلك يمكن للمستخدم النهائي فقط تحديث LIB ورؤوسه ثم بعض التطبيقات باستخدام هذا Python LIB سيستخدم LIB المحدث تلقائيًا. هذا غير ممكن إذا قمت بإنشاء واجهة Ctypes بشكل ثابت (عبر أداة تعتمد على GCC-XML أو نحو ذلك).
- أردت تنفيذ PYSDL ولم أرغب في ترجمة رؤوس SDL باليد. أيضًا ، لم أرغب في استخدام الأدوات الموجودة للقيام بذلك لتجنب المزيد من الحفاظ على العمل في وقت لاحق. انظر المشروع لمزيد من المعلومات.
- يمكن استخدام هذه الوظيفة بشكل مشابه للعديد من مكتبات C الأخرى.
- تحد لنفسي. فقط للمتعة. سائدا
أمثلة
- Pysdl. يستخدم أيضًا غلاف Ctypes التلقائي ويقوم بتعيينه إلى وحدة Python.
- pycpython. تفسير cpython في بيثون.
- بيلوا. تفسير لوا في بيثون.
راجع أيضًا الاختبارات/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 . ثم نقوم فقط بتشغيل رمز بيثون الذي تم إنشاؤه. ولكن يمكننا أيضا تفريغها. وبالتالي يمكننا تجميع رمز C إلى برنامج Python مكافئ.

--- ألبرت زير ، http://www.az2000.de