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