سؤال

أرغب في تنفيذ محلل FSM/"Pushdown Automaton" لهذا بناء الجملة: محلل مع نطاقات وشرطات الذي تم بالفعل "lexed" في محلل آلة الدولة المحدودة

لدي ما يلي:

class State
{
public:
    virtual State* event( const string &token );
    State* deleteDaughter();
private:
    A* m_parent;
    A* m_daughter;
}
class SomeState : public State
{
public:
    State* event( const std::string &token );
}

مع Bevent() القيام (بعد العديد من if-elseif) return m_parent->deleteDaughter(). أعلم أن هذا مريب (ويتعطل) ، لكنني بحاجة إلى طريقة لإعادة الوالد State من الابنة State وتأكد من الابنة State لم يتم تسريبه.

تبدو حلقة الحدث الخاصة بي هكذا:

while( somestringstream >> token )
    state = state->event();

قبل أن توبخ التصميم والقطعة الأخيرة من التعليمات البرمجية ، حاولت تمديد مثال بسيط للغاية من هنا, ، وهو ما يبدو جيدًا. أنا أنقل القرار إلى الدول نفسها ، من أجل الوضوح والإيجاز.

أفهم أن هناك الكثير من الكتب حول هذا الموضوع ، لكنني لست عالم/مبرمج الكمبيوتر وأريد أن أتعلم أن أفعل ذلك بنفسي (بالطبع ، بمساعدة جميع الأشخاص الودودين في SO). إذا لم يكن المفهوم واضحًا ، فيرجى السؤال. شكرًا!

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

المحلول

لا تتردد في نشر هذا الأمر ، لكنني اكتشفت كيفية التعامل مع كل شيء بأمان:

أولاً: ستحتفظ حلقة الحدث بمؤشر إلى الأخير State* خلقت.

ثانياً: كل State لديه مؤشر إلى الوالد State, ، تهيئته في المنشئ ، التخلف عن السداد إلى 0 (تسرب الذاكرة إذا تم استخدامه لأي شيء سوى الأول State*) ؛ هذا يضمن أنه لن تخرج أي حالة من النطاق.

ثالث: State* endOfState() الوظيفة التي تفعل هذا بالضبط (وأنا فخور بشكل خاص بهذا.

State* State::endOfState()
{
    State* parent = m_parent; // keep member pointer after suicide
    delete this;
    return parent;
}

عندما يتم استدعاء هذا من داخل الفئة الفرعية event(), ، سوف يحذف نفسه بشكل صحيح ، وإعادة مؤشر الوالدين (الذهاب في السلم).

إذا كان هذا لا يزال يحتوي على تسرب ، فيرجى إبلاغي. إذا لم يكن الحل واضحًا ، فيرجى السؤال :)

ملاحظة: على الرغم من كل الإنصاف ، سُرق الإلهام من http://www.codeguru.com/forum/showthread.php؟t=179284

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