2

(申し訳ありませんが、アドホックがここで正しい言葉であるかどうかはわかりません...より良い提案のために開いてください)

Galaxyソフトウェア自体の動作を(部分的に)複製するために、JavaアプリでGalaxy ToolConfigXMLCLIツールラッパー形式を解析しようとしています。

この形式には、コマンドタグ内にいくつかの「フリーテキスト」のif / else句が含まれています(これが発生する唯一の場所です、AFAIK)。

...
<command interpreter="python">
  sam_to_bam.py
    --input1=$source.input1
    --dbkey=${input1.metadata.dbkey} 
    #if $source.index_source == "history":
      --ref_file=$source.ref_file
    #else
      --ref_file="None"
    #end if
    --output1=$output1
    --index_dir=${GALAXY_DATA_INDEX_DIR}
</command>
...

このif/else構造を、Javaでif / elseロジックを再構築するために使用できるものに解析するための推奨戦略は何でしょうか?

BNF / ANTLRはやり過ぎですか、オブジェクト構造に解析するだけの方が良いですか、それとも?ここに合うデザインパターンはありますか?(これまでBNF / ANTLRを使用したことはありませんが、価値があるかどうかを調査する用意があります)。

4

1 に答える 1

2

入力のすべての構造をキャプチャしたい場合は、パーサーが唯一の方法です。パーサーを手動でトップダウン再帰的にコーディングすることはできますが、それを行う意味はほとんどありません。そのため、パーサージェネレーターツールが存在します。それらを使用してください。

#if #then #elseについて:それがキャプチャしたい唯一の構造である場合は、任意のテキストを含むトークンが#if#then#else構造間のグーをピックアップできる非常に原始的な文法のみが必要です。テキストのブロブ。

すべてのコード構造をキャプチャする必要があり、条件が特定の場所でのみ許可されている場合、それらの存在は、使用しているBNFに簡単に統合できます。

私が思うに、これらがどこでも発生する可能性がある場合(「アドホック」?#ifはCプリプロセッサスタイルに従い、これらの条件は入力ストリームのほぼどこでも発生する可能性があります)、テキストを解析て条件を保持することは現在出血中です最先端の構文解析でできることの端。これは標準的なC前処理疾患であり、これに対する適切な解決策はありません。この場合、標準のパーサジェネレータはかなり役に立ちません。(手作業でコーディングされたパーサーは、ここでもうまくいきません。どちらの場合も、同じ種類のソリューションを使用する必要があります)。

これを処理するための最近のスキームの1つ(過去数か月で博士号の研究結果として報告されたばかり)は、#ifトークンが#ifと#elseを処理することがわかった場合は常に解析をフォークし、#endifが見つかった場合は参加することです。次に、通常、条件のどのアームでマークされたあいまいなサブツリーとして生成されたサブツリーに融合する方法が必要です。

人生をやり遂げたいのであれば、これらの条件は文法の明確な場所で発生することを主張し、構造化されていないプリプロセッサディレクティブを作成する人々からの不満を我慢することをお勧めします。(「あなたはクレイジーなコードを書いたのですか?申し訳ありませんが、私のツールはそれを処理しません」)。

于 2011-07-22T14:29:24.620 に答える