Python.use(better, src=”PyPy”) #006: 関数 transformer.parse
|中級篇|
Python.use(better, src=”PyPy”) # ソースコードの歩き方《中級篇》
ソースコードの歩き方《PyPy1.2》
PyPy1.2 のリリースを機に、PyPy1.1 版を再構成しました。
※ compiler の傘下にあるモジュールは、PyPy1.1.0 からの変更はありません。
関数 transformer.parse
関数 parse を頼りに歩を進めると、モジュール transformer.py に遭遇します。そこで、pycodegen.py に別れを告げて、新たな世界を探りましょう。
■ 関数 transformer.parse
関数 parse の本体では、
$ cat compiler/transformer.py ... def parse(buf, mode="exec"): if mode == "exec" or mode == "single": return Transformer().parsesuite(buf) elif mode == "eval": return Transformer().parseexpr(buf) else: raise ValueError("compile() arg 3 must be" " 'exec' or 'eval' or 'single'")
見慣れた光景 "exec" や "single" が目に留まります。分かれ道では "eval" を選びましたが、どの道、この同じ場所にたどり着くことが分かります。離れ離れになった仲間たちと再会したようで、安心して旅を再開できます。
以前と同様に、ここでも同じ道 "eval" を選びます。すると、
def parse(buf, mode="exec"): ... elif mode == "eval": return Transformer().parseexpr(buf)
そこに新たな登場人物 parseexpr が立ちはだかります。次の扉を開く鍵は buf/mode の2つです。一方の鍵 mode は、扉 "eval" を開くのに使いました。他方の鍵 buf で開く扉に至るには、新たな困難 Transformer を乗り越えなければなりません。左手に鍵 mode == "eval" を握りしめて、右手の鍵 buf で扉 parseexpr を開くと、そこに何が見えるでしょうか。
■ クラス Transformer
クラス Transformer の冒頭にあるコメントを見ると、
$ cat compiler/transformer.py ... class Transformer: """Utility object for transforming Python parse trees. Exposes the following methods: tree = transform(ast_tree) tree = parsesuite(text) tree = parseexpr(text) tree = parsefile(fileob | filename) """
メソッド parseexpr は、指定されたテキスト(文字列)から構文木 tree を生成するとあります。つまり、扉 parseexpr を開くと、そこには高く聳える構文木が見えるはずです。
クラス呼び出し Transformer() の謎を解く鍵は、特殊メソッド __init__ にあります。特殊メソッド __init__ では、
$ cat compiler/transformer.py ... class Transformer: ... def __init__(self): self._dispatch = {} for value, name in symbol.sym_name.items(): if hasattr(self, name): self._dispatch[value] = getattr(self, name) ...
構文木の設計図(目録)になる、個別の辞書 self._dispatch を作成しているのが分かります。
↑TOP
》作業中です《