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.