by shigemk2

当面は技術的なことしか書かない

AOSA 3 The Bourne-Again Shell その3 #read_aosa

パース

  • パースエンジンが最初にする仕事は字句解析、つまり文字のストリームを単語に区切ってそれに意味を与えるということだ
  • エイリアスは完全な単語なので、エイリアスを使えば文法をも変えられる
  • エスケープを使えば特殊な意味をもたせることもできる
  • 字句解析器はクォートされた文字や文字列をパーサ側で予約語やメタ文字として扱わないようにする
  • パーサと字句解析器の残りのインターフェイスはそれほど難しいものではない
  • パーサはある程度の量の状態を符号化して解析器と共有し、文法上必要となるコンテキスト依存の解析を行う
  • 字句解析器はその筋では素養のない人が作っているので、オレオレパーサになっている
  • 予約語や代入分などを実現するために
  • コマンドのパースがどこまで進んだか
  • 複数行の文字列("ヒアドキュメント"と呼ばれることもある)を処理しているところかどうか
  • 条件分岐の中にいるかどうか
  • シェルパターンを展開したものを処理しているのか複合代入文を処理しているのか など

  • パース段階でのコマンドの置換が終わったことを判断する作業のほとんどは、ひとつの関数(parse_comsub)にまとめられている

  • 単語の展開の際にコマンド置換を展開するときには、bashはパーサを使って言語構造の終了位置を見つける
  • パーサはまた、yyparseを再帰的に起動する前にパーサの状態を保存しておかなければならない
  • パーサが返すのはコマンドを表すCの構造体(ループのような合成コマンドの場合は、その中にさらに別のコマンドが含まれる場合もある)で、それがシェル操作の次のステージ、つまり単語の展開処理に渡される

クォート処理

"" '' などの処理すべてをあらわす

m-takagi/aosa-ja · GitHub