Pegjs: عوامل غير جشعة لـ * و + و و؟

تم إنشاؤها على ٧ أكتوبر ٢٠١١  ·  7تعليقات  ·  مصدر: pegjs/pegjs

لدي لغة حيث توجد حالات متكررة من نفس النمط حيث لا أهتم إلا بالرمز الأول. فمثلا:

          system       OBJECT IDENTIFIER ::= { mib-2 1 }
          interfaces   OBJECT IDENTIFIER ::= { mib-2 2 }
          at           OBJECT IDENTIFIER ::= { mib-2 3 }
          ip           OBJECT IDENTIFIER ::= { mib-2 4 }
          icmp         OBJECT IDENTIFIER ::= { mib-2 5 }
          tcp          OBJECT IDENTIFIER ::= { mib-2 6 }
          udp          OBJECT IDENTIFIER ::= { mib-2 7 }
          egp          OBJECT IDENTIFIER ::= { mib-2 8 }

هذا المثال البسيط يمكن أن يطابق هذا النمط (حيث _ هي مسافة بيضاء):

identifier _ "OBJECT IDENTIFIER" _ "::=" _ "{" _ identifier _ number _ "}"

هذه ليست مشكلة كبيرة في هذه الحالة (لقد كتبت بالفعل النمط :-) لكن اللغة بها مجموعة من التركيبات الكبيرة الأخرى التي لا تتطلب التحليل الكامل (أريد فقط المعرف الأولي في كل سطر ل قم بالعمل الذي يدور في ذهني).

أود كتابة شيء مثل هذا النمط:

identifier _ "OBJECT IDENTIFIER" .*? "}"

أين ال ".*؟" غير جشع - يستهلك فقط عند التواجد الأول للمحطة. هل يمكن أن يكون هذا في قائمة PEG.js؟ شكرا جزيلا.

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

في شكلية PEG ، يمكنك بسهولة المطابقة حتى النهاية باستخدام المسند مع الحرف الأول . . شيء مثل:

"OBJECT IDENTIFIER" (!"}" .)* "}"

هل هذا كاف لك؟

ال 7 كومينتر

تحديث: يمكن تحقيق ذلك من خلال عدد التكرار (وهو تعميم لفكرتي الأولية) كما هو مقترح في مجموعات Google على: http://groups.google.com/group/pegjs/browse_thread/thread/2bea15581be45187

في شكلية PEG ، يمكنك بسهولة المطابقة حتى النهاية باستخدام المسند مع الحرف الأول . . شيء مثل:

"OBJECT IDENTIFIER" (!"}" .)* "}"

هل هذا كاف لك؟

نعم ، هذا يعمل بشكل مثالي. شكرا!

dmajda ما هي الممارسة الموصى بها لإزالة الحرف الفارغ !"}" ؟

فمثلا:

   = chars:(!"-suffix" .)+ "-suffix"

"foo-suffix" => [[ '', 'f' ], ['', 'o' ], ['', 'o' ]]  // result
"foo-suffix" => ['f', 'o', 'o' ] // desired result

لقد تمكنت من تحقيق ذلك عن طريق كسر !"-suffix" . في قاعدته الخاصة التي تعيد فقط النتيجة . ، لكنني أشعر بالفضول لمعرفة ما إذا كانت هناك طريقة أفضل.

66 سوف يصلح هذا.

أعتقد في المتوسط ​​بينما يمكنك استخدام:

    = chars:(!"-suffix" c:. {return c})+ "-suffix"

islandr يُرجى عدم استخدام المشكلات كمكان لطرح أسئلة حول استخدام PEG.js. خاصة عندما تكون مغلقة وخاصة عندما تطلب شيئًا يمكن أن يساعدك به الأشخاص الآخرون بجواري. القناة المناسبة هي مجموعة Google .

آسف ديفيد. اعتقدت أن هذا كان مكانًا جيدًا منذ أن كان
ذات صلة مباشرة بالمثال الذي قدمته.

يوم الأربعاء 9 كانون الثاني (يناير) 2013 الساعة 9:51 مساءً ، كتب David Majda [email protected] :

islandr https://github.com/islandr من فضلك لا تستخدم القضايا كمكان
لطرح أسئلة حول استخدام PEG.js. خاصة عندما تكون مغلقة و
خاصة عندما تطلب شيئًا يستطيع الآخرون بجانبي القيام به
تساعدك في. القناة المناسبة هي Google Grouphttp: //groups.google.com/group/pegjs
.

-
قم بالرد على هذه الرسالة الإلكترونية مباشرة أو tHubhttps: //github.com/dmajda/pegjs/issues/57#issuecomment -12083927.

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