## 19.3.1 AST ノード

`compiler.ast` モジュールは、各ノードのタイプとその要素を記述した テキストファイルからつくられます。各ノードのタイプはクラスとして表現され、 そのクラスは抽象基底クラス `compiler.ast.Node` を継承し 子ノードの名前属性を定義しています。

class `Node`( | )

  `Node` インスタンスはパーザジェネレータによって自動的に作成されます。 ある特定の `Node` インスタンスに対する推奨されるインターフェイスとは、 子ノードにアクセスするために public な (訳注: 公開された) 属性を使うことです。 public な属性は単一のノード、あるいは一連のノードのシーケンスに 束縛されている (訳注: バインドされている) かもしれませんが、 これは `Node` のタイプによって違います。 たとえば `Class` ノードの `bases` 属性は 基底クラスのノードのリストに束縛されており、`doc` 属性は 単一のノードのみに束縛されている、といった具合です。

  各 `Node` インスタンスは `lineno` 属性をもっており、 これは `None` かもしれません。 XXX どういったノードが使用可能な lineno をもっているかの規則は定かではない。

`Node` オブジェクトはすべて以下のメソッドをもっています:

`getChildren`( | )

  子ノードと子オブジェクトを、これらが出てきた順で、平らなリスト形式にして返します。 とくにノードの順序は、 Python 文法中に現れるものと同じになっています。 すべての子が `Node` インスタンスなわけではありません。 たとえば関数名やクラス名といったものは、ただの文字列として表されます。

`getChildNodes`( | )

  子ノードをこれらが出てきた順で平らなリスト形式にして返します。 このメソッドは `getChildren()` に似ていますが、 `Node` インスタンスしか返さないという点で異なっています。

`Node` クラスの一般的な構造を説明するため、 以下に 2つの例を示します。`while` 文は以下のような文法規則により 定義されています:

    while_stmt:     "while" expression ":" suite
                   ["else" ":" suite]

`While` ノードは 3つの属性をもっています: `test`、 `body`、 および `else_` です。(ある属性にふさわしい名前が Python の予約語としてすでに使われているとき、その名前を属性名にすることは できません。そのため、ここでは名前が正規のものとして受けつけられるように アンダースコアを後につけてあります、そのため `else_` は `else` のかわりです。)

`if` 文はもっとこみ入っています。なぜならこれは いくつもの条件判定を含む可能性があるからです。

    if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]

`If` ノードでは、`tests` および `else_` の 2つだけの属性が定義されています。`tests` 属性には条件式とその後の動作の タプルがリスト形式で入っています。おのおのの `if`/`elif` 節ごとに 1タプルです。各タプルの最初の要素は条件式で、2番目の要素はもしその式が 真ならば実行されるコードをふくんだ `Stmt` ノードになっています。

`If` の `getChildren()` メソッドは、 子ノードの平らなリストを返します。`if`/`elif` 節が 3つあって `else` 節がない場合なら、`getChildren()` は 6要素のリストを 返すでしょう: 最初の条件式、最初の `Stmt`、2番目の条件式…といった具合です。

以下の表は `compiler.ast` で定義されている `Node` サブクラスと、 それらのインスタンスに対して使用可能なパブリックな属性です。 ほとんどの属性の値じたいは `Node` インスタンスか、インスタンスのリストです。 この値がインスタンス型以外の場合、その型は備考の中で記されています。 これら属性の順序は、 `getChildren()` および `getChildNodes()` が返す順です。

ノードの型 | 属性 | 値
--- | --- | ---

`Add` | `left` | 左側の項
`` | `right` | 右側の項

`And` | `nodes` | 項のリスト

`AssAttr` |  | 代入先をあらわす属性
`` | `expr` | ドット(.) の左側の式
`` | `attrname` | 属性名をあらわす文字列
`` | `flags` | XXX

`AssList` | `nodes` | 代入先のリスト要素のリスト

`AssName` | `name` | 代入先の名前
`` | `flags` | XXX

`AssTuple` | `nodes` | 代入先のタプル要素のリスト

`Assert` | `test` | 検査される条件式
`` | `fail` | `AssertionError` の値

`Assign` | `nodes` | 代入先のリスト、代入記号(=)ごとにひとつ
`` | `expr` | 代入する値

`AugAssign` | `node` |
`` | `op` |
`` | `expr` |

`Backquote` | `expr` |

`Bitand` | `nodes` |

`Bitor` | `nodes` |

`Bitxor` | `nodes` |

`Break` |  |

`CallFunc` | `node` | 呼ばれる側をあらわす式
`` | `args` | 引数のリスト
`` | `star_args` | *-arg 拡張引数の値
`` | `dstar_args` | **-arg 拡張引数の値

`Class` | `name` | クラス名をあらわす文字列
`` | `bases` | 基底クラスのリスト
`` | `doc` | doc string、文字列あるいは `None`
`` | `code` | クラス文の本体

`Compare` | `expr` |
`` | `ops` |

`Const` | `value` |

`Continue` |  |

`Dict` | `items` |

`Discard` | `expr` |

`Div` | `left` |
`` | `right` |

`Ellipsis` |  |

`Exec` | `expr` |
`` | `locals` |
`` | `globals` |

`For` | `assign` |
`` | `list` |
`` | `body` |
`` | `else_` |

`From` | `modname` |
`` | `names` |

`Function` | `name` | def で定義される名前をあらわす文字列
`` | `argnames` | 引数をあわらす文字列のリスト
`` | `defaults` | デフォルト値のリスト
`` | `flags` | xxx
`` | `doc` | doc string、文字列あるいは `None`
`` | `code` | 関数の本体

`Getattr` | `expr` |
`` | `attrname` |

`Global` | `names` |

`If` | `tests` |
`` | `else_` |

`Import` | `names` |

`Invert` | `expr` |

`Keyword` | `name` |
`` | `expr` |

`Lambda` | `argnames` |
`` | `defaults` |
`` | `flags` |
`` | `code` |

`LeftShift` | `left` |
`` | `right` |

`List` | `nodes` |

`ListComp` | `expr` |
`` | `quals` |

`ListCompFor` | `assign` |
`` | `list` |
`` | `ifs` |

`ListCompIf` | `test` |

`Mod` | `left` |
`` | `right` |

`Module` | `doc` | doc string、文字列あるいは `None`
`` | `node` | モジュール本体、`Stmt` インスタンス

`Mul` | `left` |
`` | `right` |

`Name` | `name` |

`Not` | `expr` |

`Or` | `nodes` |

`Pass` |  |

`Power` | `left` |
`` | `right` |

`Print` | `nodes` |
`` | `dest` |

`Printnl` | `nodes` |
`` | `dest` |

`Raise` | `expr1` |
`` | `expr2` |
`` | `expr3` |

`Return` | `value` |

`RightShift` | `left` |
`` | `right` |

`Slice` | `expr` |
`` | `flags` |
`` | `lower` |
`` | `upper` |

`Sliceobj` | `nodes` | 文のリスト

`Stmt` | `nodes` |

`Sub` | `left` |
`` | `right` |

`Subscript` | `expr` |
`` | `flags` |
`` | `subs` |

`TryExcept` | `body` |
`` | `handlers` |
`` | `else_` |

`TryFinally` | `body` |
`` | `final` |

`Tuple` | `nodes` |

`UnaryAdd` | `expr` |

`UnarySub` | `expr` |

`While` | `test` |
`` | `body` |
`` | `else_` |

`Yield` | `value` |