1

私はここのようなFSM/プッシュダウンオートマトンアプローチを使用してパーサーを構築しました(そしてそれはうまくいきます!):C ++ FSMの設計と所有権 パーサーで問題が発生したときに正常に終了し、有用なエラーメッセージをユーザーに出力できますステージ。

プログラムの残りの部分でそれを実行するための良い方法について考えていましたが、当然、パーサーのアプローチが頭に浮かびました...

私はすべてのオブジェクトを状態にします。これには、実行の段階に応じてオブジェクト固有の関数を呼び出すswitchステートメントを持つ単一のevent()関数があります。オブジェクト固有の列挙型を使用してそれを追跡し、コードをより読みやすくすることができます(case parserより読みやすくなりcase 5ます)。m_parent*これにより、(他の質問のアプローチを使用して)作成した状態のプッシュダウンツリーを閉じることができます。

これは良い設計ですか(FSMモードですべてを強制します)?より良い方法はありますか、そしてそれはどれほど複雑になりますか(FSMの実装とテストは非常に簡単だと思います)?

提案をありがとう!

PS:ブーストには必要なものがすべて揃っていることは知っていますが、特にブーストについては、外部の依存関係を制限したいと思います。c ++ 0xは問題ありません(ただし、ここではあまり関係ないと思います)

4

3 に答える 3

1

あなたがしていることは、あなたのプログラムで(単純な)仮想マシンを構築することに少し似ています。FSMは、字句解析や構文解析などの制限された問題に適している傾向があり、おそらくお気づきかもしれませんが、かなりの量のロギングとエラー管理を「無料で」行うことができます。

ただし、FSMパターンをすべてに適用しようとすると(たとえば、通常は明示的な状態にしたくない状態が非常に多く含まれているGUIプログラムでは困難になります)、次のことに気付くでしょう。また、FSMをデバッグする機能(C ++デバッガーは状態とイベントを理解しないため)と、状態をリンクして再利用する機能(状態はOOレベルの構成ではないため)も必要です。コードを他の人に渡したい場合は、FSMを正常に使用するために追加のトレーニングが必要になります。複数のアプリケーション用に1つのFSMエンジンを維持したいですか?もしそうなら、あなたはバージョン管理とアップグレードにどのように対処するつもりですか?

適切な仕事に適切なツールを使用してください。すべてのアプローチには長所と短所があります。あなたのソリューションはさらに複雑さの層を追加します:あなたはより多くのC++風の方法でロギングとエラー処理を扱うことができます。C ++コードの記述に満足できない場合は、自分だけが理解できるFSM言語を作成するのではなく、他の既存の言語を検討することをお勧めします。

于 2010-09-13T10:59:26.560 に答える
0

ほとんどの人は、switch / case/defaultの代わりに継承を使用します。ただし、すべてを一方向に強制するという考えは本質的に間違っています。必要な各機能には、それ自体のメリットを常に考慮に入れる必要があります。

于 2010-09-13T10:50:39.093 に答える
0

あなたはいつでもブーストを見ることができます。

于 2010-09-13T10:54:57.337 に答える