利用可能な既存のPOSIXsh文法はありますか、それとも仕様から直接理解する必要がありますか?
私は純粋なshにはあまり興味がないことに注意してください。拡張されているが準拠しているshも、私の目的には十分です。
私はもう少し掘り下げて、これらのリソースを見つけました:
ここにsh
あるチュートリアル
Bash 2.0のBNF文法(ここから削除)を含むBashの本で、関連する付録はまだここにあります
、、のソースを調べましたがbash
、必要な抽象化のレベルでリモートで何も見つかりませんでした。pdksh
posh
POSIX標準は、POSIXシェルの文法を定義します。定義には、注釈付きのYacc文法が含まれています。そのため、多かれ少なかれ機械的にEBNFに変換できます。
「本物の」文法が必要な場合は、もっと見づらくする必要があります。「実際のシェル」を選択し、ソースを見つけて、そこから文法が何であるかを理解します。
EBNFは広く使用されていないことに注意してください。特に、それをサポートするツールが本質的にないため、実用的な価値は限られています。したがって、(ほとんどすべての)EBNF文法が既成のものであるとは思われません。
私は過去1年間に、本格的なBash通訳者を書くことを何度も試みました。また、ある時点で、マークされた回答(#2)に記載されている同じ本の付録のリファレンスに到達しましたが、完全に正しく/更新されていません。 (たとえば、「coproc」予約キーワードを使用してプロダクションルールを定義せず、「<&」を使用したリダイレクトのプロダクションルール定義が重複している場合は、さらに問題が発生する可能性がありますが、これらは私が気付いたものです)。
http://ftp.gnu.org/gnu/bash/
私が使用した正規表現は次のとおりです。
(\{(\s+.*?)+\})\s+([;|])
これは、中括弧の間にある.*?
スペースや新しい行、特にaまたは文字の前の最後の閉じ中括弧を含む、貪欲ではないすべての行に一致します。次に、一致した文字列をに置き換えました(たとえば、3番目のキャプチャグループの結果、;または|のいずれか)。\s+
;
|
\3
これが投稿時に抽出できた文法の定義ですhttps://pastebin.com/qpsK4TF6
sh、csh、ash、bashにはパーサーが含まれていると思います。これらのGNUバージョンはオープンソースです。あなたはただそこをチェックしに行くかもしれません。