数式展開の実装方式
Yash-rs で数式展開を実装するにあたって、設計を検討してゐる。
検討に当たって、既存の他のシェルはどうしてゐるのかを先に調べた。
まづパーサーの動作原理によって設計を分類できる。さらに、パーサーが抽象構文木 (AST) を生成するのか、式の計算結果を直接生成するのか、大まかに分類できる。
- Bash 5.1.8: 手書きの再帰下降法、直接式
- Dash 0.5.11: 手書きの再帰下降法、直接式
- Ksh 93v: 手書きの再帰下降法、AST 式。ただし一つの文脈自由文法非終端子を一つの函数で実装する様な普通の再帰下降法ではなく、LR 法により逆ポーランド記法の AST を生成する。
- Mksh R59c: 手書きの再帰下降法、直接式。ただし一つの文脈自由文法非終端子を一つの函数で実装する様な普通の再帰下降法ではなく、LR 法により再帰呼び出しの深さを低減する。
- Yash 2.52: 手書きの再帰下降法、直接式
- Zsh 5.8.1: 手書きの再帰下降法、直接式。ただし一つの文脈自由文法非終端子を一つの函数で実装する様な普通の再帰下降法ではなく、LR 法によりスタックマシンを実行する。
数式展開では代入が行はれることがあるので、代入先となる変数 (への参照) を扱へる必要がある。パーサーが計算結果の値 (整数) を直接返す方式では変数を返すことができないので、別口での処理が必要である。また、条件演算子 a ? b : c
をサポートするために、解析されるが評価されない部分式を処理するための機構も必要となる。これらに対応するために、dash はもともと yacc で自動生成していたパーサーを手書きのものに変更してゐる。
上記の中では AST を生成してから評価するのは ksh だけで、少数派である。AST を生成しても基本的に一度しか評価されないので、あまりうまみがない。パーサーを yacc 等で自動生成してゐるものはなく、手書きの再帰下降法で書かれてゐる。
演算子の優先順位ごとに一つづつ解析用函数を定義するのではなくて、二項演算子が現れたときだけ再帰する様な工夫が複数の実装で見られる。これにより、再帰下降法で必要となる再帰呼び出しの深さが低減される。Yash-rs でもこれを採用しようと思ふ。
| 固定リンク
コメント