『Rubyによるデザインパターン』(ラス・オルセン著 ピアソン・エデュケーション刊)の例をPythonに変換して書いています。目次
Interpreterパターンを使うには、まずAST(抽象構文木)を手に入れなくてはなりません。
でも、ASTを手に入れるのが、一苦労なのです。
S式
一つの選択肢として、S式があります。Lispの書式の事です。
前回のファイル検索言語ならば、
(not (and (bigger 1024) "*.py"))
と、ユーザーに書いてもらいます。ちょっと奇妙と言えば奇妙な書式ですが、難しくは無いはずです。
Python
別の選択肢には、Pythonで書いてもらうという選択肢があります。
たとえば、インタープリタをモジュールとして提供して使ってもらいます。
from filesearch import * expr = ~(Bigger(7.16 * 1024) & FileName("*.py")) print(expr.evaluate("./"))
この方法のメリットは、Pythonの強力な機能をそのまま流用できる事です。
独自言語
しかし、世のPCユーザーの大半は、プログラマでも数学者でもありません。
S式の括弧だらけの構文にも、Pythonをインストールにも、抵抗があるでしょう。
別の理由で独自の式の構文をサポートする必要が出るかもしれません。
その場合は、自分で文字列を構文解析してASTを作らなければなりません。
C言語を生成するYacc・Bisonなどが有名ですが、Python用構文解析ライブラリも多数あるようです。
次のサイトに一覧があります(英語)。
Ned Batchelder: Python parsing tools
しかし、構文解析ライブラリの学習曲線の昇り坂は、急でしかも長いので、途中で心臓発作を起こさないようご注意ください。