# 4 Visitor を使って AST をわたり歩く

visitor パターンは ... `compiler` パッケージは、Python のイントロスペクション機能を利用して visitor のために必要な大部分のインフラを省略した、visitor パターンの変種を使っています。

visit されるクラスは、visitor を受け入れるようにプログラムされている必要はありません。 visitor が必要なのはただそれがとくに興味あるクラスに対して visit メソッドを 定義することだけです。それ以外はデフォルトの visit メソッドが処理します。

XXX The magic `visit()` method for visitors.

`walk`( | tree, visitor[, verbose])

クラス `ASTVisitor`( | )

  `ASTVisitor` は構文木を正しい順序でわたり歩くようにします。 それぞれのノードはまず `preorder()` の呼び出しではじまります。 各ノードに対して、これは `visitNodeType' という名前のメソッドに対する `preorder()` 関数への visitor 引数をチェックします。 ここで NodeType の部分はそのノードのクラス名です。たとえば `While` ノードなら、`visitWhile()` が呼ばれるわけです。 もしそのメソッドが存在している場合、それはそのノードを第一引数として呼び出されます。

  ある特定のノード型に対する visitor メソッドでは、 その子ノードをどのようにわたり歩くかが制御できます。 `ASTVisitor` は visitor に visit メソッドを追加することで、 その visitor 引数を修正します。特定のノード型に対する visitor が 存在しない場合、 `default()` メソッドが呼び出されます。

`ASTVisitor` オブジェクトには以下のようなメソッドがあります:

XXX 追加の引数を記述

`default`( | node[, ...])

`dispatch`( | node[, ...])

`preorder`( | tree, visitor)