2

この構文の FSM/「プッシュダウンオートマトンパーサーを実装したいと思います:

私は次のものを持っています:

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 );
}

WithBevent()実行 (多くの if-elseif の後) return m_parent->deleteDaughter(). これが怪しい (そしてクラッシュする) ことはわかっていますがState、娘から親を返し、娘が漏洩していないStateことを確認する方法が必要です。State

私のイベントループは次のようになります。

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

設計とコードの最後の部分を叱る前に、私はここから単純すぎる例を拡張しようとしましたが、これはかなり問題ないようです。わかりやすく簡潔にするために、決定部分を状態自体に移動します。

このテーマに関する本がたくさんあることは理解していますが、私はコンピューター科学者でもプログラマーでもないので、自分でこれを行う方法を学びたいと思っています (もちろん、SO のフレンドリーな人々の助けを借りて)。コンセプトが不明な場合は、お問い合わせください。ありがとう!

4

1 に答える 1

0

これについての見解を自由に投稿してください。ただし、すべてを適切に処理する方法を見つけました。

最初: イベント ループは、最後にState*作成されたものへのポインターを保持します。

2 番目: それぞれに、コンストラクターで初期化されStateた parent へのポインターがあり、既定値は 0 です (最初の 以外に使用するとメモリ リークが発生します)。これにより、どの状態も範囲外にならないことが保証されます。StateState*

3 番目:State* endOfState()まさにこれを行う関数 (そして、私はこれを特に誇りに思っています。

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

これがサブクラスの 内から呼び出されるとevent()、それ自体が適切に削除され、親ポインターが返されます (はしごの 1 つ上に移動します)。

それでも漏れがある場合は、お知らせください。解決策が明確でない場合は、質問してください:)

PS: 公平を期すために、インスピレーションはhttp://www.codeguru.com/forum/showthread.php?t=179284から盗みました

于 2010-07-06T19:49:48.783 に答える