11

私は (あまりにも) 多くの場合、テキスト データ ファイル (「誰もが」XML を使用する前に使用されていたテキスト構造化データ表現のようなもの) を解析しなければならないというタスクに直面しています。これはある種の業界標準です。(これらの数が多すぎます。)

とにかく、基本的なタスクは常にテキスト ファイルを取得し、そこにあるものをある種のデータ構造に詰め込んで、C++ コードが情報を使用して何かを実行できるようにすることです。

さて、私はいくつかの単純な (そして非常にバグの多い) パーサーを手作業で実装しました。:-)

それで、構造化されたテキストデータをメモリ内表現に「解析」したいときの現在の最先端技術は何なのかと思っていました(考えてみてください:任意の言語のXMLデータバインディング)。

これまでに見つけたのは「どのパーサージェネレーターをお勧めしますか」でしたが、パーサージェネレーター(ANTLRなど)を求めているかどうかはわかりません。

明らかな候補はpegtlBoost.Spiritのようですが、どちらもかなり複雑に見えます (ただし、少なくとも言語内にはあります)。最後に Spirit を試したとき、コンパイラ エラーで頭がおかしくなりました。(そして、pegtl には C++11 互換のコンパイラが必要ですが、これはここではまだ問題です (VC++ 2005)。)

だから、次のようなものを取得するためのより簡単なソリューションがありませんか

/begin COMPU_METHOD
  DEC "  Decimal value"
  RAT_FUNC
  "%3.0"
  "dec"
  COEFFS 0 1.000000 0.000000 0 0.000000 1.000000
/end COMPU_METHOD

C++ データ構造に? (これは、そのようなファイルの一部がどのように見えるかを示す恣意的な例にすぎません。この形式については、十分に普及しているため、解析するライブラリを購入することができます (そしておそらく購入する必要があります) 。出会い。)

--それとも、Boost.Spirit などの複雑さを求める必要がありますか?

4

3 に答える 3

3

弾丸を噛み、Boost.Spirit を使用することを強くお勧めします。エラーメッセージは頭の中で1つを出すのに十分かもしれませんが、私にとってはそれだけの価値がありました. これを使用して、文書化されていない (または文書化されていない) カスタム ファイル形式のパーサーを、数日ではなく数時間で実装しました。

これにアプローチする最善の方法はstd::istream、分離を示すために同じ二重角表記法を使用しているため、「強化された」ものと見なすことであることがわかりました。

于 2011-11-11T09:59:40.550 に答える
3
  • ブーストスピリット

    見る

  • ココ/R (C++)

    私は、共通の文法形式を使用して多くの言語/プラットフォームをサポートするこの非常に実用的なパーサー ジェネレーターで良い結果を得ました。解析の速度はBoost Spirit に匹敵します (解析されたデータの処理は汎用プログラミングを使用する方が効率的かもしれませんが)

編集はっきりさせておきますが、Coco/R でできなかったことは一度もありません。

しかし、私は、Spirit が一般的に私のために属性タイプ (変換) を推測する簡単さに本当にはまっています。それが主な時間の節約です。ただし、次の費用がかかります。

  • 学習曲線、メンテナンス
  • コンパイル時間 (ただし、パーサーは頻繁に変更されることはありません)
于 2011-11-11T12:13:56.813 に答える
0

あなたが手作業で作成したパーサーがどれほど洗練されていたかについては言及していません。しかし、そのような単純なファイルは、専用のステート マシンによって実行される字句解析と構文解析に作業を分割する限り、手作りのルーチンによって確実に解析できると思います。最初のものは、あなたの例のキーワード、数字、文字列のようなトークンを認識し、より長い文を認識して対応するデータ構造を作成しようとする2番目のものにそれらをフィードします。あいまいさやその他の競合のない通常の文法に従う単純なファイルを使用すると、非常に単純で管理しやすくなります。

于 2011-11-04T10:15:17.687 に答える