Python.use(better, src=”PyPy”) #006: 関数 transformer.parse

中級篇

Python.use(better, src=”PyPy”) # ソースコードの歩き方《中級篇》
ソースコードの歩き方《PyPy1.2》

《著》小粒ちゃん@湘南組、小粒ちゃん@博多組《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2008/11/25 ● 第2版♪2010/04/29

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
》作業中です《


関連記事

Last updated♪2010/05/22