質問: 2つのステートマシンを組み合わせる? 私は、このフォーラムの最近のアドバイスから、無駄なプロセッサ時間と変数の使用を減らすために、可能であれば「ステートマシン」ロジックを使用してプロジェクトを再開することで得たいと考えています。 私はNick Gammonsの*ステートマシンからシリアルポートからの入力を処理するようになっています* 'example を参照してください。これは、可能なすべてのマシン状態(本質的に2次元グリッド)に対して、すべての特殊制御文字 'イベント'の可能な組み合わせをすべて示しています。 私はDOSコマンドラインフォーマットに似た **command [parameters] [options]** "の形式でシリアル入力を処理するという目標を洗練しました。たとえば、 **DIR" c :\ program files "/ w/s** ]をクリックします。これは私に大きなBuffer []とHeader []の文字列を必要としないようにし、 したがって、私のイベント制御文字はスペース、カンマ、一重引用符、二重引用符、スラッシュ、カラジーグリターン、そして私の '状態'は **NULL、COMMAND、PARAMETER、OPTIONS** OPTIONS状態は、カンマまたはスペースデリミタまたはCarraige Returnがそのオプションを適切に処理し、おそらく認識された変数にその値を保存するまで、テンポラリオプション[]文字列に文字を追加します。 COMMANDとPARAMETERの '状態'は、特殊文字が一重引用符または二重引用符の中に含まれている場合は、対応するコマンド[]とパラメータ[]文字列に文字を追加します(ペア内で使用する場合は引用符を文字列の一部として使用できます)他のタイプのもの)。 したがって、 **NoQuotes、SingleQuotesおよびDoubleQuotes** にCOMMAND、PARAMETERおよびOPTIONS状態の操作を変更するために必要な第2の状態マシンがあるようです。 これは、私がニューロンを使い果たした場所です。なぜなら、私が見るのは、非常に多くの可能な順列を持つ不可能な複雑な2つの機械状態の3次元グリッドだからです。 しかし、プロセッサーの能力とメモリの可用性が鶏の歯よりも乏しい時代にまでさかのぼるほとんどすべてのコマンドラインユーティリティの中心に位置しているため、これを実装する方法は非常に実用的でなければならないと考えられます。コマンドラインの解析を含め、可能な限り最善のものでなければなりませんでした。 だから誰でも入力からコマンドライン型のフォーマットを得るための実現可能なモデル(機械状態かそうでないか)を提案することができますか? 更新 ああ、私はちょうど私が前に見つけていなかった別の複雑さを見てきました。これは、オプションが必ずしも必ずしも最後ではないということです。オプションがcarraige-return、options状態区切り文字による変更は、オプション状態の変更前の状態に戻らなければなりません(phew、私はそれが意味をなさないことを望みます)。とにかく、2つの答えが既に示唆しているように、このアプローチは複雑すぎるように思われるので、それは描画ボードに戻っていると思います。
回答: 個人的には、Nickがステートマシンでコマンドラインパターン解析を行うようにアドバイスしたとは思わない。彼の例は、コマンドライン入力に基づいて状態マシンを変更することです。 私はいくつかのコマンドラインパーサーを書いており、これを行うためにステートマシンを使用したことはありません。ステートマシンを使用するようアドバイスしません。 簡単な文字列解析がはるかに簡単です。 **Edit To answer the remark below:** I would not advice to go byte by byte. I'd advice to go the line by line way. I have written a library to do read line by line and an article on how that one works. Here a link to the lib . Here is a parcing code example. It is not so interesting for you as I have it done in a stage by stage way in a very high level way of coding. Basically the algorithm is= 1 Take the first word; 2 identify the word. 3 If the command is complete ->do it else Send the rest of the string to a specialized piece of code. (which has the same algorithm)