سؤال

لقد كتبت مؤخرًا محللًا لغة بايثون باستخدام Ply (إنها إعادة تنفيذ بايثون لـ yacc).عندما انتهيت تقريبًا من استخدام المحلل اللغوي، اكتشفت أن القواعد النحوية التي أحتاج إلى تحليلها تتطلب مني إجراء بعض البحث أثناء التحليل لإبلاغ المعجم.دون إجراء بحث لإبلاغ المعجم، لا أستطيع تحليل السلاسل في اللغة بشكل صحيح.

نظرًا لأنني أستطيع التحكم في حالة المعجم من القواعد النحوية، أعتقد أنني سأحل حالة الاستخدام الخاصة بي باستخدام جدول بحث في وحدة المحلل اللغوي، ولكن قد يصبح من الصعب جدًا صيانته/اختباره.لذلك أريد أن أعرف عن بعض الخيارات الأخرى.

في هاسكل سأستخدم بارسيك، وهي مكتبة لوظائف التحليل (المعروفة باسم المجمعات).هل هناك تطبيق بايثون لبارسيك؟أو ربما مكتبة أخرى ذات جودة إنتاجية مليئة بوظائف التحليل حتى أتمكن من إنشاء محلل حساس للسياق في بايثون؟

يحرر:كل محاولاتي للتحليل الحر للسياق باءت بالفشل.لهذا السبب، لا أتوقع أن يكون ANTLR مفيدًا هنا.

هل كانت مفيدة؟

المحلول

أحد الخيارات التي قد تفكر فيها، إذا كان محلل LL مناسبًا لك، هو العطاء أنتلر محاولة، يمكنه إنشاء لغة بايثون أيضًا (في الواقع هو LL(*) كما يسمونه، * يشير إلى مقدار البحث الذي يمكنه التعامل معه).

نصائح أخرى

أعتقد أن pyparsing يعتمد على نفس مبادئ بارسيك.

PySec هو محلل أحادي آخر، لا أعرف الكثير عنه، لكنه يستحق النظر فيه هنا

هناك ANTLR، وهو LL(*)، وهناك PyParsing، وهو أكثر ملاءمة للكائنات ويشبه DSL نوعًا ما، ثم هناك تفسير وهو مثل منهير OCaml.

لا شيء يمنعك من تحويل المحلل اللغوي من المسار "الخالي من السياق" باستخدام PLY.يمكنك تمرير المعلومات إلى المعجم أثناء التحليل، وبهذه الطريقة تحقق المرونة الكاملة.أنا متأكد تمامًا من أنه يمكنك تحليل أي شيء تريده باستخدام PLY بهذه الطريقة.

للحصول على مثال عملي، يعتبر - وهو محلل لـ ANSI C مكتوب بلغة Python مع PLY.إنه يحل مشكلة معرف typedef الكلاسيكية لـ C (التي تجعل قواعد لغة C غير حساسة للسياق) عن طريق ملء جدول الرموز في المحلل اللغوي الذي يتم استخدامه في المعجم لحل أسماء الرموز كأنواع أم لا.

أنتلر رائع وله فائدة إضافية تتمثل في العمل عبر لغات متعددة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top