سؤال
أرغب في تنفيذ محلل 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 );
}
مع B
'س event()
القيام (بعد العديد من 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