سؤال

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


grammar:

giveacodicetagpre.

إليك إدخال مثال:

giveacodicetagpre.

ذلك، بعد التوت، يصبح:

giveacodicetagpre.


أنا أفهم أن:

  1. تحويل يعني دفع رمز الإدخال الأول على المكدس وإزالةها من المدخلات
  2. تقليل يعني استبدال عنصر واحد أو أكثر على المكدس مع عنصر قواعد القواعد
  3. لذلك، في الأساس، يجب أن يحدث هذا:

    giveacodicetagpre.

    بصرف النظر عن "ماذا تقليل؟" شك، ليس لدي أدنى فكرة عن كيفية بناء شجرة تحليل بشكل صحيح. يجب أن تبدو الشجرة مثل هذا:

    giveacodicetagpre.

    يجب أن أقوم بإنشاء عقدة جديدة في الحد؟

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

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

المحلول

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

يتم إدارة ذلك بسهولة باستخدام كومة عقدة تعمل بالتوازي إلى مكدس "SHIFT TOKEN" الذي يستخدمه المحفزين الخام. لكل تخفيض لقيادة الطول N، يتم تقصير مكدس SHIFT-TOKEN بواسطة N، ويتم دفع الرمز المميز غير العام إلى مكدس التحول. في الوقت نفسه، قم بتقصيد مكدس العقدة عن طريق إزالة العقد أعلى

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

إذا كنت تفكر في "التحول" على عقدة الطرفية كتخفيض (من الأحرف التي تشكل المحطة) إلى العقدة الطرفية، فإن العقدة المحطة الطرفية تناسب الحق في. إنشاء عقدة للمحطة، وادفعها إلى كومة.

إذا قمت بذلك، فيمكنك الحصول على "شجرة بناء جملة / تحليل ملموسة" يطابق القواعد الناقعة Isomorhally. (نقوم بذلك للحصول على أداة تجارية أقدمها). هناك الكثير من الأشخاص الذين لا يحبون مثل هذه الأشجار الخرسانية، لأنها تحتوي على عقد من أجل الكلمات الرئيسية، وما إلى ذلك، والتي لا تضيف قيمة كبيرة حقا. صحيح، ولكن مثل هذه الأشجار سهلة الاستخدام للغاية، وسهلة الاستخدام SUPREMELY لفهم Becuase القواعد هي هيكل الأشجار. عندما يكون لديك 2500 قاعدة (كما نفعل لمحلل COBOL الكامل)، فإن هذه الأمور. هذا مناسب أيضا لأن جميع الآلية يمكن بناؤها تماما في البنية التحتية لتحليل التحليل. مهندس النحو ببساطة يكتب القواعد، يعمل المحلل اللجابي، فويلا، شجرة. من السهل أيضا تغيير القواعد: ما عليك سوى تغييره، فويلا، لا تزال تحصل على تحليل الأشجار.

ومع ذلك، إذا كنت لا تريد شجرة ملموسة، على سبيل المثال، فأنت تريد أن "شجرة بناء جملة مجردة"، ثم ما عليك فعله هو السماح للسيطرة على مهندس النحوي الذي تخفيض العقد؛ عادة ما تضيف بعض المرفقات الإجرائية (التعليمات البرمجية) إلى كل قاعدة قواعدية يتم تنفيذها في خطوة تخفيض. ثم إذا كان أي ملحق إجرائي من هذا القبيل ينتج عقدة، فسيتم الاحتفاظ به على مكدس العقدة. يجب على أي مرفق إجرائي ينتج عقدة إرفاق العقد التي تنتجها عناصر اليد اليمنى. إذا كان أي هذا هو ما YACC / BISON / ... معظم محركات المحركات المحرونة التحولية. اذهب تقرأ عن YACC أو Bison وفحص قواعد اللغة. يمنحك هذا المخطط الكثير من السيطرة، بسعر الإصرار أنك تأخذ هذا السيطرة. (لما نقوم به، لا نريد هذا الجهد الهندسي الكثير في بناء قواعد اللغة).

في حالة إنتاج CSTS، فمن المفهوم من الناحية النظرية لإزالة العقد "عديمة الفائدة" من الأشجار؛ نحن نفعل ذلك في أدواتنا. والنتيجة هي الكثير مثل AST، دون الجهد اليدوي لكتابة جميع تلك المرفقات الإجرائية.

نصائح أخرى

سبب مشكلتك هو أن لديك تحول / تقليل الصراع في قواعد اللغة الخاصة بك:

giveacodicetagpre.

يمكنك حل هذا بطريقتين:

giveacodicetagpre.

للمشغلين النقاطين الأيسر، أو

giveacodicetagpre.

للنسبيون المناسبين. هذا يجب أن يحدد أيضا شكل شجرة الخاص بك.

عادة ما يتم تخفيض

عند اكتشاف جملة واحدة كاملة. في الحالة الإرشادية الصحيحة، ستبدأ في حالة واحدة تتوقع رقم، يدفعه إلى كومة القيمة وتتحول إلى الحالة 2. في الحالة 2، إذا كانت الرمز المميز غير مرجع سابق، فيمكنك تقليل رقم إلى expr وبعد خلاف ذلك، اضغط على المشغل وتحول إلى الحالة 1. بمجرد اكتمال الحالة 1، يمكنك تقليل الرقم والمشغل والتعبير إلى تعبير آخر. ملاحظة، تحتاج إلى آلية "العودة" بعد تخفيض. سيبدأ المحلل العام بعد ذلك في الدولة 0، كما يقول، الذي يذهب مباشرة إلى الدولة 1 ويقبل بعد التخفيض.

لاحظ أن أدوات مثل yacc أو bison تجعل هذا النوع من الأشياء أسهل بكثير لأنها تجلب جميع الآلات ذات المستوى المنخفض والمكدس.

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