Yash 2 その 67: test コマンド
printf に続いて test コマンドも完成。複雑な条件式の解析は他のシェルと同様にお座なり。
どんな条件式でも解析できるようにしようとすると、本格的な文脈自由文法の解析器 (LR 法のような簡略化したものではなくて、アーリー法などの動的計画法によるもの) を書かなくてはいけなくなるが、さすがにそこまでするのは骨が折れる。
例えば [ "(" -n = ")" -a 1 ]
という式の場合、-n
を =
に対する前置演算子とし、それを括弧が囲んでいると解釈すると、その後の -a 1
もうまく解釈できるが、=
を -n
と )
とを比較する二項演算子と解釈すると、開き括弧に対応する閉じ括弧がなくなってエラーになってしまう。一方 [ "(" -n = ")" -a 1 ")" ]
の場合全く逆のことが起きる。これをどちらもきちんと解析できるようにしようとすると、-n
と =
のどちらを演算子として採用するかを決める段階でその時開いている括弧の数なども考慮しつつ式の最後まで先読みをしなくてはならない。すなわち、ふつうの再帰下降型の解析器では完全な解析は事実上不可能だ。
なお、-a
演算子や括弧を使わずにばらして書けば必ずきちんと解析できるようになるので、複雑な式が解析できないことがあるといっても大きな問題はない。
| 固定リンク
コメント