10

ファイル全体をメモリにロードしないように ANTLR に指示することは可能ですか? ルールを 1 つずつ適用し、ファイルを読み取るとともに、ノードの最上位リストを順番に生成できますか? また、分析されたノードを何らかの形でドロップすることは可能でしょうか?

4

2 に答える 2

15

はい、使用できます:

  • UnbufferedCharStream文字ストリーム用 (lexer に渡される)
  • UnbufferedTokenStreamトークン ストリーム用 (パーサーに渡される)
    • このトークン ストリームの実装はトークン チャネルで区別されないため、パーサーに送信されるべきではないレクサー ルール内のコマンドとして->skip代わりに使用するようにしてください。->channel(HIDDEN)
  • 必ずパーサーを呼び出しsetBuildParseTree(false)てください。そうしないと、ファイル全体に対して巨大な解析ツリーが作成されます。

コメントを追加して編集します。

  • 私は、特に、、 、メソッドに関連して、可能な限り最も「正気」な方法で確実UnbufferedCharStreamに動作するようにかなりの労力を費やしました。私の目標は、未使用のメモリを解放するストリームの機能を損なうことなく、これらのメソッドの機能を可能な限り維持することでした。UnbufferedTokenStreammarkreleaseseekgetText
  • ANTLR 4 では、真の無制限の先読みが可能です。文法で決定を行うために EOF への先読みが必要な場合、入力全体をメモリにロードすることを避けることはできません。文法を書くときは、このような状況を避けるために細心の注意を払う必要があります。
于 2013-05-10T22:22:46.793 に答える
3

Antlr.org のどこかに、あなたの質問に答える Wiki ページが埋め込まれています。今すぐ見つけることができないようです。

実際には、レクサーは標準の InputStream インターフェイス、具体的には ANTLRInputStream.java を使用してデータを読み取ります。典型的な実装は、入力データ ファイル全体を事前にメモリに読み込むANTLRFileStream.javaです。あなたがする必要があるのは、必要に応じてソースファイルから読み取る独自のバッファリングされたバージョン「ANTLRBufferedFileStream.java」を作成することです。または、標準の BufferedInputStream/FileInputStream をデータ ソースとして AntlrInputStream に設定するだけです。

1 つの注意点は、Antlr4 には無制限の先読みを行う可能性があるということです。通常の操作では、適切なサイズのバッファでは問題にならない可能性があります。パーサーがエラー回復を試みたときに発生する可能性が高くなります。Antlr4 ではエラー回復戦略を調整できるため、問題は管理しやすくなっています。

追加の詳細:

実際、Antlr はプルパーサーを実装しています。最初のパーサー ルールを呼び出すと、パーサーはレクサーからトークンを要求し、レクサーは入力ストリームから文字データを要求します。パーサー/レクサー インターフェースは、バッファリングされたトークン ストリーム (通常はBufferedTokenStream ) によって実装されます。

解析ツリーは、トークンのツリー データ構造にすぎません。まあ、もっとたくさんありますが、データサイズに関してはそうではありません. 各トークンは、通常、トークン定義に一致した入力データ ストリームのフラグメントによって裏付けられた INT 値です。lexer 自体は、lex された入力文字ストリームの完全なコピーをメモリに保持する必要はありません。また、トークン テキストの断片はゼロになる可能性があります。レクサーの重要なメモリ要件は、バッファリングされたファイル入力ストリームが与えられた場合の入力文字ストリームの先読みスキャンです。

必要に応じて、100 GB 以上の入力ファイルを指定しても、メモリ内の解析ツリーを小さくすることができます。

さらに支援するには、Antlr で何をしようとしているのか、および最小の重要なメモリ要件を定義するものについて、さらに説明する必要があります。これにより、推奨できる追加の戦略が決まります。たとえば、ソース データが適切である場合は、複数のレクサー/パーサーを実行して、そのたびにソース データの異なる部分をサブ選択して処理することができます。ファイルの読み取りや DB の書き込みと比較すると、高速なディスクを使用しても、Antlr の実行はほとんど目立たない可能性があります。

于 2013-05-09T01:20:52.513 に答える