Interpreterパターン (3) ASTを手に入れる

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

Interpreterパターンを使うには、まずAST(抽象構文木)を手に入れなくてはなりません。

でも、ASTを手に入れるのが、一苦労なのです。

S式

一つの選択肢として、S式があります。Lispの書式の事です。

前回のファイル検索言語ならば、

(not (and  (bigger 1024) "*.py"))

と、ユーザーに書いてもらいます。ちょっと奇妙と言えば奇妙な書式ですが、難しくは無いはずです。

S式は構文解析が容易なのがメリットです。Googleれば、うじゃうじゃ例が出てきます。

Python

別の選択肢には、Pythonで書いてもらうという選択肢があります。

たとえば、インタープリタをモジュールとして提供して使ってもらいます。

from filesearch import *

expr = ~(Bigger(7.16 * 1024) & FileName("*.py"))
print(expr.evaluate("./"))

この方法のメリットは、Pythonの強力な機能をそのまま流用できる事です。

動的配列・連想配列・集合型・正規表現etcを装備したファイル検索言語をタダで作れるという事です。

独自言語

しかし、世のPCユーザーの大半は、プログラマでも数学者でもありません。

S式の括弧だらけの構文にも、Pythonをインストールにも、抵抗があるでしょう。

別の理由で独自の式の構文をサポートする必要が出るかもしれません。

その場合は、自分で文字列を構文解析してASTを作らなければなりません。

C言語を生成するYacc・Bisonなどが有名ですが、Python構文解析ライブラリも多数あるようです。

次のサイトに一覧があります(英語)。


Ned Batchelder: Python parsing tools

しかし、構文解析ライブラリの学習曲線の昇り坂は、急でしかも長いので、途中で心臓発作を起こさないようご注意ください。