質問
ANTLRv3で単純なBaSHのような文法を作成しようとしていますが、サブシェルコマンド内の入力を解析(およびチェック)できていません。
詳細説明:
次の入力を解析したい:
$(command parameters*) `command parameters` "some text $(command parameters*)"
コマンドパラメータなどの単純な入力の場合と同様に、その内容を確認できます。
i.e。:
解析すると、
(SUBSHELL (CMD command (PARAM parameters*)))(トークンは大文字)
のようなツリーが生成されます
私は '$(' sと '`' sを無視することができますが、サブシェルが二重引用符で囲まれた文字列内で使用されている場合はカバーしません:
$ echo "String test $(ls -l) end"
それで...これを達成するためのヒントはありますか
解決
Antlr v3の詳細についてはあまり詳しくありませんが、ネストが表現できないため、従来のスタイルのレクサーで二重引用符で囲まれた文字列内でbashスタイルのコマンド置換を処理できないことを伝えることができます通常の文法を使用します。従来のコンパイラコンパイラのほとんどは、レクサーが通常の文法を使用するように制限しているため、効率的なDFAを構築できます。 (ソースのすべての単一文字をスキャンしなければならないレクサーは、歴史的にコンパイラの最も遅い部分の1つでした。)
<!> quotを解析する必要があります。トークンとして(理想的には)文字列の内部に異なるレクサーまたはレクサーモードを使用するため、ほとんどのシェルメタキャラクター、たとえば「{」は、トークンとしてではなく、テキストとして解析されます。または、レクサーとパーサーの除算を廃止し、スキャナーなしのアプローチを使用して、<!> quot; lexer <!> quot;二重引用符で囲まれた文字列のルールは、<!> quot; parser <!> quotを呼び出すことができます。コマンド置換のルール。
私はスキャナーレスのアプローチを好むでしょう。 Antlr v3は、トークンストリームを使用するのではなく、文字ストリーム上で直接動作する文法の記述をどの程度サポートしているかを調査します。