سؤال

كيف تعمل محلل الصعود العودية؟ لقد كتبت العودية نزول محلل نفسي لكنني لا أفهم محلل LR كل ذلك جيدا. ما انا وجدت على ويكيبيديا أضافت فقط إلى ارتباكي.

سؤال آخر هو السبب في عدم استخدام محلل الصعود العسكري أكثر من نظرائهم القائم على الطاولات. يبدو أن محلل الصعود العودية لديهم أداء أكبر بشكل عام.

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

المحلول

الكتاسيات كتاب التنين يشرح جيدا كيف يعمل محللو LR. يوجد ايضا تقنيات التحليل. دليل عملي. حيث يمكنك أن تقرأ عنها، إذا كنت أتذكر جيدا. المقال في ويكيبيديا (على الأقل مقدمة) ليس صحيحا. تم إنشاؤهم من قبل دونالد نوث، وشرحهم في فن حجم برمجة الكمبيوتر 5. إذا فهمت الإسبانية، فهناك قائمة كاملة بالكتب هنا أرسلت بواسطتي ليس كل هذه الكتب باللغة الإسبانية أيضا.

من قبل أن يفهم كيف يعملون، يجب أن تفهم بعض المفاهيم مثل أولا، ويتبعها و Lookahead. أيضا، أنصحك حقا بفهم محلل المفاهيم وراء LL (Delcadend) قبل محاولة فهم محيطي LR (ASCAID).

هناك عائلة من المحللين LR، وخاصة LR (K)، SLR (K) و Lalr (K)، حيث K هو عدد Lookahead الذي يحتاجون إليه للعمل. يدعم YACC المحللين Lalr (1)، ولكن يمكنك إجراء تعديلات، وليس النظرية القائم على ذلك، لجعلها تعمل مع نوع أكثر قوة من النحو.

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

نصائح أخرى

أنا شخصيا أواجه صعوبة في فهم كيفية استدعاء الدالة أسرع - أقل بكثير "أسرع بكثير" من بحث الجدول. وأظن أنه حتى "أسرع بكثير" أمر ضئيل عند مقارنته بكل شيء آخر يجب أن يفعله جهاز Lexer / المحلل (قراءة الملف في المقام الأول). نظرت إلى صفحة ويكيبيديا، لكنني لم اتبع المراجع؛ هل قام المؤلف في الواقع بجهاز Lexer / محلل كامل؟

أكثر إثارة للاهتمام بالنسبة لي هو تراجع المحللين التي يحركها الطاولة فيما يتعلق بالفرس العيكلي. لقد جئت من خلفية ج، حيث yacc (أو ما يعادلها) كان مولد المحلل المحلل. عندما انتقلت إلى جافا، وجدت تنفيذ واحد على طاولة (Javacup)، والعديد من تطبيقات النزول العودية (Javacc، Antlr).

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

مقالة ويكيبيديا على العودية صعود تحليل المراجع التي يبدو أنها الورقة الأصلية حول الموضوع ("تحليل LR سريع للغاية"). قشط تلك الورق تطهير بعض الأشياء بالنسبة لي. أشياء لاحظت:

  1. تتحدث الورقة عن توليد قانون التجمع. أتساءل عما إذا كنت تستطيع أن تفعل نفس الأشياء التي يقومون بها إذا كنت تولد رمز ج أو Java بدلا من ذلك؛ انظر الأقسام 4 و 5، "استرداد الأخطاء" و "التحقق من تجاوز الفضاء". (أنا لا أحاول أن أبد أسلوبهم - قد يعمل بشكل جيد - فقط قول إنه شيء قد ترغب في النظر إليه قبل الالتزام.)

  2. يقارنون أداة الصعود العودية الخاصة بهم إلى محللهم يقودون الطاولة. من الوصف في قسم النتائج الخاصة بهم، يبدو أن محللها الذي يحركه الطاولة "مفسر بالكامل"؛ لا يتطلب أي رمز مخصص تم إنشاؤه. أتساءل عما إذا كانت هناك أرضية متوسطة حيث لا تزال الهيكل العام مدفوعة في الجدول ولكن يمكنك إنشاء رمز مخصص لبعض الإجراءات لتسريع الأمور.

الورق المشار إليه بواسطة صفحة ويكيبيديا:

ورقة أخرى حول استخدام جيل التعليمات البرمجية بدلا من تفسير الجدول:

أيضا، لاحظ أن تحليل النسب المتكرر ليس أسرع طريقة لتحليل اللغات المستندة إلى قواعد اللغة LL-Grammar:

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