19.3.1 AST ノード

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

クラス 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つの属性をもっています: testbody、 および 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 ノードになっています。

IfgetChildren() メソッドは、 子ノードの平らなリストを返します。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 DecoratorsNone
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
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

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。