2

私がANTLRに飛び込む前に(それは明らかに心の弱い人のためではないので)、私はその使用法に関して正しい決定をしたことを確認したいだけです。

アプリケーション内に値を入力できるように、事前定義されたタグを使用してテキストファイルで解析する文法を作成したいと思います。(テキストファイルは別のアプリケーションによって生成されます。)したがって、基本的に、次のようなものを解析できるようにしたいと思います。

Name: TheFileName
Values: 5 3 1 6 1 3
Other Values: 5 3 1 5 1

私のアプリケーションでは、TheFileNameは文字列として格納され、両方の値のセットが配列に格納されます。(これは単なるサンプルであり、ファイルははるかに複雑です。)とにかく、私は少なくともANTLRで正しい道を進んでいますか?他に何か提案はありますか?

編集 ファイルはユーザーによって作成され、タグを介して領域を定義します。だから、こんな感じかもしれません。

Name: <string>TheFileName</string>
Values: <array>5 3 1 6 1 3</array>
Important Value: <double>3.45</double>

それらの線に沿った何か。

4

6 に答える 6

3

基本的な質問は、ファイルがどのように複雑になるかということです。タグ、コロン、および 1 つ以上の値を使用して、基本的に同じですか、それとも他の行の基本構造はより複雑ですか? 基本的にほとんど同じである場合、データを認識して読み取るためのコードは非常に簡単であり、パーサー ジェネレーターはあまり役に立たないでしょう。他の行が実質的に異なる構造を持っている場合、それは主にそれらがどのように異なるかに依存します.

編集:あなたが追加したものに基づいて、私はさらに一歩(小さな)一歩進んで、ファイルをXMLとしてフォーマットします。次に、既存の XML パーサー (など) を使用して、ファイルの読み取り、データの抽出、指定された形式に適合するかどうかの検証などを行うことができます。

于 2009-11-20T04:54:56.947 に答える
1

フォーマットをカスタムビルドする必要がない場合は、利用可能なパーサーがあるJSONや XML などの既存のフォーマットの使用を検討する必要があります。

カスタム形式が必要な場合でも、それを解析するために本格的な文法を必要としないように、非常に単純な形式を設計する方がよい場合があります。独自のスクリプト文法をゼロから設計し、それを適切に処理するのは大変な作業です。

文法パーサーを書くのもとても楽しいので、興味があれば試してみてください。しかし、学習演習と実際の作業コードを不用意に混在させることはお勧めしません。

于 2009-11-21T00:21:13.840 に答える
1

解析しているファイルの形式をどのように制御しているかによって異なります。コントロールできない場合は、ANTLR などのパーサー ジェネレーターが役立つ場合があります。(これは、制御できない FORTRAN 出力ファイルに対して自分で行います)。かなりの作業ですが、基本的な ANTLR レクサー/パーサー戦略を習得し、うまく機能し始めています。

ただし、形式をある程度または完全に制御できる場合は、必要なだけマークアップを付けて作成してください。XML を処理するためのツールが非常に多いため (解析だけでなく、XPath、データベースなど)、私は常にそのようなファイルを XML で作成します。一般に、半構造化された情報を XML に解析するには ANTLR を使用します。

于 2009-11-20T13:00:55.780 に答える
0

そうですね、「はるかに複雑」な場合は、そうです、パーサジェネレータが役立ちます。しかし、ファイルの実際の形式を表示していないので、その仕事に適したツールが何であるかを誰かがどうやって知ることができるでしょうか。

于 2009-11-20T04:26:57.893 に答える
0

無料のGOLD Parser Builderを使用しています。これは非常に使いやすく、さまざまな言語でパーサー自体を生成できます。このような式を解析するためのサンプルもあります。

于 2009-11-20T04:38:06.683 に答える
0

ファイルのフォーマットがユーザー次第である場合、そのファイルの文法を定義することさえできますか?

せいぜいレクサーが欲しいだけのようです。レクサー部分だけに ANTLR を使用することは可能ですが、やり過ぎのように思えます。

于 2009-11-21T00:20:50.767 に答える