2

ANTLRv3 で単純な BaSH のような文法を作成しようとしていますが、サブシェル コマンド内の入力を解析 (およびチェック) できませんでした。

さらなる説明:

次の入力を解析したい:

$(コマンド パラメーター*)

`コマンドパラメータ`

「何らかのテキスト $(コマンド パラメーター*)」

また、コマンド パラメータなどの単純な入力を使用して内容を確認することもできます。

すなわち:

それを解析すると、次のようなツリーが生成されます

(SUBSHELL (CMD コマンド (PARAM パラメータ*)))
(トークンは大文字)


「$(」と「`」を無視することはできますが、次のように二重引用符で囲まれた文字列内でサブシェルが使用されている場合はカバーされません。

$ echo "文字列テスト $(ls -l) end"

それで...これを達成する方法に関するヒントはありますか?

4

1 に答える 1

1

私は Antlr v3 の詳細にあまり詳しくありませんが、従来のスタイルのレクサーでは二重引用符で囲まれた文字列内で bash スタイルのコマンド置換を処理できないと言えます。文法。ほとんどの従来のコンパイラ-コンパイラは、効率的な DFA を構築できるように、レクサーが通常の文法を使用するように制限しています。(ソースのすべての文字を単純にスキャンする必要があるレクサーは、歴史的にコンパイラの最も遅い部分の 1 つでした。)

" をトークンとして解析し、(理想的には) 文字列の内部に別のレクサーまたはレクサー モードを使用して、'{' などのほとんどのシェル メタ文字がトークンとしてではなくテキストとして解析されるようにする必要があります。二重引用符で囲まれた文字列の「レクサー」ルールがコマンド置換の「パーサー」ルールを呼び出すことができるように、レクサー-パーサー部門を廃止し、スキャナーレスアプローチを使用します。

私はスキャナーレスのアプローチを好みます。Antlr v3 が、トークン ストリームを使用するのではなく、文字ストリーム上で直接動作する文法の記述をどの程度サポートしているかを調査します。

于 2009-01-20T14:46:28.580 に答える