استمر في الحصول على تفيضات المكدس عند محاولة استخدام الروح لتحليل الأشياء

StackOverflow https://stackoverflow.com/questions/1107654

  •  12-09-2019
  •  | 
  •  

سؤال

أنا أحسب عندما بدأت في الحصول على سعة مكدس كان الوقت المناسب للمجيء إلى هنا لطلب؛)

أحاول معرفة كيفية استخدام روح التعزيز الآن. لقد احسبت الأشياء الأساسية. منذ أن كان لدي K & R سهل الاستخدام (الذي يحتوي على قواعد G) قررت معرفة ما إذا كان بإمكاني إجراء مقبول للغة. كان هذا هدفي الأصلي أكثر أو أقل على أي حال، لأنني أرغب في النهاية في استخدام هذا كعضو مسبق لجمع بعض المعلومات من هياكل البيانات والأشياء.

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

postfix_expression = 
    primary_expression
    // omitting some other rules for simplicity's sake
    | (postfix_expression >> chseq+p("++"))
    | (postfix_expression >> chseq_p("--"));

primary_expression = 
    identifier
    | constant
    | string_literal;

// The parsers for constants and strings are 
// pretty trivial so I'm not going to C+P them here. 

عندما تمر في شيء مثل i++ فشل. أفترض أن هذا بسبب i هو صالح primary_expression وهكذا لا يستمر للتحقق من ++ أو --. وبعد حاولت وضعه في الأسفل، ثم أحصل على تفيضات المكدس. أحصل على بعض العودية اليسارية اللانهائية هنا لكنني لا أعرف كيفية حلها.

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

المحلول

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

http://en.wikipedia.org/wiki/left_recursion.

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

قد تكون أفضل حالا باستخدام أداة قائمة على LALR مثل Bison.

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