## 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` |