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つの属性をもっています: 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    
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  

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