Pegjs: السماح بإرجاع نتيجة مطابقة لتعبير محدد في قاعدة بدون إجراء

تم إنشاؤها على ٢٣ مايو ٢٠١٦  ·  10تعليقات  ·  مصدر: pegjs/pegjs

من الشائع جدًا أن تحتاج إلى إرجاع قيمة من أحد الأطراف غير الطرفية في قاعدة أو داخل قاعدة فرعية بين قوسين. على سبيل المثال:

varDecl = type:type id:ID init:( EQ e:expr {return e} )?
                { return scopedAST('VARDECL', {type, id, init}) }

في هذه الحالة ، كنت بحاجة إلى expr المسمى e داخل مستوى الأقواس init لعبارة اختيارية في اللغة. لم أكن بحاجة إلى "كلمة الضجيج" EQ كجزء من القيمة التي تم إرجاعها.

إذا كانت لغة PEGjs تحتوي على رمز لاستخدامه لتمييز المحطات الطرفية مثل expr أعلاه بحيث تكون هي القيمة التي يتم إرجاعها من قاعدة نحوية أو قاعدة فرعية هذه الحالة أبسط.

لإعادة كتابة المثال أعلاه:

varDecl = type:type id:ID init:( EQ ^expr )?
                { return scopedAST('VARDECL', {type, id, init}) }

لاحظ استخدام ^ بمناسبة expr قيمة داخل init قوسين عبارة اختياري للقاعدة الفرعية لتعيين ما لا بد أن init . يعمل هذا على تبسيط العديد من المواقف سواء مع أو بدون القاعدة الفرعية بين قوسين الموضحة في هذا المثال.

نشكرك على صنع هذه الأداة الرائعة البسيطة والأنيقة والقوية. أنا أحب PEGjs! :ابتسامة:

feature

ال 10 كومينتر

أحب هذه الفكرة! ^ بديهي جدًا أيضًا.

يمكن أن يعمل هذا أيضًا على القواعد غير المتداخلة:

WhiteSpacedIdentifier = WhiteSpace? identifier:Identifier WhiteSpace {return identifier;}
// becomes
WhiteSpacedIdentifier = WhiteSpace? ^Identifier WhiteSpace?

مقروء جدا! من المفترض أن استخدام عدة ^ سيعمل أيضًا ، مثل:

a = ^b  c  ^d  e

هل ترجع [b, d] ؟ يبدو أن له معنى.

وبالمثل ، يبدو أنه من المنطقي أنه إذا تم مزجها مع اللقطات المسماة ، فسيتم تجاهل قواعد ^ ، لذلك

x = a ^b foo:c { return foo; }

سيعود فقط ج.

يا هذه الفكرة المضاعفة ممتازة. يجب أن يكون الاختلاط مع اللقطات المسماة
خطا.

يوم الثلاثاء ، 5 تموز (يوليو) 2016 ، 01:07 غراهام ويكفيلد [email protected]
كتب:

مقروء جدا! من المفترض أن استخدام ^ متعدد قد ينجح أيضًا ، مثل:

أ = ^ bc ^ de

هل سيعود [ب ، د]؟ يبدو أن له معنى.

وبالمثل ، يبدو أنه من المنطقي أنه إذا تم مزجه مع الأسماء المسماة ، فإن ^
يتم تجاهل القواعد:

x = a ^ b foo: c {return foo؛ }

-
أنت تتلقى هذا لأنك قمت بتأليف الموضوع.

قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/pegjs/pegjs/issues/427#issuecomment -230413015 ، أو كتم الصوت
الخيط
https://github.com/notifications/unsubscribe/ABC26k8v0DIzuWUlkoDZGm2ep10Y5bcMks5qShDAgaJpZM4IkuA9
.

أوافق تمامًا على أن النمط الموصوف شائع جدًا. وجود طريقة للتعبير عنها بدون فعل أمر منطقي.

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

سأفكر في هذا بعمق أكبر بعد 1.0.0.

بعض المزيد من الأفكار: نظرًا لأن ^ والتعبيرات المصنفة تتعارض نوعًا ما (يقترح grrrwaaa تجاهل ^ ) ، فماذا عن بدلاً من وضع علامة على النتيجة ، يمكن للمرء وضع علامة على التعبيرات _ignored_ ، على سبيل المثال (اقتراح بناء الجملة!) من خلال توفير تسمية فارغة:

WhiteSpacedIdentifier = WhiteSpace? identifier:Identifier WhiteSpace {return identifier;}
// becomes
WhiteSpacedIdentifier = :WhiteSpace? Identifier :WhiteSpace?

لا توجد صيغة جديدة (لدينا : بالفعل) ، فقط القليل من الامتداد في الدلالات:

  • السماح بالتسميات الفارغة (هل تسمي هذه التعبيرات "المجهولة"؟)
  • في حالة وجود التقاط واحد غير مجهول ، لا تنشئ مصفوفة من التعبيرات المطابقة ، وبدلاً من ذلك قم بإرجاع المطابقة الوحيدة

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

تضمين التغريدة

لماذا لا ترجع أي ملصق؟
start = "{" :expr "}" // return expr
start = "{" label:expr "}" // return label
أعتقد أنه من المنطقي أنك إذا "صنفت" شيئًا ما ، فأنت تريد أن تفعل شيئًا به (مثل إعادته).

من ناحية أخرى ، لماذا يجب أن تؤدي قواعد مثل start = ex:expr :expr حدوث خطأ؟
ربما يجب أن تفعل شيئًا مشابهًا لمتغير وسيطات وظائف جافا سكريبت؟ على سبيل المثال ، يجب أن يُرجع start = ex:expr :expr [ex, expr] . عندما يكون لديك إجراء ، يجب أن يكون هناك متغيرات بعنوان & arguments ( start = ex:expr :expr { return [ex, arguments[0], ex] } )

alanmimms تعجبني هذه الفكرة. لا يتعين علينا إنشاء اسم (متغير / تسمية) فقط لإرجاع قيمة بسيطة.
أعتقد أن التسمية غير المسماة ( :expr ) ستكون أفضل من ^expr

لماذا لا ترجع أي ملصق؟

nedzadarek لأنه إذا

لسوء الحظ ، من الضروري التعرف على أن التسميات التلقائية في هذا المظهر في ما تقدمه opatut ، من المستحيل تنفيذها لأنها تخلق غموضًا في القواعد. المثال الأساسي:

start = a :b;// `a` - it is rule reference or label?
a = .;
b = .;

لذلك ، لهذا الغرض تحتاج إلى تحديد شخصية أخرى. في الوقت الحالي ، هناك خيار من: ~ ، (backslash) ، @ ، # ، % ، ^ ، - ، | ، \ و , .


حل آخر - إدخال بعض الإجراءات الزائفة - اختصارات لإنشاء وظائف بسيطة للإرجاع ، على سبيل المثال ، يمكن أن يعني {=>[]} _ "جمع النتائج المصنفة من التسلسل وإعادتها في المصفوفة" _ ، و {=>{}} - نفس الشيء ، لكن لإرجاع كائن ، بمفاتيح تساوي أسماء التسميات. لكن تنفيذ هذا السلوك لا يتطلب امتدادًا لقواعد اللغة ويمكن تحقيقه تمامًا من خلال المكونات الإضافية. أود أن أقول إنه من الأفضل أن يكون لديك مثل هذا التنفيذ عن طريق المكونات الإضافية:

start1 = a:'a' b c d:. {=>[]};// returns ['a', <d value>]
start2 = a:'a' b c d:. {=>{}};// returns { a: 'a', d: <d value> }

تضمين التغريدة

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

نعم ، الاسم مهم => أريد استخدامه => أريد إعادته.
ما هي مشكلة التعابير غير التافهة؟

لسوء الحظ ، من الضروري التعرف على أن التسميات التلقائية في هذا المظهر في ما تقدمه opatut ، من المستحيل تنفيذها لأنها تخلق غموضًا في القواعد. المثال الأساسي:

نعم فعلا.
أعتقد أن ::expression مربك أيضًا؟ تضمين التغريدة

مغلق كنسخة مكررة من رقم 235

تحرير: تمت إضافة ملاحظة إلى تعليق OP في # 235 تشير إلى هذه المشكلة

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

القضايا ذات الصلة

richb-hanover picture richb-hanover  ·  7تعليقات

brettz9 picture brettz9  ·  8تعليقات

futagoza picture futagoza  ·  6تعليقات

mattkanwisher picture mattkanwisher  ·  5تعليقات

marek-baranowski picture marek-baranowski  ·  6تعليقات