19.3.1 AST Nodes

The compiler.ast module is generated from a text file that describes each node type and its elements. Each node type is represented as a class that inherits from the abstract base class compiler.ast.Node and defines a set of named attributes for child nodes.

class Node()

The Node instances are created automatically by the parser generator. The recommended interface for specific Node instances is to use the public attributes to access child nodes. A public attribute may be bound to a single node or to a sequence of nodes, depending on the Node type. For example, the bases attribute of the Class node, is bound to a list of base class nodes, and the doc attribute is bound to a single node.

Each Node instance has a lineno attribute which may be None. XXX Not sure what the rules are for which nodes will have a useful lineno.

All Node objects offer the following methods:

getChildren()
Returns a flattened list of the child nodes and objects in the order they occur. Specifically, the order of the nodes is the order in which they appear in the Python grammar. Not all of the children are Node instances. The names of functions and classes, for example, are plain strings.

getChildNodes()
Returns a flattened list of the child nodes in the order they occur. This method is like getChildren(), except that it only returns those children that are Node instances.

Two examples illustrate the general structure of Node classes. The while statement is defined by the following grammar production:

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

The While node has three attributes: test, body, and else_. (If the natural name for an attribute is also a Python reserved word, it can't be used as an attribute name. An underscore is appended to the word to make it a legal identifier, hence else_ instead of else.)

The if statement is more complicated because it can include several tests.

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

The If node only defines two attributes: tests and else_. The tests attribute is a sequence of test expression, consequent body pairs. There is one pair for each if/elif clause. The first element of the pair is the test expression. The second elements is a Stmt node that contains the code to execute if the test is true.

The getChildren() method of If returns a flat list of child nodes. If there are three if/elif clauses and no else clause, then getChildren() will return a list of six elements: the first test expression, the first Stmt, the second text expression, etc.

The following table lists each of the Node subclasses defined in compiler.ast and each of the public attributes available on their instances. The values of most of the attributes are themselves Node instances or sequences of instances. When the value is something other than an instance, the type is noted in the comment. The attributes are listed in the order in which they are returned by getChildren() and getChildNodes().

Node type  Attribute  Value 
Add left left operand
  right right operand
And nodes list of operands
AssAttr attribute as target of assignment
  expr expression on the left-hand side of the dot
  attrname the attribute name, a string
  flags XXX
AssList nodes list of list elements being assigned to
AssName name name being assigned to
  flags XXX
AssTuple nodes list of tuple elements being assigned to
Assert test the expression to be tested
  fail the value of the AssertionError
Assign nodes a list of assignment targets, one per equal sign
  expr the value being assigned
AugAssign node  
  op  
  expr  
Backquote expr  
Bitand nodes  
Bitor nodes  
Bitxor nodes  
Break  
CallFunc node expression for the callee
  args a list of arguments
  star_args the extended *-arg value
  dstar_args the extended **-arg value
Class name the name of the class, a string
  bases a list of base classes
  doc doc string, a string or None
  code the body of the class statement
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 name used in def, a string
  argnames list of argument names, as strings
  defaults list of default values
  flags xxx
  doc doc string, a string or None
  code the body of the function
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, a string or None
  node body of the module, a 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 list of statements
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  

See About this document... for information on suggesting changes.