Interpreterパターン (1)

Rubyによるデザインパターン』(ラス・オルセン著 ピアソン・エデュケーション刊)の例をPythonに変換して書いています。目次

周知の通り、PythonRubyも標準的な処理系は、インタープリタとして実装されています。

Interpreterパターンは、簡易言語(Pythonほど大げさではないやつ)を作るためのパターンです。

Interpreterパターンは抽象構文木(abstract syntax tree、AST)を作る事から始まります。
ASTは生の文字列に比べて、扱いやすく、効率的です。
たとえば、式"5.0 + 3 * x" のASTは次のような感じになります。


さてこのASTが手に入ったら、式の値を計算する容易はほぼ出来ました。変数 x に実際の値を代入する事以外は。

x = 1 なら式全体の値は8.0と評価され、x = -3 なら式全体の値は -4.0 と評価されます。

ASTの値を評価するとき、ASTは自分自身を再帰的に評価していきます。

まず、ツリーのルートノード("*"のノード)に自分自身を評価するように要請します。
すると、"*"のノードは、子ノードである"5.0"と"+"に値を要求します。
"5.0"の値は簡単に分かりますが、"+"のノードはさらに自分の子供たち"3" と "x" に値を要求します。
これで評価が終わり、式全体の値が得られます。

しかし、式の例だと何が嬉しいのか分からないので、次の項でファイル検索コマンドのインタープリタを作ります。