1

Java でネストされたファイル形式を解析しようとしています。

ファイル形式は次のようになります。

head [

    A [
        property value
        property2 value
        property3 [
            ... down the rabbit hole ...
        ]
    ]

    ... more As ...

    B [
        .. just the same as A
    ]

    ... more Bs ...
]

これを私のプログラムに解析するための最良/最も簡単な手法は何ですか?

  • 有限ステートマシン?

  • 手動で一語一語読んで、自分が構造のどの部分にいるかを追跡しますか?

  • 文法を書く...?

補足として、私はフォーマットを制御できません-誰かがそれを言うことを知っていたからです!

4

4 に答える 4

2

文法が実際にこのようにネストされている場合、非常に単純なトップダウン パーサーを作成するのは簡単な作業になります。認識するトークンはほとんどなく、ネストされた構造は教科書の再帰降下パーサーにとって非常に便利に繰り返されます。

学習曲線がプロジェクトの潜在的な利益を食い尽くすため、ANTLR や別のパーサー ジェネレーターをこの単純なものに使用することさえ気にしません*


*パーサー ジェネレーターを学習することで得られる潜在的なメリットは、過大評価することはできません。ANTLR を使用してパーサーを構築するために 1 日か 2 日を費やすことができれば、構造化テキスト ファイルに対する見方は永遠に変わるでしょう。

于 2013-07-19T20:57:33.627 に答える
1

私は、Antlr を検討することをお勧めします。StAX は、SAX に似たイベント処理を追加します。

http://www.antlr.org/wiki/display/ANTLR3/Interfacing+StAX+to+ANTLR

はい、学習曲線がありますが、すべての奇妙なケースを処理してコードをデバッグするまでには、おそらく損益分岐点になるでしょう。さらに、履歴書に新しい項目が追加されます。

于 2013-07-19T21:03:33.423 に答える
1

この種のファイルを解析する最も簡単な方法は、おそらく再帰降下パーサー ( http://en.m.wikipedia.org/wiki/Recursive_descent_parser ) を使用することです。これは、見つけた構造を手動で読み取り、追跡するという意味だと思います。

無制限のネストを処理できる必要がある場合、有限状態マシンは機能しません。2段だけあれば十分です。

文法を書いてパーサーを生成することもできますが、それをやったことがないか、ツールの使い方を学ぶ時間がない場合は、おそらくやり過ぎです...

于 2013-07-19T21:05:26.050 に答える
0

最速のアプローチは、JSON や YAML など、すでにこのような形式を使用することです。これらの形式はこれを行い、サポートされています。

補足として、私はフォーマットを制御できません

Yaml のようなものを解析する最善の方法を知りたいがそうでない場合は、単純な Yaml パーサーのコードを読むことです。

ファイルを解析するだけでは不十分であり、イベントをトリガーしたり、ロードしたデータからデータ モデルを生成したりする必要があります。

于 2013-07-19T20:56:56.847 に答える