سؤال

أحاول تصميم قواعد اللغة الجزيرة باستخدام Rascal MPL ، لكنني ركضت إلى المشكلة:

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

giveacodicetagpre.

حاولت إعادة إنتاج هذا السلوك مع MPL RASCAL. هدفي هو إنشاء قواعد اللغة الجزيرة التي تجمع جميع توجيهات المسموعات الشرطية داخل قطعة من كود C / C ++ وتتخطي بقية المدخلات باستخدام إنتاجات المياه.

giveacodicetagpre.

حاولت إنشاء تأثير {تجنب} من خلال إعطاء الإنتاج الإجارة المعاد الفريغة أعلى أولوية أعلى باستخدام المشغل ">"، ولكن هذا لا يعمل على ما يبدو. شجرة التحليل لا تزال تحتوي على غموض.

giveacodicetagpre.

إذا قمت بتحليل الرمز أعلاه على سبيل المثال، أحصل على شجرة تحليل تبدو كما يلي:

شجرة تحليل غامضة

بقدر ما أستطيع أن أقول من reascal المستندات ، باستخدام "الأولوية"، قد لا يكون Operator هو الطريق للذهاب في حالتي، لكنني لا أرى أي إمكانيات أخرى. أفترض أن هناك طريقة رغم ذلك، لأن مؤلفي الوغد ينص بوضوح على أن كل قواعد SDF يمكن تحويلها إلى قواعد النغمات.

هل هناك طريقة لإعادة إنتاج SDFS {تجنب وظيفة} مع Rascal MPL؟ أم أنه من الممكن تصفية غابة التحليل بطريقة أو بأخرى، وإعادة تطبيق الأولويات؟

هل كانت مفيدة؟

المحلول

إجابة قصيرة: تجنب في SDF2 مرشح تحليل آخر. في RASCAL يمكنك تحديد هذه نفسك، انظر https://github.com/cwi-swat/rascal/blob/master/src/org/rascalmpl/library/lang/sdf2/filters/preferavoid.rsc للحصول على مثال SDF2 تجنب السلوك دون تجاهل سلاسل الحقن وبدون العد. يمكنك استيرادها في قواعد اللغة الخاصة بك واستخدام AVOID و Repriefer تماما مثل في SDF2، أو اكتب المرشحات الخاصة بك.

التحذير: تجنب كان عموما لا يكفي لتحديد سلوك المياه في SDF2 وهو ليس في RASCAL أيضا. السبب هو أن المياه يمكن أن تصبح أطول من البديل لها. تفضل وتجنب يمكن أن تختار فقط بين بدائل متساوية الطول من حيث طول الدائعة. ضئيلة واحدة ولكن الطريقة البطيئة للتعامل مع المياه في الوغد هي حسابها في كل بديل واختيار مشتقات مع مياه أقل.

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

خيار آخر هو استخدام \ و! مشغلي الباقة. انظر الدليل. ومع ذلك، كل شيء وكل شيء أعتقد أن خيار ترشيح تحليل ما بعد حاليا هو أفضل طريقة للتعامل مع قواعد النبيذ الجزرية لأنك تتحكم في ما يجري.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top