compiler.ast モジュールは、各ノードのタイプとその要素を記述した テキストファイルからつくられます。各ノードのタイプはクラスとして表現され、 そのクラスは抽象基底クラス compiler.ast.Node を継承し 子ノードの名前属性を定義しています。
| ) |
Node インスタンスはパーザジェネレータによって自動的に作成されます。 ある特定の Node インスタンスに対する推奨されるインターフェイスとは、 子ノードにアクセスするために public な (訳注: 公開された) 属性を使うことです。 public な属性は単一のノード、あるいは一連のノードのシーケンスに 束縛されている (訳注: バインドされている) かもしれませんが、 これは Node のタイプによって違います。 たとえば Class ノードの bases 属性は 基底クラスのノードのリストに束縛されており、doc 属性は 単一のノードのみに束縛されている、といった具合です。
各 Node インスタンスは lineno 属性をもっており、
これは None かもしれません。
XXX どういったノードが使用可能な lineno をもっているかの規則は定かではない。
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 | ||
| Decorators | nodes | 関数のデコレータ表現のリスト |
| Dict | items | |
| Discard | expr | |
| Div | left | |
| right | ||
| Ellipsis | ||
| Exec | expr | |
| locals | ||
| globals | ||
| For | assign | |
| list | ||
| body | ||
| else_ | ||
| From | modname | |
| names | ||
| Function | decorators | Decorators か None |
| name | def で定義される名前をあらわす文字列 | |
| Function | name | |
| 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 | ||
| 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 |
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。