summaryrefslogtreecommitdiffstats
path: root/Doc/lib
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2006-02-27 15:23:19 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2006-02-27 15:23:19 (GMT)
commit577b5b960d33c822f95c142e6be6dc0c819d529e (patch)
tree9f6aae1642492ae5d60b465226b1c80e5b59184c /Doc/lib
parent2086eaf79c9dc2992fef64392a9813e25f60696f (diff)
downloadcpython-577b5b960d33c822f95c142e6be6dc0c819d529e.zip
cpython-577b5b960d33c822f95c142e6be6dc0c819d529e.tar.gz
cpython-577b5b960d33c822f95c142e6be6dc0c819d529e.tar.bz2
Create _ast module.
Cleanup Python-ast.c generation.
Diffstat (limited to 'Doc/lib')
-rw-r--r--Doc/lib/lib.tex1
-rw-r--r--Doc/lib/libast.tex46
2 files changed, 47 insertions, 0 deletions
diff --git a/Doc/lib/lib.tex b/Doc/lib/lib.tex
index 44e7c96..fad8fe7 100644
--- a/Doc/lib/lib.tex
+++ b/Doc/lib/lib.tex
@@ -416,6 +416,7 @@ and how to embed it in other applications.
\input{distutils}
\input{compiler} % compiler package
+\input{libast}
\input{libmisc} % Miscellaneous Services
\input{libformatter}
diff --git a/Doc/lib/libast.tex b/Doc/lib/libast.tex
new file mode 100644
index 0000000..9fdd4fb
--- /dev/null
+++ b/Doc/lib/libast.tex
@@ -0,0 +1,46 @@
+% XXX Label can't be _ast?
+% XXX Where should this section/chapter go?
+\chapter{Abstract Syntax Trees\label{ast}}
+
+\sectionauthor{Martin v. L\"owis}{martin@v.loewis.de}
+
+The \code{_ast} module helps Python applications to process
+trees of the Python abstract syntax grammar. The Python compiler
+currently provides read-only access to such trees, meaning that
+applications can only create a tree for a given piece of Python
+source code; generating byte code from a (potentially modified)
+tree is not supported. The abstract syntax itself might change with
+each Python release; this module helps to find out programmatically
+what the current grammar looks like.
+
+An abstract syntax tree can be generated by passing \code{_ast.PyCF_ONLY_AST}
+as a flag to the \function{compile} builtin function. The result will be a tree
+of objects whose classes all inherit from \code{_ast.AST}.
+
+The actual classes are derived from the \code{Parser/Python.asdl} file,
+which is reproduced below. There is one class defined for each left-hand
+side symbol in the abstract grammar (for example, \code{_ast.stmt} or \code{_ast.expr}).
+In addition, there is one class defined for each constructor on the
+right-hand side; these classes inherit from the classes for the left-hand
+side trees. For example, \code{_ast.BinOp} inherits from \code{_ast.expr}.
+For production rules with alternatives (aka "sums"), the left-hand side
+class is abstract: only instances of specific constructor nodes are ever
+created.
+
+Each concrete class has an attribute \code{_fields} which gives the
+names of all child nodes.
+
+Each instance of a concrete class has one attribute for each child node,
+of the type as defined in the grammar. For example, \code{_ast.BinOp}
+instances have an attribute \code{left} of type \code{_ast.expr}.
+
+If these attributes are marked as optional in the grammar (using a
+question mark), the value might be \code{None}. If the attributes
+can have zero-or-more values (marked with an asterisk), the
+values are represented as Python lists.
+
+\subsection{Abstract Grammar}
+
+The abstract grammar is currently defined as follows:
+
+\verbatiminput{../../Parser/Python.asdl} \ No newline at end of file