% libparser.tex
%
% Introductory documentation for the new parser built-in module.
%
% Copyright 1995 Virginia Polytechnic Institute and State University
% and Fred L. Drake, Jr.  This copyright notice must be distributed on
% all copies, but this document otherwise may be distributed as part
% of the Python distribution.  No fee may be charged for this document
% in any representation, either on paper or electronically.  This
% restriction does not affect other elements in a distributed package
% in any way.
%

\section{Built-in Module \sectcode{parser}}
\bimodindex{parser}

The \code{parser} module provides an interface to Python's internal
parser and byte-code compiler.  The primary purpose for this interface
is to allow Python code to edit the parse tree of a Python expression
and create executable code from this.  This is better than trying
to parse and modify an arbitrary Python code fragment as a string
because parsing is performed in a manner identical to the code
forming the application.  It is also faster.

There are a few things to note about this module which are important
to making use of the data structures created.  This is not a tutorial
on editing the parse trees for Python code, but some examples of using
the \code{parser} module are presented.

Most importantly, a good understanding of the Python grammar processed
by the internal parser is required.  For full information on the
language syntax, refer to the Language Reference.  The parser itself
is created from a grammar specification defined in the file
\file{Grammar/Grammar} in the standard Python distribution.  The parse
trees stored in the ``AST objects'' created by this module are the
actual output from the internal parser when created by the
\code{expr()} or \code{suite()} functions, described below.  The AST
objects created by \code{sequence2ast()} faithfully simulate those
structures.  Be aware that the values of the sequences which are
considered ``correct'' will vary from one version of Python to another
as the formal grammar for the language is revised.  However,
transporting code from one Python version to another as source text
will always allow correct parse trees to be created in the target
version, with the only restriction being that migrating to an older
version of the interpreter will not support more recent language
constructs.  The parse trees are not typically compatible from one
version to another, whereas source code has always been
forward-compatible.

Each element of the sequences returned by \code{ast2list} or
\code{ast2tuple()} has a simple form.  Sequences representing
non-terminal elements in the grammar always have a length greater than
one.  The first element is an integer which identifies a production in
the grammar.  These integers are given symbolic names in the C header
file \file{Include/graminit.h} and the Python module
\file{Lib/symbol.py}.  Each additional element of the sequence represents
a component of the production as recognized in the input string: these
are always sequences which have the same form as the parent.  An
important aspect of this structure which should be noted is that
keywords used to identify the parent node type, such as the keyword
\code{if} in an \code{if_stmt}, are included in the node tree without
any special treatment.  For example, the \code{if} keyword is
represented by the tuple \code{(1, 'if')}, where \code{1} is the
numeric value associated with all \code{NAME} tokens, including
variable and function names defined by the user.  In an alternate form
returned when line number information is requested, the same token
might be represented as \code{(1, 'if', 12)}, where the \code{12}
represents the line number at which the terminal symbol was found.

Terminal elements are represented in much the same way, but without
any child elements and the addition of the source text which was
identified.  The example of the \code{if} keyword above is
representative.  The various types of terminal symbols are defined in
the C header file \file{Include/token.h} and the Python module
\file{Lib/token.py}.

The AST objects are not required to support the functionality of this
module, but are provided for three purposes: to allow an application
to amortize the cost of processing complex parse trees, to provide a
parse tree representation which conserves memory space when compared
to the Python list or tuple representation, and to ease the creation
of additional modules in C which manipulate parse trees.  A simple
``wrapper'' class may be created in Python to hide the use of AST
objects; the \code{AST} library module provides a variety of such
classes.

The \code{parser} module defines functions for a few distinct
purposes.  The most important purposes are to create AST objects and
to convert AST objects to other representations such as parse trees
and compiled code objects, but there are also functions which serve to
query the type of parse tree represented by an AST object.

\renewcommand{\indexsubitem}{(in module parser)}


\subsection{Creating AST Objects}

AST objects may be created from source code or from a parse tree.
When creating an AST object from source, different functions are used
to create the \code{'eval'} and \code{'exec'} forms.

\begin{funcdesc}{expr}{string}
The \code{expr()} function parses the parameter \code{\var{string}}
as if it were an input to \code{compile(\var{string}, 'eval')}.  If
the parse succeeds, an AST object is created to hold the internal
parse tree representation, otherwise an appropriate exception is
thrown.
\end{funcdesc}

\begin{funcdesc}{suite}{string}
The \code{suite()} function parses the parameter \code{\var{string}}
as if it were an input to \code{compile(\var{string}, 'exec')}.  If
the parse succeeds, an AST object is created to hold the internal
parse tree representation, otherwise an appropriate exception is
thrown.
\end{funcdesc}

\begin{funcdesc}{sequence2ast}{sequence}
This function accepts a parse tree represented as a sequence and
builds an internal representation if possible.  If it can validate
that the tree conforms to the Python grammar and all nodes are valid
node types in the host version of Python, an AST object is created
from the internal representation and returned to the called.  If there
is a problem creating the internal representation, or if the tree
cannot be validated, a \code{ParserError} exception is thrown.  An AST
object created this way should not be assumed to compile correctly;
normal exceptions thrown by compilation may still be initiated when
the AST object is passed to \code{compileast()}.  This may indicate
problems not related to syntax (such as a \code{MemoryError}
exception), but may also be due to constructs such as the result of
parsing \code{del f(0)}, which escapes the Python parser but is
checked by the bytecode compiler.

Sequences representing terminal tokens may be represented as either
two-element lists of the form \code{(1, 'name')} or as three-element
lists of the form \code{(1, 'name', 56)}.  If the third element is
present, it is assumed to be a valid line number.  The line number
may be specified for any subset of the terminal symbols in the input
tree.
\end{funcdesc}

\begin{funcdesc}{tuple2ast}{sequence}
This is the same function as \code{sequence2ast()}.  This entry point
is maintained for backward compatibility.
\end{funcdesc}


\subsection{Converting AST Objects}

AST objects, regardless of the input used to create them, may be
converted to parse trees represented as list- or tuple- trees, or may
be compiled into executable code objects.  Parse trees may be
extracted with or without line numbering information.

\begin{funcdesc}{ast2list}{ast\optional{\, line_info\code{ = 0}}}
This function accepts an AST object from the caller in
\code{\var{ast}} and returns a Python list representing the
equivelent parse tree.  The resulting list representation can be used
for inspection or the creation of a new parse tree in list form.  This
function does not fail so long as memory is available to build the
list representation.  If the parse tree will only be used for
inspection, \code{ast2tuple()} should be used instead to reduce memory
consumption and fragmentation.  When the list representation is
required, this function is significantly faster than retrieving a
tuple representation and converting that to nested lists.

If \code{\var{line_info}} is true, line number information will be
included for all terminal tokens as a third element of the list
representing the token.  Note that the line number provided specifies
the line on which the token \emph{ends\/}.  This information is
omitted if the flag is false or omitted.
\end{funcdesc}

\begin{funcdesc}{ast2tuple}{ast\optional{\, line_info\code{ = 0}}}
This function accepts an AST object from the caller in
\code{\var{ast}} and returns a Python tuple representing the
equivelent parse tree.  Other than returning a tuple instead of a
list, this function is identical to \code{ast2list()}.

If \code{\var{line_info}} is true, line number information will be
included for all terminal tokens as a third element of the list
representing the token.  This information is omitted if the flag is
false or omitted.
\end{funcdesc}

\begin{funcdesc}{compileast}{ast\optional{\, filename\code{ = '<ast>'}}}
The Python byte compiler can be invoked on an AST object to produce
code objects which can be used as part of an \code{exec} statement or
a call to the built-in \code{eval()} function.  This function provides
the interface to the compiler, passing the internal parse tree from
\code{\var{ast}} to the parser, using the source file name specified
by the \code{\var{filename}} parameter.  The default value supplied
for \code{\var{filename}} indicates that the source was an AST object.

Compiling an AST object may result in exceptions related to
compilation; an example would be a \code{SyntaxError} caused by the
parse tree for \code{del f(0)}: this statement is considered legal
within the formal grammar for Python but is not a legal language
construct.  The \code{SyntaxError} raised for this condition is
actually generated by the Python byte-compiler normally, which is why
it can be raised at this point by the \code{parser} module.  Most
causes of compilation failure can be diagnosed programmatically by
inspection of the parse tree.
\end{funcdesc}


\subsection{Queries on AST Objects}

Two functions are provided which allow an application to determine if
an AST was create as an expression or a suite.  Neither of these
functions can be used to determine if an AST was created from source
code via \code{expr()} or \code{suite()} or from a parse tree via
\code{sequence2ast()}.

\begin{funcdesc}{isexpr}{ast}
When \code{\var{ast}} represents an \code{'eval'} form, this function
returns a true value (\code{1}), otherwise it returns false
(\code{0}).  This is useful, since code objects normally cannot be
queried for this information using existing built-in functions.  Note
that the code objects created by \code{compileast()} cannot be queried
like this either, and are identical to those created by the built-in
\code{compile()} function.
\end{funcdesc}


\begin{funcdesc}{issuite}{ast}
This function mirrors \code{isexpr()} in that it reports whether an
AST object represents an \code{'exec'} form, commonly known as a
``suite.''  It is not safe to assume that this function is equivelent
to \code{not isexpr(\var{ast})}, as additional syntactic fragments may
be supported in the future.
\end{funcdesc}


\subsection{Exceptions and Error Handling}

The parser module defines a single exception, but may also pass other
built-in exceptions from other portions of the Python runtime
environment.  See each function for information about the exceptions
it can raise.

\begin{excdesc}{ParserError}
Exception raised when a failure occurs within the parser module.  This
is generally produced for validation failures rather than the built in
\code{SyntaxError} thrown during normal parsing.
The exception argument is either a string describing the reason of the
failure or a tuple containing a sequence causing the failure from a parse
tree passed to \code{sequence2ast()} and an explanatory string.  Calls to
\code{sequence2ast()} need to be able to handle either type of exception,
while calls to other functions in the module will only need to be
aware of the simple string values.
\end{excdesc}

Note that the functions \code{compileast()}, \code{expr()}, and
\code{suite()} may throw exceptions which are normally thrown by the
parsing and compilation process.  These include the built in
exceptions \code{MemoryError}, \code{OverflowError},
\code{SyntaxError}, and \code{SystemError}.  In these cases, these
exceptions carry all the meaning normally associated with them.  Refer
to the descriptions of each function for detailed information.


\subsection{AST Objects}

AST objects returned by \code{expr()}, \code{suite()}, and
\code{sequence2ast()} have no methods of their own.
Some of the functions defined which accept an AST object as their
first argument may change to object methods in the future.  The type
of these objects is available as \code{ASTType} in the module.

Ordered and equality comparisons are supported between AST objects.


\subsection{Examples}
\nodename{AST Examples}

The parser modules allows operations to be performed on the parse tree
of Python source code before the bytecode is generated, and provides
for inspection of the parse tree for information gathering purposes.
Two examples are presented.  The simple example demonstrates emulation
of the \code{compile()} built-in function and the complex example
shows the use of a parse tree for information discovery.

\subsubsection{Emulation of \sectcode{compile()}}

While many useful operations may take place between parsing and
bytecode generation, the simplest operation is to do nothing.  For
this purpose, using the \code{parser} module to produce an
intermediate data structure is equivelent to the code

\bcode\begin{verbatim}
>>> code = compile('a + 5', 'eval')
>>> a = 5
>>> eval(code)
10
\end{verbatim}\ecode
%
The equivelent operation using the \code{parser} module is somewhat
longer, and allows the intermediate internal parse tree to be retained
as an AST object:

\bcode\begin{verbatim}
>>> import parser
>>> ast = parser.expr('a + 5')
>>> code = parser.compileast(ast)
>>> a = 5
>>> eval(code)
10
\end{verbatim}\ecode
%
An application which needs both AST and code objects can package this
code into readily available functions:

\bcode\begin{verbatim}
import parser

def load_suite(source_string):
    ast = parser.suite(source_string)
    code = parser.compileast(ast)
    return ast, code

def load_expression(source_string):
    ast = parser.expr(source_string)
    code = parser.compileast(ast)
    return ast, code
\end{verbatim}\ecode
%
\subsubsection{Information Discovery}

Some applications benefit from direct access to the parse tree.  The
remainder of this section demonstrates how the parse tree provides
access to module documentation defined in docstrings without requiring
that the code being examined be loaded into a running interpreter via
\code{import}.  This can be very useful for performing analyses of
untrusted code.

Generally, the example will demonstrate how the parse tree may be
traversed to distill interesting information.  Two functions and a set
of classes are developed which provide programmatic access to high
level function and class definitions provided by a module.  The
classes extract information from the parse tree and provide access to
the information at a useful semantic level, one function provides a
simple low-level pattern matching capability, and the other function
defines a high-level interface to the classes by handling file
operations on behalf of the caller.  All source files mentioned here
which are not part of the Python installation are located in the
\file{Demo/parser/} directory of the distribution.

The dynamic nature of Python allows the programmer a great deal of
flexibility, but most modules need only a limited measure of this when
defining classes, functions, and methods.  In this example, the only
definitions that will be considered are those which are defined in the
top level of their context, e.g., a function defined by a \code{def}
statement at column zero of a module, but not a function defined
within a branch of an \code{if} ... \code{else} construct, though
there are some good reasons for doing so in some situations.  Nesting
of definitions will be handled by the code developed in the example.

To construct the upper-level extraction methods, we need to know what
the parse tree structure looks like and how much of it we actually
need to be concerned about.  Python uses a moderately deep parse tree
so there are a large number of intermediate nodes.  It is important to
read and understand the formal grammar used by Python.  This is
specified in the file \file{Grammar/Grammar} in the distribution.
Consider the simplest case of interest when searching for docstrings:
a module consisting of a docstring and nothing else.  (See file
\file{docstring.py}.)

\bcode\begin{verbatim}
"""Some documentation.
"""
\end{verbatim}\ecode
%
Using the interpreter to take a look at the parse tree, we find a
bewildering mass of numbers and parentheses, with the documentation
buried deep in nested tuples.

\bcode\begin{verbatim}
>>> import parser
>>> import pprint
>>> ast = parser.suite(open('docstring.py').read())
>>> tup = parser.ast2tuple(ast)
>>> pprint.pprint(tup)
(257,
 (264,
  (265,
   (266,
    (267,
     (307,
      (287,
       (288,
        (289,
         (290,
          (292,
           (293,
            (294,
             (295,
              (296,
               (297,
                (298,
                 (299,
                  (300, (3, '"""Some documentation.\012"""'))))))))))))))))),
   (4, ''))),
 (4, ''),
 (0, ''))
\end{verbatim}\ecode
%
The numbers at the first element of each node in the tree are the node
types; they map directly to terminal and non-terminal symbols in the
grammar.  Unfortunately, they are represented as integers in the
internal representation, and the Python structures generated do not
change that.  However, the \code{symbol} and \code{token} modules
provide symbolic names for the node types and dictionaries which map
from the integers to the symbolic names for the node types.

In the output presented above, the outermost tuple contains four
elements: the integer \code{257} and three additional tuples.  Node
type \code{257} has the symbolic name \code{file_input}.  Each of
these inner tuples contains an integer as the first element; these
integers, \code{264}, \code{4}, and \code{0}, represent the node types
\code{stmt}, \code{NEWLINE}, and \code{ENDMARKER}, respectively.
Note that these values may change depending on the version of Python
you are using; consult \file{symbol.py} and \file{token.py} for
details of the mapping.  It should be fairly clear that the outermost
node is related primarily to the input source rather than the contents
of the file, and may be disregarded for the moment.  The \code{stmt}
node is much more interesting.  In particular, all docstrings are
found in subtrees which are formed exactly as this node is formed,
with the only difference being the string itself.  The association
between the docstring in a similar tree and the defined entity (class,
function, or module) which it describes is given by the position of
the docstring subtree within the tree defining the described
structure.

By replacing the actual docstring with something to signify a variable
component of the tree, we allow a simple pattern matching approach to
check any given subtree for equivelence to the general pattern for
docstrings.  Since the example demonstrates information extraction, we
can safely require that the tree be in tuple form rather than list
form, allowing a simple variable representation to be
\code{['variable_name']}.  A simple recursive function can implement
the pattern matching, returning a boolean and a dictionary of variable
name to value mappings.  (See file \file{example.py}.)

\bcode\begin{verbatim}
from types import ListType, TupleType

def match(pattern, data, vars=None):
    if vars is None:
        vars = {}
    if type(pattern) is ListType:
        vars[pattern[0]] = data
        return 1, vars
    if type(pattern) is not TupleType:
        return (pattern == data), vars
    if len(data) != len(pattern):
        return 0, vars
    for pattern, data in map(None, pattern, data):
        same, vars = match(pattern, data, vars)
        if not same:
            break
    return same, vars
\end{verbatim}\ecode
%
Using this simple representation for syntactic variables and the symbolic
node types, the pattern for the candidate docstring subtrees becomes
fairly readable.  (See file \file{example.py}.)

\bcode\begin{verbatim}
import symbol
import token

DOCSTRING_STMT_PATTERN = (
    symbol.stmt,
    (symbol.simple_stmt,
     (symbol.small_stmt,
      (symbol.expr_stmt,
       (symbol.testlist,
        (symbol.test,
         (symbol.and_test,
          (symbol.not_test,
           (symbol.comparison,
            (symbol.expr,
             (symbol.xor_expr,
              (symbol.and_expr,
               (symbol.shift_expr,
                (symbol.arith_expr,
                 (symbol.term,
                  (symbol.factor,
                   (symbol.power,
                    (symbol.atom,
                     (token.STRING, ['docstring'])
                     )))))))))))))))),
     (token.NEWLINE, '')
     ))
\end{verbatim}\ecode
%
Using the \code{match()} function with this pattern, extracting the
module docstring from the parse tree created previously is easy:

\bcode\begin{verbatim}
>>> found, vars = match(DOCSTRING_STMT_PATTERN, tup[1])
>>> found
1
>>> vars
{'docstring': '"""Some documentation.\012"""'}
\end{verbatim}\ecode
%
Once specific data can be extracted from a location where it is
expected, the question of where information can be expected
needs to be answered.  When dealing with docstrings, the answer is
fairly simple: the docstring is the first \code{stmt} node in a code
block (\code{file_input} or \code{suite} node types).  A module
consists of a single \code{file_input} node, and class and function
definitions each contain exactly one \code{suite} node.  Classes and
functions are readily identified as subtrees of code block nodes which
start with \code{(stmt, (compound_stmt, (classdef, ...} or
\code{(stmt, (compound_stmt, (funcdef, ...}.  Note that these subtrees
cannot be matched by \code{match()} since it does not support multiple
sibling nodes to match without regard to number.  A more elaborate
matching function could be used to overcome this limitation, but this
is sufficient for the example.

Given the ability to determine whether a statement might be a
docstring and extract the actual string from the statement, some work
needs to be performed to walk the parse tree for an entire module and
extract information about the names defined in each context of the
module and associate any docstrings with the names.  The code to
perform this work is not complicated, but bears some explanation.

The public interface to the classes is straightforward and should
probably be somewhat more flexible.  Each ``major'' block of the
module is described by an object providing several methods for inquiry
and a constructor which accepts at least the subtree of the complete
parse tree which it represents.  The \code{ModuleInfo} constructor
accepts an optional \code{\var{name}} parameter since it cannot
otherwise determine the name of the module.

The public classes include \code{ClassInfo}, \code{FunctionInfo},
and \code{ModuleInfo}.  All objects provide the
methods \code{get_name()}, \code{get_docstring()},
\code{get_class_names()}, and \code{get_class_info()}.  The
\code{ClassInfo} objects support \code{get_method_names()} and
\code{get_method_info()} while the other classes provide
\code{get_function_names()} and \code{get_function_info()}.

Within each of the forms of code block that the public classes
represent, most of the required information is in the same form and is
accessed in the same way, with classes having the distinction that
functions defined at the top level are referred to as ``methods.''
Since the difference in nomenclature reflects a real semantic
distinction from functions defined outside of a class, the
implementation needs to maintain the distinction.
Hence, most of the functionality of the public classes can be
implemented in a common base class, \code{SuiteInfoBase}, with the
accessors for function and method information provided elsewhere.
Note that there is only one class which represents function and method
information; this parallels the use of the \code{def} statement to
define both types of elements.

Most of the accessor functions are declared in \code{SuiteInfoBase}
and do not need to be overriden by subclasses.  More importantly, the
extraction of most information from a parse tree is handled through a
method called by the \code{SuiteInfoBase} constructor.  The example
code for most of the classes is clear when read alongside the formal
grammar, but the method which recursively creates new information
objects requires further examination.  Here is the relevant part of
the \code{SuiteInfoBase} definition from \file{example.py}:

\bcode\begin{verbatim}
class SuiteInfoBase:
    _docstring = ''
    _name = ''

    def __init__(self, tree = None):
        self._class_info = {}
        self._function_info = {}
        if tree:
            self._extract_info(tree)

    def _extract_info(self, tree):
        # extract docstring
        if len(tree) == 2:
            found, vars = match(DOCSTRING_STMT_PATTERN[1], tree[1])
        else:
            found, vars = match(DOCSTRING_STMT_PATTERN, tree[3])
        if found:
            self._docstring = eval(vars['docstring'])
        # discover inner definitions
        for node in tree[1:]:
            found, vars = match(COMPOUND_STMT_PATTERN, node)
            if found:
                cstmt = vars['compound']
                if cstmt[0] == symbol.funcdef:
                    name = cstmt[2][1]
                    self._function_info[name] = FunctionInfo(cstmt)
                elif cstmt[0] == symbol.classdef:
                    name = cstmt[2][1]
                    self._class_info[name] = ClassInfo(cstmt)
\end{verbatim}\ecode
%
After initializing some internal state, the constructor calls the
\code{_extract_info()} method.  This method performs the bulk of the
information extraction which takes place in the entire example.  The
extraction has two distinct phases: the location of the docstring for
the parse tree passed in, and the discovery of additional definitions
within the code block represented by the parse tree.

The initial \code{if} test determines whether the nested suite is of
the ``short form'' or the ``long form.''  The short form is used when
the code block is on the same line as the definition of the code
block, as in

\bcode\begin{verbatim}
def square(x): "Square an argument."; return x ** 2
\end{verbatim}\ecode
%
while the long form uses an indented block and allows nested
definitions:

\bcode\begin{verbatim}
def make_power(exp):
    "Make a function that raises an argument to the exponent `exp'."
    def raiser(x, y=exp):
        return x ** y
    return raiser
\end{verbatim}\ecode
%
When the short form is used, the code block may contain a docstring as
the first, and possibly only, \code{small_stmt} element.  The
extraction of such a docstring is slightly different and requires only
a portion of the complete pattern used in the more common case.  As
implemented, the docstring will only be found if there is only
one \code{small_stmt} node in the \code{simple_stmt} node.  Since most
functions and methods which use the short form do not provide a
docstring, this may be considered sufficient.  The extraction of the
docstring proceeds using the \code{match()} function as described
above, and the value of the docstring is stored as an attribute of the
\code{SuiteInfoBase} object.

After docstring extraction, a simple definition discovery
algorithm operates on the \code{stmt} nodes of the \code{suite} node.  The
special case of the short form is not tested; since there are no
\code{stmt} nodes in the short form, the algorithm will silently skip
the single \code{simple_stmt} node and correctly not discover any
nested definitions.

Each statement in the code block is categorized as
a class definition, function or method definition, or
something else.  For the definition statements, the name of the
element defined is extracted and a representation object
appropriate to the definition is created with the defining subtree
passed as an argument to the constructor.  The repesentation objects
are stored in instance variables and may be retrieved by name using
the appropriate accessor methods.

The public classes provide any accessors required which are more
specific than those provided by the \code{SuiteInfoBase} class, but
the real extraction algorithm remains common to all forms of code
blocks.  A high-level function can be used to extract the complete set
of information from a source file.  (See file \file{example.py}.)

\bcode\begin{verbatim}
def get_docs(fileName):
    source = open(fileName).read()
    import os
    basename = os.path.basename(os.path.splitext(fileName)[0])
    import parser
    ast = parser.suite(source)
    tup = parser.ast2tuple(ast)
    return ModuleInfo(tup, basename)
\end{verbatim}\ecode
%
This provides an easy-to-use interface to the documentation of a
module.  If information is required which is not extracted by the code
of this example, the code may be extended at clearly defined points to
provide additional capabilities.


%%
%%  end of file
