データ ファイルから可変長のテキスト ブロックを抽出する必要があり、文法ファイルを書き込もうとしています。主な課題は 2 つあります。まず、テキストは可変長です。第 2 に、テキスト ブロック自体を特定するのに役立つアンカーがありません。基本的に、メインフレームで生成されたテキストベースのレターを解析して、ファイルの特定のセクションから情報を抽出し、ANTLR のキーと値のペアを使用して Adobe フォームに入力しようとしています。ANTLR 4.0 では、トークンのすべての単語をマージし、それらをスペースで区切ってマージして文字列を形成する方法を特定しました。パーサーとレクサーは 4.0 で書き直されたため、3.5 には同じ機能がありません。問題を解決するためにあなたの意見を求めています。以下は、私たちが試みてきたいくつかのことです。
意味述語を書くこのアプローチを試みました。単語を取得することはできますが、単語の間に空白を挿入することはできません。
@init{ int N = 0; }
: ( { N <= 3 }? ) =>( WORD { N++; } )+
これは空白を含める 3 番目のアプローチです。スキップする代わりにWS
、各ルールで処理できますが、多くのメモリを占有する可能性があり、メモリ不足の問題が発生する可能性があります。
name: WORD WS WORD WS WORD;
WS : ( ' '|'\t'|'\r'|'\n' )+