12

利用可能な既存のPOSIXsh文法はありますか、それとも仕様から直接理解する必要がありますか?

私は純粋なshにはあまり興味がないことに注意してください。拡張されているが準拠しているshも、私の目的には十分です。

4

4 に答える 4

8

私はもう少し掘り下げて、これらのリソースを見つけました:

  1. ここshあるチュートリアル

  2. Bash 2.0のBNF文法(ここから削除)を含むBashの本で、関連する付録はまだここにあります

、、のソースを調べましたがbash、必要な抽象化のレベルでリモートで何も見つかりませんでした。pdkshposh

于 2013-03-24T14:48:35.923 に答える
8

POSIX標準は、POSIXシェルの文法を定義します。定義には、注釈付きのYacc文法が含まれています。そのため、多かれ少なかれ機械的にEBNFに変換できます。

「本物の」文法が必要な場合は、もっと見づらくする必要があります。「実際のシェル」を選択し、ソースを見つけて、そこから文法が何であるかを理解します。

EBNFは広く使用されていないことに注意してください。特に、それをサポートするツールが本質的にないため、実用的な価値は限られています。したがって、(ほとんどすべての)EBNF文法が既成のものであるとは思われません。

于 2013-03-24T15:18:26.900 に答える
3

私は過去1年間に、本格的なBash通訳者を書くことを何度も試みました。また、ある時点で、マークされた回答(#2)に記載されている同じ本の付録のリファレンスに到達しましたが、完全に正しく/更新されていません。 (たとえば、「coproc」予約キーワードを使用してプロダクションルールを定義せず、「<&」を使用したリダイレクトのプロダクションルール定義が重複している場合は、さらに問題が発生する可能性がありますが、これらは私が気付いたものです)。

  1. 私が見つけた最良の方法はに行くことでしたhttp://ftp.gnu.org/gnu/bash/
  2. 現在のbashバージョンのソースをダウンロードする
  3. parse.yファイル(この場合は、基本的にbashが使用するすべての解析ロジックを含むYACCファイル)を開き、お気に入りのテキストエディターで「%%」の間の行をコピーして貼り付けます。これらは文法の生成ルールを定義します。
  4. 次に、少しの正規表現を使用して(ところで、私はひどいです)、「{...}」の間にある余分なコードロジックを削除して、文法をよりBNFのように見せることができます。

私が使用した正規表現は次のとおりです。

(\{(\s+.*?)+\})\s+([;|])

これは、中括弧の間にある.*?スペースや新しい行、特にaまたは文字の前の最後の閉じ中括弧を含む、貪欲ではないすべての行に一致します。次に、一致した文字列をに置き換えました(たとえば、3番目のキャプチャグループの結果、;または|のいずれか)。\s+;|\3

これが投稿時に抽出できた文法の定義ですhttps://pastebin.com/qpsK4TF6

于 2019-05-06T01:39:59.150 に答える
1

sh、csh、ash、bashにはパーサーが含まれていると思います。これらのGNUバージョンはオープンソースです。あなたはただそこをチェックしに行くかもしれません。

于 2013-03-24T13:47:29.590 に答える