2

ファイルを解析するために独自のfsmを実装しています。私はfsmパターンに慣れていないので、それについて学ぼうとしています。

私のfsmクラスは、現在の状態とすべての受け入れ状態のコレクションとともに解析されているファイルのストリームを取得します。

今、私はいくつかのことについて混乱しています。

  1. fsmはどのように状態を移動し、これまでに解析されたものを追跡しますか?

  2. 状態オブジェクトはどのような情報を保存する必要がありますか?現在、それらはライン上で一致するパターンを持っており、fsmがこの状態に移行できるかどうかを確認します。

例:

解析するファイル:

Person:  bob smith
        Age: 33
        Location: new York
End person
Person:  Jane smith
        Age: 66
        Location: Chicago
End person

ですから、私には、人の開始、年齢、場所、および終了者の状態があります。各状態オブジェクトにはパターンがあります。(正規表現)指定された行が受け入れられるかどうかを確認します。

しかし、fsmを使用してこのファイルを解析するときにPersonオブジェクトをどのように構築するのかということに固執していますか?

4

3 に答える 3

2

人のリストを持っています (最初は空です)。currentPerson変数を持つ。

  • 状態が「人開始」の場合、currentPerson変数を新しい人に初期化します。
  • 状態が「年齢」の場合、 に年齢を設定しcurrentPersonます。
  • 「場所」状態についても同じです。
  • 状態が「人の終わり」の場合、currentPerson を人のリストに追加します。

ファイルの最後に到達すると、個人のリストにすべての個人が含まれます。

于 2011-11-27T16:01:52.700 に答える
1

これが FSM の最善の使い方であることに同意するとは思いません。

これは、JSON に非常によく似ています。いくつかの変更を加えて、そこにいます。簡単に XML にすることもできます。パーサーを書く必要はありません。

しかし、あなたが主張するなら、あなたの FSM は行を読むことから始めます。

行に「Person」が含まれている場合は、名前の値を保存します。(推奨: "Person" の後に "Name" 行を追加します。)

行に「年齢」が含まれている場合は、年齢の値を保存します。

行に「場所」が含まれている場合は、場所の値を保存します。

行に「End」が含まれている場合は、新しい Person をインスタンス化し、それをデータ構造に追加して、次の行を読み取ります。

行が null の場合は、最後に到達しています。終了状態に遷移し、ファイルを閉じます。

順不同の属性を許可するかどうかはわかりません。

于 2011-11-27T16:02:03.953 に答える
1

FSM で状態を構築する標準的な方法は、トークンを読み込んでツリーを構築することです。FSM の状態は、現在使用しているノードの種類によって決まります。たとえば、単語「Person」の解析から開始すると、ツリーに新しい「Person」ノードを作成する必要があることがわかります。次に、「End Person」トークンに到達するまで、それ以降に読み取ったすべてのものは、その「Person」の下にノードを作成します。

アカデミックな演習として、これは FSM にとって良いことのように思えます。しかし実際には、これは JSON のように見えるので、既存の構文解析方法を確実に探します。

また、yacc (または bison) は、FSM パーサーを構築する決定的な方法です。正式に定義された文法が与えられた C コードを吐き出します。私はそれを調べたことはありませんが、おそらく Java にも似たようなものがあるでしょう。

于 2011-11-27T16:11:15.433 に答える