محلل Packrat
محلل Packrat هو نوع من المحللات اللغوية التي تتشابه مع محلل الانحدار التكراري في بنيتها. ومع ذلك، فهو يختلف عنها في أنه يأخذ قواعد التعبير التحليلي (PEGs) كمدخلات بدلاً من قواعد LL . [ 1 ]
في عام ١٩٧٠، وضع ألكسندر بيرمان الأساس لتحليل لغة باكرات من خلال تقديم "مخطط التعرف على لغة TMG" (TS) و"مخطط التعرف على لغة TMG المعمم" (gTS). استند مخطط التعرف على لغة TMG إلى مُجمِّع-مُجمِّع لغة TMG الخاص بروبرت إم. ماكلور، بينما استند مخطط التعرف على لغة TMG المعمم إلى مُجمِّع-مُجمِّع لغة META الخاص بديوي فال شور . لاحقًا، قام أهو وأولمان بتطوير عمل بيرمان، وأُعيدت تسميته إلى لغة التحليل من أعلى إلى أسفل (TDPL) ولغة التحليل من أعلى إلى أسفل المعممة (GTDPL) على التوالي. كانت هذه الخوارزميات الأولى من نوعها التي تستخدم التحليل الحتمي من أعلى إلى أسفل مع التراجع. [ ٢ ] [ ٣ ]
طوّر برايان فورد قواعد PEG كتوسيع لقواعد GTDPL وTS. على عكس قواعد CFG ، تتميز قواعد PEG بوضوحها التام وتوافقها الجيد مع اللغات الموجهة للآلة. كما تستطيع قواعد PEG، على غرار GTDPL وTS، التعبير عن جميع قواعد LL(k) و LR(k) . وقدّم فورد أيضًا Packrat كمحلل نحوي يستخدم تقنيات التخزين المؤقت فوق محلل PEG بسيط. وقد تم ذلك لأن قواعد PEG تتمتع بقدرة استشرافية غير محدودة ، مما ينتج عنه محلل نحوي ذو أداء زمني أُسّي في أسوأ الحالات. [ 2 ] [ 3 ]
يحتفظ برنامج Packrat بسجل للنتائج الوسيطة لجميع دوال التحليل المتداخلة. تُستدعى كل دالة تحليل مرة واحدة فقط عند موضع إدخال محدد. في بعض حالات تطبيق Packrat، إذا لم تكن الذاكرة كافية، فقد يلزم استدعاء بعض دوال التحليل عدة مرات عند موضع الإدخال نفسه، مما يؤدي إلى استغراق المحلل وقتًا أطول من الوقت الخطي. [ 4 ]
بناء الجملة
يأخذ محلل packrat نفس بنية PEGs كمدخلات: يتكون PEG بسيط من رموز طرفية وغير طرفية، وربما متداخلة مع عوامل تشكل قاعدة اشتقاق واحدة أو أكثر. [ 2 ]
الرموز
- تُشار إلى الرموز غير النهائية بأحرف كبيرة (مثلاً،)
- تُشار إلى الرموز الطرفية بأحرف صغيرة (مثلاً،)
- تُشار إلى التعبيرات بأحرف يونانية صغيرة (مثلاً،)
- يمكن أن تتكون التعبيرات من مزيج من الرموز الطرفية والرموز غير الطرفية والمعاملات.
المشغلون
| المشغل | علم الدلالة |
|---|---|
| تسلسل | النجاح: إذاومعترف بها الفشل: إذاأوغير معترف بها تم استهلاكه:وفي حالة النجاح |
| الاختيار المرتب | النجاح: إذا كان أي مما يلييتم التعرف عليه بدءًا من اليسار الفشل: كل شيءلا تتطابق تم استهلاكه: التعبير الذري الذي حقق نجاحًا، لذا في حالة نجاح عدة تعبيرات، يتم دائمًا إرجاع أول تعبير ناجح. |
| والمسند | النجاح: إذامعترف به الفشل: إذاغير معترف به المستهلك: لم يتم استهلاك أي مدخلات |
| ليس مسندًا !\alpha } | النجاح: إذاغير معترف به الفشل: إذامعترف به المستهلك: لم يتم استهلاك أي مدخلات |
| واحد أو أكثر | النجاح: حاول أن تتعرفمرة واحدة أو عدة مرات الفشل: إذاغير معترف به المستهلك: الحد الأقصى للعدد الذيمعترف به |
| صفر أو أكثر | النجاح: حاول أن تتعرفصفر أو عدة مرات الفشل: لا يمكن أن يفشل المستهلك: الحد الأقصى للعدد الذيمعترف به |
| صفر أو واحد ؟} | النجاح: حاول أن تتعرفصفر أو واحد الفشل: لا يمكن أن يفشل تم استهلاكه:إذا تم الاعتراف به |
| نطاق المحطة الطرفية [] | نجاح: التعرف على أي طرفيةالتي تقع ضمن النطاقفي حالة،يمكن أن يكون أي حرف من h إلى z فشل: في حالة عدم وجود طرفية داخليمكن التعرف عليها تم استهلاكه:إذا تم الاعتراف به |
| أي شخصية | نجاح: التعرف على أي حرف في المدخلات فشل: إذا لم يكن هناك حرف في المدخلات تم استهلاكه: أي حرف في المدخلات |
قواعد
تتكون قاعدة الاشتقاق من رمز غير طرفي وتعبير.
تعبير خاصهي نقطة البداية للقواعد. [ 2 ] في حالة عدمإذا تم تحديد ذلك، يتم استخدام التعبير الأول من القاعدة الأولى.
تُعتبر سلسلة الإدخال مقبولة من قِبل المحلل اللغوي إذا كانتيتم التعرف عليه. وكنتيجة جانبية، سلسلةيمكن التعرف عليها بواسطة المحلل اللغوي حتى لو لم يتم استهلاكها بالكامل. [ 2 ]
ومن الأمثلة المتطرفة على هذه القاعدة أن القواعديطابق أي سلسلة نصية.
يمكن تجنب ذلك عن طريق إعادة كتابة القواعد النحوية على النحو التالي:
مثال
تتعرف هذه القواعد النحوية على بعض الكلمات المتناظرة في الأبجدية، مع رقم اختياري في المنتصف.
تتضمن أمثلة السلاسل النصية التي تقبلها القواعد النحوية ما يلي:ولكنها تفشل في القبول.
التكرار الأيسر
يحدث الاستدعاء الذاتي الأيسر عندما يشير إنتاج نحوي إلى نفسه كعنصره الأيسر، سواءً بشكل مباشر أو غير مباشر. ولأن Packrat محلل نحوي تنازلي تكراري، فإنه لا يستطيع التعامل مع الاستدعاء الذاتي الأيسر مباشرةً. [ 5 ] خلال المراحل الأولى من التطوير، وُجد أنه يمكن تحويل الإنتاج ذي الاستدعاء الذاتي الأيسر إلى إنتاج ذي استدعاء ذاتي أيمن. [ 6 ] يُبسط هذا التعديل مهمة محلل Packrat بشكل كبير. مع ذلك، إذا كان هناك استدعاء ذاتي أيسر غير مباشر، فقد تكون عملية إعادة الكتابة معقدة وصعبة للغاية. إذا تم تخفيف متطلبات التعقيد الزمني من خطي إلى فوق الخطي ، فمن الممكن تعديل جدول التخزين المؤقت لمحلل Packrat للسماح بالاستدعاء الذاتي الأيسر، دون تغيير قواعد الإدخال. [ 5 ]
المُجمِّع التكراري
المُركِّبات التكراريةوتتطلب هذه المجموعات عناية خاصة عند استخدامها في محلل Packrat: فهي تُدخل استدعاءً تكراريًا سريًا لا يُسجل النتائج الوسيطة في مصفوفة المخرجات، مما قد يؤدي إلى عمل المحلل بسلوك غير خطي. يمكن حل هذه المشكلة بتطبيق التحويل التالي: [ 1 ]
| إبداعي | مترجم |
|---|---|
بفضل هذا التحويل، يمكن تخزين النتائج الوسيطة بشكل صحيح.
تقنية الحفظ
التخزين المؤقت هو أسلوب تحسين في الحوسبة يهدف إلى تسريع البرامج عن طريق تخزين نتائج استدعاءات الدوال المكلفة. يعمل هذا الأسلوب أساسًا عن طريق تخزين النتائج مؤقتًا، بحيث عند تكرار نفس المدخلات، تُعاد النتيجة المخزنة ببساطة، متجنبةً بذلك عملية إعادة الحساب التي تستغرق وقتًا طويلاً. [ 7 ] عند استخدام تحليل Packrat والتخزين المؤقت، تجدر الإشارة إلى أن دالة التحليل لكل رمز غير طرفي تعتمد كليًا على سلسلة الإدخال، ولا تعتمد على أي معلومات جُمعت أثناء عملية التحليل. وبالتالي، لا تؤثر إدخالات جدول التخزين المؤقت على حالة المحلل اللغوي في أي وقت، ولا تعتمد عليها. [ 8 ]
يخزن تحليل Packrat النتائج في مصفوفة أو بنية بيانات مشابهة تسمح بعمليات بحث وإدراج سريعة. عند مصادفة قاعدة إنتاج، يتم فحص المصفوفة لمعرفة ما إذا كانت قد ظهرت من قبل. إذا كانت موجودة، يتم استرجاع النتيجة من المصفوفة. وإذا لم تكن موجودة، يتم تقييم قاعدة الإنتاج، وإدراج النتيجة في المصفوفة، ثم إعادتها. [ 9 ] عند تقييم كاملفي المصفوفة ضمن نهج جدولي، سيتطلب ذلك[ 9 ] هنا ،يمثل عدد الرموز غير الطرفية، ويمثل حجم سلسلة الإدخال.
في تطبيق بسيط، يمكن استخلاص الجدول بأكمله من سلسلة الإدخال بدءًا من نهاية السلسلة.
يمكن تحسين محلل Packrat لتحديث الخلايا الضرورية فقط في المصفوفة من خلال زيارة عميقة أولاً لكل شجرة تعبير فرعي. وبالتالي، باستخدام مصفوفة بأبعادغالبًا ما يكون هذا الأسلوب مُهدرًا للذاكرة، إذ ستبقى معظم المدخلات فارغة. [ 5 ] ترتبط هذه الخلايا بسلسلة الإدخال، وليس بالرموز غير الطرفية للقواعد النحوية. هذا يعني أن زيادة حجم سلسلة الإدخال ستؤدي دائمًا إلى زيادة استهلاك الذاكرة، بينما لا يُغير عدد قواعد التحليل إلا أسوأ تعقيد للمساحة. [ 1 ]
عامل القطع
أُضيف عامل آخر يُسمى "cut" إلى Packrat لتقليل متوسط تعقيد المساحة بشكل أكبر. يستفيد هذا العامل من البنى الرسمية للعديد من لغات البرمجة لاستبعاد الاشتقاقات غير الممكنة. على سبيل المثال، يكون تحليل عبارات التحكم في لغة برمجة قياسية حصريًا متبادلًا مع أول رمز مميز يتم التعرف عليه، على سبيل المثال،[ 10 ]
| المشغل | علم الدلالة |
|---|---|
| يقطع | لومعترف به ولكنإذا لم يكن الأمر كذلك، فتجاوز تقييم البديل. في الحالة الأولى، لا تقم بالتقييملوتم الاعتراف بالقاعدة الثانية، ويمكن إعادة صياغتها على النحو التالي:ويمكن تطبيق القواعد نفسها. |
عندما يستخدم محلل Packrat عوامل القطع، فإنه يُفرغ فعليًا مكدس التراجع الخاص به. ويعود ذلك إلى أن عامل القطع يُقلل عدد البدائل الممكنة في الاختيار المُرتب. وبإضافة عوامل القطع في المواضع المناسبة في تعريف القواعد النحوية، لا يحتاج محلل Packrat الناتج إلا إلى مساحة ثابتة تقريبًا للتخزين المؤقت. ومع ذلك، لا تزال المشكلة الأساسية المتمثلة في أن محللات Packrat تتطلب مساحة O(n) قائمة. [ 10 ]
الخوارزمية
رسم تخطيطي لتنفيذ خوارزمية Packrat بلغة شبه كودية تشبه لغة Lua. [ 5 ]
إدخال ( ن ) -- إرجاع الحرف الموجود في الموضع نالقاعدة ( R : القاعدة ، P : الموضع )entry = GET_MEMO ( R , P ) -- إرجاع عدد العناصر التي تمت مطابقتها مسبقًا في القاعدة R عند الموضع Pإذا كانت قيمة المدخل تساوي nil ،return EVAL ( R , P );نهايةإرجاع المدخل ؛EVAL ( R : القاعدة , P : الموضع )البداية = P ;for choice in R . choices -- إرجاع قائمة بالخياراتacc = 0 ;for symbol in choice then -- أعد كل عنصر من عناصر القاعدة، طرفي وغير طرفيإذا كان الرمز طرفيًا ،إذا كان INPUT ( start + acc ) == symbol . terminal ثمacc = acc + 1 ; -- تم العثور على الطرفية الصحيحة، تجاوزهاآخراستراحة ؛نهايةآخرres = RULE ( symbol . nonterminal , start + acc ); -- محاولة التعرف على رمز غير طرفي في الموضع start+accSET_MEMO ( symbol . nonterminal , start + acc , res ); -- نقوم أيضًا بتخزين الفشل بالقيمة الخاصة failإذا كانت النتيجة تساوي فشلًا ،استراحة ؛نهايةacc = acc + res ;نهايةإذا كان الرمز يساوي آخر رمز في الاختيار ، فتحقق مما إذا كان قد تم مطابقة الرمز الأخير في الاختيار، وإذا كان الأمر كذلك، فأرجعإرجاع acc ;نهايةنهايةإرجاع فشل ؛ -- إذا لم يكن هناك تطابق في الاختيار، يتم إرجاع فشلمثال
بالنظر إلى السياق التالي، قواعد نحوية حرة تتعرف على التعبيرات الحسابية البسيطة المكونة من أرقام مفردة متداخلة مع الجمع والضرب والأقواس.
باستخدام الرمز ⊣ كفاصل للخط، يمكننا تطبيق خوارزمية باكرات
| شجرة بناء الجملة | فعل | طاولة باكرات | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
لم يتم التحديث لعدم التعرف على أي طرفية | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
تحديث: D(1) = 1؛ P(1) = 1; | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
لا يوجد تحديث لأنه لم يتم التعرف على أي طرفية غير طرفية بشكل كامل | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
لم يتم التحديث لعدم التعرف على أي طرفية | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
تحديث: D(4) = 1؛ P(4) = 1; | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ضربة على النقطة P(4) قم بتحديث M(4) = 1 حيث تم التعرف على M | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
لم يتم التحديث لعدم التعرف على أي طرفية | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
تحديث: D(6) = 1؛ P(6) = 1; | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ضربة على النقطة P(6) قم بتحديث M(6) = 1 حيث تم التعرف على M | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ضربة على M(6) قم بتحديث A(4) = 3 حيث تم التعرف على A قم بتحديث P(3) إلى 5 حيث تم التعرف على P | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
لم يتم التحديث لعدم التعرف على أي طرفية | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ضربة على النقطة P(3) قم بتحديث M(1)=7 حيث تم التعرف على M | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
لم يتم التحديث لعدم التعرف على أي طرفية | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ضربة على M(1) قم بتحديث A(1)=7 حيث تم التعرف على A قم بتحديث S(1)=7 حيث تم التعرف على S | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
تطبيق
| اسم | خوارزمية التحليل | لغات الإخراج | القواعد، الشفرة | منصة التطوير | رخصة |
|---|---|---|---|---|---|
| أوستن إكس | باكرات (معدل) | جافا | متفرق | الجميع | مجاني، بي إس دي |
| ثور بري | باكرات | سي ، أوكاميل ، جافا | مختلط | الجميع | مجاني، رخصة جنو العمومية العامة |
| مظلة | باكرات | جافا ، جافا سكريبت ، بايثون ، روبي | متفرق | الجميع | مجاني، رخصة جنو العمومية العامة |
| CL-peg | باكرات | لغة الشفرة الشائعة | مختلط | الجميع | مجاناً، معهد ماساتشوستس للتكنولوجيا |
| يا للهول! | باكرات | د | مختلط | الجميع | مجاني، رخصة جنو العمومية العامة |
| فريسبي | باكرات | هاسكل | مختلط | الجميع | مجاني، بي إس دي |
| grammar::peg | باكرات | تي سي إل | مختلط | الجميع | مجاني، بي إس دي |
| IronMeta | باكرات | سي شارب | مختلط | ويندوز | مجاني، بي إس دي |
| PEGParser | Packrat (يدعم الاستدعاء الذاتي الأيسر والغموض النحوي) | لغة سي++ | تطابق | الجميع | مجاني، بي إس دي |
| حوت النروال | باكرات | ج | مختلط | POSIX ، ويندوز | مجاني، بي إس دي |
| الورم الجديد | باكرات | إرلانغ | متفرق | الجميع | مجاناً، معهد ماساتشوستس للتكنولوجيا |
| ميتا | باكرات (معدل، مع تخزين جزئي للذاكرة) | جافا سكريبت ، سكويك ، بايثون | مختلط | الجميع | مجاناً، معهد ماساتشوستس للتكنولوجيا |
| حزمة سي سي | Packrat (معدل، يدعم التكرار الأيسر) | ج | مختلط | الجميع | مجاناً، معهد ماساتشوستس للتكنولوجيا |
| باكرات | باكرات | مخطط | مختلط | الجميع | مجاناً، معهد ماساتشوستس للتكنولوجيا |
| بابي | باكرات | هاسكل | مختلط | الجميع | مجاني، بي إس دي |
| الجزر الأبيض | باكرات | لغة سي++ | مختلط | ويندوز | مجاني، رخصة جنو العمومية العامة |
| PEG.js | باكرات (حفظ جزئي) | جافا سكريبت | مختلط | الجميع | مجاناً، معهد ماساتشوستس للتكنولوجيا |
| بيغي [ 11 ] | باكرات (حفظ جزئي) | جافا سكريبت | مختلط | الجميع | مجاناً، معهد ماساتشوستس للتكنولوجيا |
| بيغاسوس | الانحدار المتكرر، باك رات (بشكل انتقائي) | سي شارب | مختلط | ويندوز | مجاناً، معهد ماساتشوستس للتكنولوجيا |
| PetitParser | باكرات | سمول توك ، جافا ، دارت | مختلط | الجميع | مجاناً، معهد ماساتشوستس للتكنولوجيا |
| مكتبة PyPy | باكرات | بايثون | مختلط | الجميع | مجاناً، معهد ماساتشوستس للتكنولوجيا |
| يا للهول! | باكرات | جافا | مختلط | آلة جافا الافتراضية | مجاني، رخصة جنو العمومية الصغرى |
| باحث عن الأشياء القابلة للتجميع | باكرات | يذهب | تطابق | الجميع | مجاني، مرخص بموجب رخصة جنو العمومية الإصدار 3 |
انظر أيضاً
مراجع
- 1 2 3 فورد، برايان (2006). "تحليل Packrat: بسيط، قوي، كسول، وقت خطي". arXiv : cs/0603077 .
- 1 2 3 4 5 فورد، برايان (2004-01-01). "تحليل قواعد التعبير" . وقائع الندوة الحادية والثلاثين لجمعية ACM SIGPLAN-SIGACT حول مبادئ لغات البرمجة . POPL '04. نيويورك، نيويورك، الولايات المتحدة الأمريكية: جمعية آلات الحوسبة. الصفحات 111-122 . doi : 10.1145/964001.964011 . ISBN 978-1-58113-729-3. S2CID 7762102 .
- 1 2 فلودين، دانيال. "مقارنة بين تحليل Packrat وتحليل Shift-Reduce التقليدي على قواعد اللغة والمدخلات من العالم الحقيقي" (PDF) .
- ↑ ميزوشيما، كوتا؛ مايدا، أتوسي؛ ياماغوتشي، يوشينوري (2010-05-06). "يمكن لمحللات Packrat التعامل مع القواعد النحوية العملية في مساحة ثابتة في الغالب". وقائع ورشة عمل ACM SIGPLAN-SIGSOFT التاسعة حول تحليل البرامج لأدوات وهندسة البرمجيات . ACM. الصفحات 29-36. doi : 10.1145 / 1806672.1806679 . ISBN 978-1-4503-0082-7. S2CID 14498865 .
- 1 2 3 4 وارث، أليساندرو؛ دوغلاس، جيمس ر.؛ ميلستين، تود (7 يناير 2008). "يمكن لمحللات Packrat دعم الاستدعاء الذاتي الأيسر" . وقائع ندوة ACM SIGPLAN لعام 2008 حول التقييم الجزئي ومعالجة البرامج القائمة على الدلالات . PEPM '08. نيويورك، نيويورك، الولايات المتحدة الأمريكية: رابطة آلات الحوسبة. الصفحات 103-110 . doi : 10.1145/1328408.1328424 . ISBN 978-1-59593-977-7. S2CID 2168153 .
- ↑ أهو، ألفريد ف.؛ لام، مونيكا س.؛ سيثي، رافي؛ أولمان، جيفري د.، محرران. (2007). المترجمات: المبادئ والتقنيات والأدوات (الطبعة الثانية ). بوسطن - ميونخ: بيرسون أديسون ويسلي. ISBN 978-0-321-48681-3.
- ↑ نورفيج، بيتر (1991-03-01). "تقنيات التخزين المؤقت التلقائي مع تطبيقات على التحليل النحوي الخالي من السياق" . اللغويات الحاسوبية . 17 (1): 91-98 . ISSN 0891-2017 .
- ↑ دوبروي، باتريك؛ وارث، أليساندرو (23 أكتوبر 2017). "تحليل باكرات التدريجي" . وقائع المؤتمر الدولي العاشر لهندسة لغات البرمجيات ACM SIGPLAN . SLE 2017. نيويورك، نيويورك، الولايات المتحدة الأمريكية: رابطة آلات الحوسبة. الصفحات 14-25 . doi : 10.1145/3136014.3136022 . ISBN 978-1-4503-5525-4. S2CID 13047585 .
- 1 2 مجلة العلوم، المجلة الدولية للبحوث العلمية في الهندسة والتكنولوجيا. "دراسة استقصائية لمحلل Packrat" . دراسة استقصائية لمحلل Packrat .
- 1 2 ميزوشيما، كوتا؛ مايدا، أتوسي؛ ياماغوتشي، يوشينوري (2010-05-06). "يمكن لمحللات Packrat التعامل مع القواعد النحوية العملية في مساحة ثابتة في الغالب" . وقائع ورشة عمل ACM SIGPLAN-SIGSOFT التاسعة حول تحليل البرامج لأدوات وهندسة البرمجيات . PASTE '10. نيويورك، نيويورك، الولايات المتحدة الأمريكية: رابطة آلات الحوسبة. الصفحات 29-36 . doi : 10.1145/1806672.1806679 . ISBN 978-1-4503-0082-7. S2CID 14498865 .
- ↑ نسخة مُعدّلة من PEG.js
روابط خارجية
- خوارزميات التحليل
- البرمجة الديناميكية

