質問
この構文に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