質問

この構文に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 );
}

B's event() やっている(多くのif-elseifの後) return m_parent->deleteDaughter(). 。私はこれが怪しい(そしてそれがクラッシュする)ことを知っていますが、私は親を返す方法が必要です State 娘から State そして、娘を確認してください State リークされていません。

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

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

あなたがデザインと最後のコードをoldる前に、私はそれほど単純な例を拡張しようとしました ここ, 、それはかなり大丈夫のようです。私は、明確さと簡潔さのために、決定の部分を州自体に移しています。

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

役に立ちましたか?

解決

これについてのあなたの見解を自由に投稿してください。しかし、私はすべてを優雅に処理する方法を見つけました:

最初:私のイベントループは最後のポインターを保持します State* 作成した。

2番目:それぞれ State 親へのポインターがあります State, 、コンストラクターで初期化され、デフォルトは0にデフォルトです(最初のもの以外のものに使用される場合、メモリリーク State*);これにより、状態が範囲外に出ないことが保証されます。

第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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top