محلل 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 ]

الرموز

  • تُشار إلى الرموز غير النهائية بأحرف كبيرة (مثلاً،{S،هـ،F،د}{\displaystyle \{S,E,F,D\}})
  • تُشار إلى الرموز الطرفية بأحرف صغيرة (مثلاً،{أ،ب،z،هـ،ز}{\displaystyle \{a,b,z,e,g\}})
  • تُشار إلى التعبيرات بأحرف يونانية صغيرة (مثلاً،{α،β،γ،ω،τ}{\displaystyle \{\alpha ,\beta ,\gamma ,\omega ,\tau \}})
    • يمكن أن تتكون التعبيرات من مزيج من الرموز الطرفية والرموز غير الطرفية والمعاملات.

المشغلون

قواعد بناء الجملة
المشغلعلم الدلالة
تسلسل

αβ{\displaystyle \alpha \beta }

النجاح: إذاα{\displaystyle \alpha }وβ{\displaystyle \beta }معترف بها

الفشل: إذاα{\displaystyle \alpha }أوβ{\displaystyle \beta }غير معترف بها

تم استهلاكه:α{\displaystyle \alpha }وβ{\displaystyle \beta }في حالة النجاح

الاختيار المرتب

α/β/γ{\displaystyle \alpha /\beta /\gamma }

النجاح: إذا كان أي مما يلي{α،β،γ}{\displaystyle \{\alpha ,\beta ,\gamma \}}يتم التعرف عليه بدءًا من اليسار

الفشل: كل شيء{α،β،γ}{\displaystyle \{\alpha ,\beta ,\gamma \}}لا تتطابق

تم استهلاكه: التعبير الذري الذي حقق نجاحًا، لذا في حالة نجاح عدة تعبيرات، يتم دائمًا إرجاع أول تعبير ناجح.

والمسند

وα{\displaystyle \&\alpha }

النجاح: إذاα{\displaystyle \alpha }معترف به

الفشل: إذاα{\displaystyle \alpha }غير معترف به

المستهلك: لم يتم استهلاك أي مدخلات

ليس مسندًا

!α{\displaystyle !\alpha }

النجاح: إذاα{\displaystyle \alpha }غير معترف به

الفشل: إذاα{\displaystyle \alpha }معترف به

المستهلك: لم يتم استهلاك أي مدخلات

واحد أو أكثر

α+{\displaystyle \alpha +}

النجاح: حاول أن تتعرفα{\displaystyle \alpha }مرة واحدة أو عدة مرات

الفشل: إذاα{\displaystyle \alpha }غير معترف به

المستهلك: الحد الأقصى للعدد الذيα{\displaystyle \alpha }معترف به

صفر أو أكثر

α*{\displaystyle \alpha *}

النجاح: حاول أن تتعرفα{\displaystyle \alpha }صفر أو عدة مرات

الفشل: لا يمكن أن يفشل

المستهلك: الحد الأقصى للعدد الذيα{\displaystyle \alpha }معترف به

صفر أو واحد

α؟{\displaystyle \alpha ؟}

النجاح: حاول أن تتعرفα{\displaystyle \alpha }صفر أو واحد

الفشل: لا يمكن أن يفشل

تم استهلاكه:α{\displaystyle \alpha }إذا تم الاعتراف به

نطاق المحطة الطرفية

[أ-ب{\displaystyle ab}]

نجاح: التعرف على أي طرفيةج{\displaystyle c}التي تقع ضمن النطاق[أ-ب]{\displaystyle [ab]}في حالة['ح'-'z']{\displaystyle [{\textbf {'}}h{\textbf {'}}-{\textbf {'}}z{\textbf {'}}]}،ج{\displaystyle c}يمكن أن يكون أي حرف من h إلى z

فشل: في حالة عدم وجود طرفية داخل[أ-ب]{\displaystyle [ab]}يمكن التعرف عليها

تم استهلاكه:ج{\displaystyle c}إذا تم الاعتراف به

أي شخصية

.{\displaystyle .}

نجاح: التعرف على أي حرف في المدخلات

فشل: إذا لم يكن هناك حرف في المدخلات

تم استهلاكه: أي حرف في المدخلات

قواعد

تتكون قاعدة الاشتقاق من رمز غير طرفي وتعبيرSα{\displaystyle S\rightarrow \alpha }.

تعبير خاصαs{\displaystyle \alpha _{s}}هي نقطة البداية للقواعد. [ 2 ] في حالة عدمαs{\displaystyle \alpha _{s}}إذا تم تحديد ذلك، يتم استخدام التعبير الأول من القاعدة الأولى.

تُعتبر سلسلة الإدخال مقبولة من قِبل المحلل اللغوي إذا كانتαs{\displaystyle \alpha _{s}}يتم التعرف عليه. وكنتيجة جانبية، سلسلةx{\displaystyle x}يمكن التعرف عليها بواسطة المحلل اللغوي حتى لو لم يتم استهلاكها بالكامل. [ 2 ]

ومن الأمثلة المتطرفة على هذه القاعدة أن القواعدSx*{\displaystyle S\rightarrow x*}يطابق أي سلسلة نصية.

يمكن تجنب ذلك عن طريق إعادة كتابة القواعد النحوية على النحو التالي:Sx*!.{\displaystyle S\rightarrow x*!.}

مثال

{Sأ/ب/دأ'أ' S 'أ'بب S بد('0'-'9')؟{\displaystyle {\begin{cases}S\rightarrow A/B/D\\A\rightarrow {\texttt {'a'}}\ S\ {\texttt {'a'}}\\B\rightarrow {\texttt {'b'}}\ S\ {\texttt {'b'}}\\D\rightarrow ({\texttt {'0'}}-{\texttt {'9'}})?\end{cases}}}

تتعرف هذه القواعد النحوية على بعض الكلمات المتناظرة في الأبجدية{أ،ب}{\displaystyle \{a,b\}}، مع رقم اختياري في المنتصف.

تتضمن أمثلة السلاسل النصية التي تقبلها القواعد النحوية ما يلي:'aa'{\displaystyle {\texttt {'aa'}}}و'aba3aba'{\displaystyle {\texttt {'aba3aba'}}}لكنها تفشل في القبول'آآآآ'{\displaystyle {\texttt {'aaaa'}}}.

التكرار الأيسر

يحدث الاستدعاء الذاتي الأيسر عندما يشير إنتاج نحوي إلى نفسه كعنصره الأيسر، سواءً بشكل مباشر أو غير مباشر. ولأن Packrat محلل نحوي تنازلي تكراري، فإنه لا يستطيع التعامل مع الاستدعاء الذاتي الأيسر مباشرةً. [ 5 ] خلال المراحل الأولى من التطوير، وُجد أنه يمكن تحويل الإنتاج ذي الاستدعاء الذاتي الأيسر إلى إنتاج ذي استدعاء ذاتي أيمن. [ 6 ] يُبسط هذا التعديل مهمة محلل Packrat بشكل كبير. مع ذلك، إذا كان هناك استدعاء ذاتي أيسر غير مباشر، فقد تكون عملية إعادة الكتابة معقدة وصعبة للغاية. إذا تم تخفيف متطلبات التعقيد الزمني من خطي إلى فوق الخطي ، فمن الممكن تعديل جدول التخزين المؤقت لمحلل Packrat للسماح بالاستدعاء الذاتي الأيسر، دون تغيير قواعد الإدخال. [ 5 ]

المُجمِّع التكراري

المُركِّبات التكراريةα+{\displaystyle \alpha +}وα*{\displaystyle \alpha *}تتطلب هذه المجموعات عناية خاصة عند استخدامها في محلل Packrat: فهي تُدخل استدعاءً تكراريًا سريًا لا يُسجل النتائج الوسيطة في مصفوفة المخرجات، مما قد يؤدي إلى عمل المحلل بسلوك غير خطي. يمكن حل هذه المشكلة بتطبيق التحويل التالي: [ 1 ]

إبداعيمترجم
Sα+{\displaystyle S\rightarrow \alpha +}SαS/α{\displaystyle S\rightarrow \alpha S/\alpha }
Sα*{\displaystyle S\rightarrow \alpha *}SαS/ϵ{\displaystyle S\rightarrow \alpha S/\epsilon }

بفضل هذا التحويل، يمكن تخزين النتائج الوسيطة بشكل صحيح.

تقنية الحفظ

التخزين المؤقت هو أسلوب تحسين في الحوسبة يهدف إلى تسريع البرامج عن طريق تخزين نتائج استدعاءات الدوال المكلفة. يعمل هذا الأسلوب أساسًا عن طريق تخزين النتائج مؤقتًا، بحيث عند تكرار نفس المدخلات، تُعاد النتيجة المخزنة ببساطة، متجنبةً بذلك عملية إعادة الحساب التي تستغرق وقتًا طويلاً. [ 7 ] عند استخدام تحليل Packrat والتخزين المؤقت، تجدر الإشارة إلى أن دالة التحليل لكل رمز غير طرفي تعتمد كليًا على سلسلة الإدخال، ولا تعتمد على أي معلومات جُمعت أثناء عملية التحليل. وبالتالي، لا تؤثر إدخالات جدول التخزين المؤقت على حالة المحلل اللغوي في أي وقت، ولا تعتمد عليها. [ 8 ]

يخزن تحليل Packrat النتائج في مصفوفة أو بنية بيانات مشابهة تسمح بعمليات بحث وإدراج سريعة. عند مصادفة قاعدة إنتاج، يتم فحص المصفوفة لمعرفة ما إذا كانت قد ظهرت من قبل. إذا كانت موجودة، يتم استرجاع النتيجة من المصفوفة. وإذا لم تكن موجودة، يتم تقييم قاعدة الإنتاج، وإدراج النتيجة في المصفوفة، ثم إعادتها. [ 9 ] عند تقييم كاملم*ن{\displaystyle m*n}في المصفوفة ضمن نهج جدولي، سيتطلب ذلكΘ(من){\displaystyle \Theta (mn)}[ 9 ] هنا ،م{\displaystyle m}يمثل عدد الرموز غير الطرفية، ون{\displaystyle n}يمثل حجم سلسلة الإدخال.

في تطبيق بسيط، يمكن استخلاص الجدول بأكمله من سلسلة الإدخال بدءًا من نهاية السلسلة.

يمكن تحسين محلل Packrat لتحديث الخلايا الضرورية فقط في المصفوفة من خلال زيارة عميقة أولاً لكل شجرة تعبير فرعي. وبالتالي، باستخدام مصفوفة بأبعادم*ن{\displaystyle m*n}غالبًا ما يكون هذا الأسلوب مُهدرًا للذاكرة، إذ ستبقى معظم المدخلات فارغة. [ 5 ] ترتبط هذه الخلايا بسلسلة الإدخال، وليس بالرموز غير الطرفية للقواعد النحوية. هذا يعني أن زيادة حجم سلسلة الإدخال ستؤدي دائمًا إلى زيادة استهلاك الذاكرة، بينما لا يُغير عدد قواعد التحليل إلا أسوأ تعقيد للمساحة. [ 1 ]

عامل القطع

أُضيف عامل آخر يُسمى "cut" إلى Packrat لتقليل متوسط ​​تعقيد المساحة بشكل أكبر. يستفيد هذا العامل من البنى الرسمية للعديد من لغات البرمجة لاستبعاد الاشتقاقات غير الممكنة. على سبيل المثال، يكون تحليل عبارات التحكم في لغة برمجة قياسية حصريًا متبادلًا مع أول رمز مميز يتم التعرف عليه، على سبيل المثال،{أناو،دo،wحأنالهـ،swأناتجح}{\displaystyle \{{\mathtt {if,do,while,switch}}\}}[ 10 ]

المشغلعلم الدلالة
يقطع

αβ/γ(αβ)*{\displaystyle {\begin{array}{l}\alpha \uparrow \beta /\gamma \\(\alpha \uparrow \beta )*\end{array}}}

لوα{\displaystyle \alpha }معترف به ولكنβ{\displaystyle \beta }إذا لم يكن الأمر كذلك، فتجاوز تقييم البديل.

في الحالة الأولى، لا تقم بالتقييمγ{\displaystyle \gamma }لوα{\displaystyle \alpha }تم الاعتراف بالقاعدة الثانية، ويمكن إعادة صياغتها على النحو التالي:شمالαβشمال/ϵ{\displaystyle N\rightarrow \alpha \uparrow \beta N/\epsilon }ويمكن تطبيق القواعد نفسها.

عندما يستخدم محلل 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 ;نهايةنهايةإرجاع فشل ؛ -- إذا لم يكن هناك تطابق في الاختيار، يتم إرجاع فشل

مثال

بالنظر إلى السياق التالي، قواعد نحوية حرة تتعرف على التعبيرات الحسابية البسيطة المكونة من أرقام مفردة متداخلة مع الجمع والضرب والأقواس.

{Sأأم '+' أ / ممP '*' م / PP'(' أ ')' / دد('0'-'9'){\displaystyle {\begin{cases}S\rightarrow A\\A\rightarrow M\ {\texttt {'+'}}\ A\ /\ M\\M\rightarrow P\ {\texttt {'*'}}\ M\ /\ P\\P\rightarrow {\texttt {'('}}\ A\ {\texttt {')'}}\ /\ D\\D\rightarrow ({\texttt {'0'}}-{\texttt {'9'}})\end{cases}}}

باستخدام الرمز كفاصل للخط، يمكننا تطبيق خوارزمية باكرات

اشتقاق2*(3+4)
شجرة بناء الجملةفعلطاولة باكرات
قواعد الاشتقاقتم تحويل المدخلات
Sأأم '+' أمP '*' مP'(' أ ')'{\displaystyle {\begin{array}{l}S\rightarrow A\\A\rightarrow M\ {\texttt {'+'}}\ A\\M\rightarrow P\ {\texttt {'*'}}\ M\\P\rightarrow {\texttt {'('}}\ A\ {\texttt {')'}}\end{array}}}ɛ
ملحوظاتالمدخل الأيسر
المدخلات لا تتطابق مع العنصر الأول في الاشتقاق.

العودة إلى قاعدة النحو الأولى ذات البديل غير المستكشفP'(' أ ')' / د_{\textstyle P\rightarrow {\texttt {'('}}\ A\ {\texttt {')'}}\ /\ {\underline {D}}}

2*(3+4)
فِهرِس
1234567
S
أ
م
P
د
2*(3+4)

لم يتم التحديث لعدم التعرف على أي طرفية

قواعد الاشتقاقتم تحويل المدخلات
Pد{\displaystyle P\rightarrow D}د2{\displaystyle D\rightarrow 2}2
ملحوظاتالمدخل الأيسر
قم بإزاحة المدخلات بمقدار واحد بعد استخراج الطرفية 2*(3+4)
فِهرِس
1234567
S
أ
م
P1
د1
2*(3+4)

تحديث:

D(1) = 1؛

P(1) = 1;

قواعد الاشتقاقتم تحويل المدخلات
مP '*' م{\displaystyle M\rightarrow P\ {\texttt {'*'}}\ M}P'(' أ ')'{\displaystyle P\rightarrow {\texttt {'('}}\ A\ {\texttt {')'}}}2*(
ملحوظاتالمدخل الأيسر
إزاحة الإدخال بمقدار طرفين{*،(}{\displaystyle \{{\texttt {*}},{\texttt {(}}\}}3+4)
فِهرِس
1234567
S
أ
م
P1
د1
2*(3+4)

لا يوجد تحديث لأنه لم يتم التعرف على أي طرفية غير طرفية بشكل كامل

قواعد الاشتقاقتم تحويل المدخلات
أم '+' أ{\displaystyle A\rightarrow M\ {\texttt {'+'}}\ A}مP '*' م{\displaystyle M\rightarrow P\ {\texttt {'*'}}\ M}P'(' أ ')'{\displaystyle P\rightarrow {\texttt {'('}}\ A\ {\texttt {')'}}}2*(
ملحوظاتالمدخل الأيسر
المدخلات لا تتطابق مع العنصر الأول في الاشتقاق.

العودة إلى قاعدة النحو الأولى ذات البديل غير المستكشفP'(' أ ')' / د_{\textstyle P\rightarrow {\texttt {'('}}\ A\ {\texttt {')'}}\ /\ {\underline {D}}}

3+4)
فِهرِس
1234567
S
أ
م
P1
د1
2*(3+4)

لم يتم التحديث لعدم التعرف على أي طرفية

قواعد الاشتقاقتم تحويل المدخلات
Pد{\displaystyle P\rightarrow D}د3{\displaystyle D\rightarrow 3}2*(
ملحوظاتالمدخل الأيسر
قم بإزاحة المدخلات بمقدار واحد بعد استخراج الطرفية 3

لكن المدخلات الجديدة لن تتطابق في الداخلمP '*' م{\displaystyle M\rightarrow P\ {\texttt {'*'}}\ M}لذا فإن عملية الفتح ضرورية لـمP '*' م / P_{\displaystyle M\rightarrow P\ {\texttt {'*'}}\ M\ /\ {\underline {P}}}

3+4)
فِهرِس
1234567
S
أ
م
P11
د11
2*(3+4)

تحديث:

D(4) = 1؛

P(4) = 1;

قواعد الاشتقاقتم تحويل المدخلات
مP{\displaystyle M\rightarrow P}2*(3+
ملحوظاتالمدخل الأيسر
العودة إلىمP '*' م / P_{\displaystyle M\rightarrow P\ {\texttt {'*'}}\ M\ /\ {\underline {P}}}

ولا نقوم بتوسيعها لأن لدينا نتيجة في جدول التخزين المؤقت P(4) ≠ 0، لذا نقوم بإزاحة المدخلات بمقدار P(4). ونقوم أيضًا بإزاحة+{\displaystyle +}منأم '+' أ{\displaystyle A\rightarrow M\ {\texttt {'+'}}\ A}

4)
فِهرِس
1234567
S
أ
م1
P11
د11
2*(3+4)

ضربة على النقطة P(4)

قم بتحديث M(4) = 1 حيث تم التعرف على M

قواعد الاشتقاقتم تحويل المدخلات
أم '+' أ{\displaystyle A\rightarrow M\ {\texttt {'+'}}\ A}مP '*' م{\displaystyle M\rightarrow P\ {\texttt {'*'}}\ M}P'(' أ ')'{\displaystyle P\rightarrow {\texttt {'('}}\ A\ {\texttt {')'}}}2*(3+
ملحوظاتالمدخل الأيسر
المدخلات لا تتطابق مع العنصر الأول في الاشتقاق.

العودة إلى قاعدة النحو الأولى ذات البديل غير المستكشفP'(' أ ')' / د_{\textstyle P\rightarrow {\texttt {'('}}\ A\ {\texttt {')'}}\ /\ {\underline {D}}}

4)
فِهرِس
1234567
S
أ
م1
P11
د11
2*(3+4)

لم يتم التحديث لعدم التعرف على أي طرفية

قواعد الاشتقاقتم تحويل المدخلات
Pد{\displaystyle P\rightarrow D}د4{\displaystyle D\rightarrow 4}2*(3+
ملحوظاتالمدخل الأيسر
قم بإزاحة المدخلات بمقدار واحد بعد استخراج الطرفية 4

لكن المدخلات الجديدة لن تتطابق في الداخلمP '*' م{\displaystyle M\rightarrow P\ {\texttt {'*'}}\ M}لذا فإن عملية الفتح ضرورية

4)
فِهرِس
1234567
S
أ
م1
P111
د111
2*(3+4)

تحديث:

D(6) = 1؛

P(6) = 1;

قواعد الاشتقاقتم تحويل المدخلات
مP{\displaystyle M\rightarrow P}2*(3+
ملحوظاتالمدخل الأيسر
العودة إلىمP '*' م / P_{\displaystyle M\rightarrow P\ {\texttt {'*'}}\ M\ /\ {\underline {P}}}

ولا نقوم بتوسيعها لأن لدينا ضربة في جدول التخزين المؤقت P(6) ≠ 0 لذلك نقوم بإزاحة المدخلات بمقدار P(6).

لكن المدخلات الجديدة لن تتطابق+{\displaystyle +}داخلأم '+' أ{\displaystyle A\rightarrow M\ {\texttt {'+'}}\ A}لذا فإن عملية الفتح ضرورية

4)
فِهرِس
1234567
S
أ
م11
P111
د111
2*(3+4)

ضربة على النقطة P(6)

قم بتحديث M(6) = 1 حيث تم التعرف على M

قواعد الاشتقاقتم تحويل المدخلات
أم{\displaystyle A\rightarrow M}2*(3+4)
ملحوظاتالمدخل الأيسر
العودة إلىأم '+' أ / م_{\displaystyle A\rightarrow M\ {\texttt {'+'}}\ A\ /\ {\underline {M}}}

ولا نقوم بتوسيعها لأن لدينا ضربة في جدول التخزين المؤقت M(6) ≠ 0 لذلك نقوم بإزاحة المدخلات بمقدار M(6).

قم أيضًا بتغيير الوضع){\displaystyle )}منP'(' أ ')'{\displaystyle P\rightarrow {\texttt {'('}}\ A\ {\texttt {')'}}}

فِهرِس
1234567
S
أ3
م11
P1511
د111
2*(3+4)

ضربة على M(6)

قم بتحديث A(4) = 3 حيث تم التعرف على A

قم بتحديث P(3) إلى 5 حيث تم التعرف على P

قواعد الاشتقاقتم تحويل المدخلات
2*
ملحوظاتالمدخل الأيسر
العودة إلىمP '*' م / P_{\displaystyle M\rightarrow P\ {\texttt {'*'}}\ M\ /\ {\underline {P}}}كطرفية*≠ ⊣{\displaystyle *\neq \dashv }(3+4)
فِهرِس
1234567
S
أ3
م11
P1511
د111
2*(3+4)

لم يتم التحديث لعدم التعرف على أي طرفية

قواعد الاشتقاقتم تحويل المدخلات
مP{\displaystyle M\rightarrow P}2*(3+4)
ملحوظاتالمدخل الأيسر
لا نقوم بتوسيعها لأن لدينا نتيجة في جدول التخزين المؤقت P(3) ≠ 0، لذلك نقوم بإزاحة المدخلات بمقدار P(3).
فِهرِس
1234567
S
أ3
م711
P1511
د111
2*(3+4)

ضربة على النقطة P(3)

قم بتحديث M(1)=7 حيث تم التعرف على M

قواعد الاشتقاقتم تحويل المدخلات
ملحوظاتالمدخل الأيسر
العودة إلىأم '+' أ / م_{\displaystyle A\rightarrow M\ {\texttt {'+'}}\ A\ /\ {\underline {M}}}كطرفية+≠ ⊣{\displaystyle +\neq \dashv }2*(3+4)
فِهرِس
1234567
S
أ3
م711
P1511
د111
2*(3+4)

لم يتم التحديث لعدم التعرف على أي طرفية

قواعد الاشتقاقتم تحويل المدخلات
أم{\displaystyle A\rightarrow M}2*(3+4)
ملحوظاتالمدخل الأيسر
لا نقوم بتوسيعها لأن لدينا نتيجة في جدول التخزين المؤقت M(1) ≠ 0، لذلك نقوم بإزاحة المدخلات بمقدار M(1).

تم اختزال S بالكامل، لذلك تم التعرف على سلسلة الإدخال.

فِهرِس
1234567
S7
أ73
م711
P1511
د111
2*(3+4)

ضربة على M(1)

قم بتحديث A(1)=7 حيث تم التعرف على A

قم بتحديث S(1)=7 حيث تم التعرف على S

تطبيق

اسمخوارزمية التحليللغات الإخراجالقواعد، الشفرةمنصة التطويررخصة
أوستن إكسباكرات (معدل)جافامتفرقالجميعمجاني، بي إس دي
ثور بريباكراتسي ، أوكاميل ، جافامختلطالجميعمجاني، رخصة جنو العمومية العامة
مظلةباكراتجافا ، جافا سكريبت ، بايثون ، روبيمتفرقالجميعمجاني، رخصة جنو العمومية العامة
CL-pegباكراتلغة الشفرة الشائعةمختلطالجميعمجاناً، معهد ماساتشوستس للتكنولوجيا
يا للهول!باكراتدمختلطالجميعمجاني، رخصة جنو العمومية العامة
فريسبيباكراتهاسكلمختلطالجميعمجاني، بي إس دي
grammar::pegباكراتتي سي إلمختلطالجميعمجاني، بي إس دي
IronMetaباكراتسي شاربمختلطويندوزمجاني، بي إس دي
PEGParserPackrat (يدعم الاستدعاء الذاتي الأيسر والغموض النحوي)لغة سي++تطابقالجميعمجاني، بي إس دي
حوت النروالباكراتجمختلطPOSIX ، ويندوزمجاني، بي إس دي
الورم الجديدباكراتإرلانغمتفرقالجميعمجاناً، معهد ماساتشوستس للتكنولوجيا
ميتاباكرات (معدل، مع تخزين جزئي للذاكرة)جافا سكريبت ، سكويك ، بايثونمختلطالجميعمجاناً، معهد ماساتشوستس للتكنولوجيا
حزمة سي سيPackrat (معدل، يدعم التكرار الأيسر)جمختلطالجميعمجاناً، معهد ماساتشوستس للتكنولوجيا
باكراتباكراتمخططمختلطالجميعمجاناً، معهد ماساتشوستس للتكنولوجيا
بابيباكراتهاسكلمختلطالجميعمجاني، بي إس دي
الجزر الأبيضباكراتلغة سي++مختلطويندوزمجاني، رخصة جنو العمومية العامة
PEG.jsباكرات (حفظ جزئي)جافا سكريبتمختلطالجميعمجاناً، معهد ماساتشوستس للتكنولوجيا
بيغي [ 11 ]باكرات (حفظ جزئي)جافا سكريبتمختلطالجميعمجاناً، معهد ماساتشوستس للتكنولوجيا
بيغاسوسالانحدار المتكرر، باك رات (بشكل انتقائي)سي شاربمختلطويندوزمجاناً، معهد ماساتشوستس للتكنولوجيا
PetitParserباكراتسمول توك ، جافا ، دارتمختلطالجميعمجاناً، معهد ماساتشوستس للتكنولوجيا
مكتبة PyPyباكراتبايثونمختلطالجميعمجاناً، معهد ماساتشوستس للتكنولوجيا
يا للهول!باكراتجافامختلطآلة جافا الافتراضيةمجاني، رخصة جنو العمومية الصغرى
باحث عن الأشياء القابلة للتجميعباكراتيذهبتطابقالجميعمجاني، مرخص بموجب رخصة جنو العمومية الإصدار 3

انظر أيضاً

مراجع

  1. 1 2 3 فورد، برايان (2006). "تحليل Packrat: بسيط، قوي، كسول، وقت خطي". arXiv : cs/0603077 .
  2. 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 . 
  3. 1 2 فلودين، دانيال. "مقارنة بين تحليل Packrat وتحليل Shift-Reduce التقليدي على قواعد اللغة والمدخلات من العالم الحقيقي" (PDF) .
  4. ميزوشيما، كوتا؛ مايدا، أتوسي؛ ياماغوتشي، يوشينوري (2010-05-06). "يمكن لمحللات Packrat التعامل مع القواعد النحوية العملية في مساحة ثابتة في الغالب". وقائع ورشة عمل ACM SIGPLAN-SIGSOFT التاسعة حول تحليل البرامج لأدوات وهندسة البرمجيات . ACM. الصفحات 29-36. doi : 10.1145 / 1806672.1806679 . ISBN  978-1-4503-0082-7. S2CID 14498865 . 
  5. 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 . 
  6. أهو، ألفريد ف.؛ لام، مونيكا س.؛ سيثي، رافي؛ أولمان، جيفري د.، محرران. (2007). المترجمات: المبادئ والتقنيات والأدوات (الطبعة الثانية ). بوسطن - ميونخ: بيرسون أديسون ويسلي. ISBN  978-0-321-48681-3.
  7. نورفيج، بيتر (1991-03-01). "تقنيات التخزين المؤقت التلقائي مع تطبيقات على التحليل النحوي الخالي من السياق" . اللغويات الحاسوبية . 17 (1): 91-98 . ISSN 0891-2017 . 
  8. دوبروي، باتريك؛ وارث، أليساندرو (23 أكتوبر 2017). "تحليل باكرات التدريجي" . وقائع المؤتمر الدولي العاشر لهندسة لغات البرمجيات ACM SIGPLAN . SLE 2017. نيويورك، نيويورك، الولايات المتحدة الأمريكية: رابطة آلات الحوسبة. الصفحات 14-25 . doi : 10.1145/3136014.3136022 . ISBN  978-1-4503-5525-4. S2CID 13047585 . 
  9. 1 2 مجلة العلوم، المجلة الدولية للبحوث العلمية في الهندسة والتكنولوجيا. "دراسة استقصائية لمحلل Packrat" . دراسة استقصائية لمحلل Packrat .
  10. 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 . 
  11. نسخة مُعدّلة من PEG.js