Pegjs: عادت أخطاء مختلفة عند تمكين / تعطيل ذاكرة التخزين المؤقت

تم إنشاؤها على ٢٨ أغسطس ٢٠١٦  ·  20تعليقات  ·  مصدر: pegjs/pegjs

قواعد:

Statement
  = "{" __ !Statement Statement __ "}"
__
  = [ \t\r\n]*

إدخال:

{x}

مع تعطيل ذاكرة التخزين المؤقت للنتائج ، ينتج عن ما سبق هذا الخطأ:

توقع "{" أو [\ t \ r \ n] ولكن تم العثور على "x".

مع تمكين ذاكرة التخزين المؤقت للنتائج ، يتغير الخطأ إلى:

متوقع [\ t \ r \ n] ولكن تم العثور على "x".

يجب أن تكون الأخطاء هي نفسها في كلتا الحالتين.

التقرير الأصلي

bug

التعليق الأكثر فائدة

يمكنك إلقاء نظرة على الإصلاح هنا .

ال 20 كومينتر

أنا الاعتماد على معبرة جدا SyntaxError الصورة pegjs يرمي إلى إنجاز جملة بناء للمستخدمين.

ومع ذلك ، تمنعني هذه المشكلة من القيام بذلك لقواعد نحوية أكثر تعقيدًا:

  • مع تمكين ذاكرة التخزين المؤقت ، فإنه يمنع التطابقات المحتملة
  • بدون ذاكرة تخزين مؤقت ، يتباطأ التحليل بالمقادير ، مما يجعله غير قابل للاستخدام

قواعد أخرى ينطبق عليها الخطأ:

Start
    = Char+ End

End
    = "e"

Char
    = (!End [a-z])+

إدخال:

a

مع تعطيل ذاكرة التخزين المؤقت للنتائج ، ينتج عن ما سبق هذا الخطأ:

توقع "e" أو [az] أو "e" ولكن تم العثور على نهاية الإدخال.

مع تمكين ذاكرة التخزين المؤقت للنتائج ، يتغير الخطأ إلى:

متوقع [az] ولكن تم العثور على نهاية الإدخال.

خطأ تعطيل ذاكرة التخزين المؤقت صحيح ، لأن ae يطابق القواعد النحوية.

تمت إضافة حالات فشل الاختبار بالرقم 555

يبدو أن سبب هذه المشكلة هو:

  • أثناء التقييم الأولي للقاعدة ، يتم استدعاء peg$expect لتسجيل الرموز المميزة المتوقعة. في بعض الحالات ، يتم تجاهل الرموز المميزة ( peg$silentFails > 0 ).

  • أثناء التقييم المخزن مؤقتًا ، تتم استعادة النتيجة المخزنة مؤقتًا. في هذه المرحلة ، لا يجب على المحلل اللغوي استعادة حالة التحليل الجديدة فحسب ، بل يجب عليه أيضًا إعادة تشغيل المكالمات ذات الصلة إلى peg$expect أيضًا. وإلا فإنه يفقد الرموز المميزة المتوقعة. يتجلى هذا في رسائل الخطأ غير المكتملة التي رأيناها أعلاه.

في نموذج أولي محلي يعتمد على [email protected] تمكنت من إصلاح هذه المشكلة عن طريق تسجيل المكالمات وإعادة تشغيلها على peg$expect . ولكن مع التغييرات التي تم إدخالها في https://github.com/pegjs/pegjs/commit/669f782a5f3928a2958147992eb07df5b0ecf54a ، أصبحت هذه الأشياء أكثر تعقيدًا.

يمكنني محاولة الإصلاح مقابل pegjs@dev . فقط أتساءل عما إذا كنت أسير في الاتجاه الصحيح.

هل من تعليقات Mingun ،futagoza؟

هل يمكنك أن تريني النموذج الأولي المحلي الخاص بك على أساس [email protected] ؟

يمكنك إلقاء نظرة على الإصلاح هنا .

إنه لا يعمل بشكل صحيح حتى الآن مع العناصر المتداخلة الصامتة:

قواعد:

Start
  = Char+ End
End "end"
  = "e"
Char
  = !End [a-z]'

إدخال:

a

الرسالة المتوقعة:

نهاية متوقعة ، أو [az] ولكن تم العثور على نهاية الإدخال.

الرسالة الفعلية:

نهاية متوقعة ، "e" ، أو [az] ولكن تم العثور على نهاية الإدخال.

راجع حالة الاختبار الفاشلة .

nikku يجب حل هذا الآن (شكرًا لك 🙇) ، مع اجتياز جميع حالات الاختبار الثلاثة (بما في ذلك الحالة الثالثة للعناصر المتداخلة الصامتة).

الإصلاح موجود في أحدث إصدار pegjs@dev تم دفعه للتو إلى NPM ، [email protected] (https://github.com/pegjs/pegjs#latest).

شكرا.

لقد اختبرت تغييراتك اليوم.

من ما أرى https://github.com/pegjs/pegjs/commit/f5b323b40124e9ebe1336b509af0716d5a31ce55#diff -cd2c6b13fdcedf68a390c8bb6ea65cafR148 يدخل تغيير فصل، كما أنه فعال يزيل peg$silentFails === 0 حارس في مع --no-cache موزعي ولدت .

😨 عفوًا ، كان هذا خطأ غبيًا. سأصلح ذلك قريبًا ، شكرًا على التنبيه

حاولت إنشاء حالة اختبار لكنها فشلت: صرخة :. أرى أن هذا الخط له تأثير على أحد القواعد النحوية الأكثر تعقيدًا.

استعادة الحارس في https://github.com/pegjs/pegjs/commit/d06a5b52efcf0fa4b9e5bf21f97607786c1c7db5 ودفع التغييرات إلى pegjs@dev ، أخبرني إذا كان هذا يعمل على إصلاح المشكلة

nikku هل تم إصلاحه ، أم أنك لا تزال تواجه هذه المشكلة؟ فقط أريد أن أعرف ما إذا كان ينبغي إعادة فتح هذه المشكلة.

تم إصلاحه.

nikku - لم يتم إصلاحها. لم يتم الإفراج عن أي شيء. لا يزال لدى npm 0.10.0 ، وقد تم دمج هذا في ميزة 0.11.0 الفرع الذي قال ryuu إنه لن يتم إطلاقه في الواقع

لقد توقفت عن الأمل في pegjs وبحثت في مكان آخر منذ وقت طويل لهذا السبب بالضبط.

لا يوجد إصدار = لا يمكن لأحد استخدامه بالفعل. كانت Pegjs سيئة من الناحية التاريخية مع الإصدارات.

آمل أن أغير دورة تحرير الوتد من خلال:

  1. مطالبة المالك الأصلي بالسماح لي بإعادة اقتطاع 0.12.0 من 0.10.0 ،
  2. لانتقاء الميزات والإصدار السريع باستمرار من فرع 0.11.0 الميت الآن ،
  3. لإزالة الأدوات والتكوين غير المألوف ، لصالح إعداد تطوير قياسي ، و
  4. للحصول على المكتبة في مكان يسهل فيه على المجتمع إضافة الميزات

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

أتمنى لك كل التوفيق في تحقيق ذلك.

شكرا 😁

سوف نرى.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات