summaryrefslogtreecommitdiffstats
path: root/Doc/ref/ref.tex
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1991-11-21 13:53:03 (GMT)
committerGuido van Rossum <guido@python.org>1991-11-21 13:53:03 (GMT)
commitf2612d1edf7146ed7e70d6023693032f0a86b881 (patch)
tree632bed0d6280cd67bd6047d73149c5bc85d0f895 /Doc/ref/ref.tex
parentc67eecf64d43caaa4957808d79d1f817a3d1b295 (diff)
downloadcpython-f2612d1edf7146ed7e70d6023693032f0a86b881.zip
cpython-f2612d1edf7146ed7e70d6023693032f0a86b881.tar.gz
cpython-f2612d1edf7146ed7e70d6023693032f0a86b881.tar.bz2
Initial revision
Diffstat (limited to 'Doc/ref/ref.tex')
-rw-r--r--Doc/ref/ref.tex1020
1 files changed, 1020 insertions, 0 deletions
diff --git a/Doc/ref/ref.tex b/Doc/ref/ref.tex
new file mode 100644
index 0000000..6af7535
--- /dev/null
+++ b/Doc/ref/ref.tex
@@ -0,0 +1,1020 @@
+% Format this file with latex.
+
+\documentstyle[myformat]{report}
+
+\title{\bf
+ Python Reference Manual \\
+ {\em Incomplete Draft}
+}
+
+\author{
+ Guido van Rossum \\
+ Dept. CST, CWI, Kruislaan 413 \\
+ 1098 SJ Amsterdam, The Netherlands \\
+ E-mail: {\tt guido@cwi.nl}
+}
+
+\begin{document}
+
+\pagenumbering{roman}
+
+\maketitle
+
+\begin{abstract}
+
+\noindent
+Python is a simple, yet powerful programming language that bridges the
+gap between C and shell programming, and is thus ideally suited for
+``throw-away programming''
+and rapid prototyping. Its syntax is put
+together from constructs borrowed from a variety of other languages;
+most prominent are influences from ABC, C, Modula-3 and Icon.
+
+The Python interpreter is easily extended with new functions and data
+types implemented in C. Python is also suitable as an extension
+language for highly customizable C applications such as editors or
+window managers.
+
+Python is available for various operating systems, amongst which
+several flavors of {\UNIX}, Amoeba, the Apple Macintosh O.S.,
+and MS-DOS.
+
+This reference manual describes the syntax and ``core semantics'' of
+the language. It is terse, but exact and complete. The semantics of
+non-essential built-in object types and of the built-in functions and
+modules are described in the {\em Library Reference} document. For an
+informal introduction to the language, see the {\em Tutorial}
+document.
+
+\end{abstract}
+
+\pagebreak
+
+\tableofcontents
+
+\pagebreak
+
+\pagenumbering{arabic}
+
+\chapter{Introduction}
+
+This reference manual describes the Python programming language.
+It is not intended as a tutorial.
+
+\chapter{Lexical analysis}
+
+A Python program is read by a {\em parser}.
+Input to the parser is a stream of {\em tokens}, generated
+by the {\em lexical analyzer}.
+
+\section{Line structure}
+
+A Python program is divided in a number of logical lines.
+Statements may not straddle logical line boundaries except where
+explicitly allowed by the syntax.
+To this purpose, the end of a logical line
+is represented by the token NEWLINE.
+
+\subsection{Comments}
+
+A comment starts with a hash character (\verb/#/) and ends at the end
+of the physical line. Comments are ignored by the syntax.
+A hash character in a string literal does not start a comment.
+
+\subsection{Line joining}
+
+Physical lines may be joined into logical lines using backslash
+characters (\verb/\/), as follows.
+If a physical line ends in a backslash that is not part of a string
+literal or comment, it is joined with
+the following forming a single logical line, deleting the backslash
+and the following end-of-line character. More than two physical
+lines may be joined together in this way.
+
+\subsection{Blank lines}
+
+A physical line that is not the continuation of the previous line
+and contains only spaces, tabs and possibly a comment, is ignored
+(i.e., no NEWLINE token is generated),
+except that during interactive input of statements, an empty
+physical line terminates a multi-line statement.
+
+\subsection{Indentation}
+
+Spaces and tabs at the beginning of a line are used to compute
+the indentation level of the line, which in turn is used to determine
+the grouping of statements.
+
+First, each tab is replaced by one to eight spaces such that the column number
+of the next character is a multiple of eight (counting from zero).
+The column number of the first non-space character then defines the
+line's indentation.
+Indentation cannot be split over multiple physical lines using
+backslashes.
+
+The indentation levels of consecutive lines are used to generate
+INDENT and DEDENT tokens, using a stack, as follows.
+
+Before the first line of the file is read, a single zero is pushed on
+the stack; this will never be popped off again. The numbers pushed
+on the stack will always be strictly increasing from bottom to top.
+At the beginning of each logical line, the line's indentation level
+is compared to the top of the stack.
+If it is equal, nothing happens.
+If it larger, it is pushed on the stack, and one INDENT token is generated.
+If it is smaller, it {\em must} be one of the numbers occurring on the
+stack; all numbers on the stack that are larger are popped off,
+and for each number popped off a DEDENT token is generated.
+At the end of the file, a DEDENT token is generated for each number
+remaining on the stack that is larger than zero.
+
+\section{Other tokens}
+
+Besides NEWLINE, INDENT and DEDENT, the following categories of tokens
+exist: identifiers, keywords, literals, operators, and delimiters.
+Spaces and tabs are not tokens, but serve to delimit tokens.
+Where ambiguity exists, a token comprises the longest possible
+string that forms a legal token, when reading from left to right.
+
+Tokens are described using an extended regular expression notation.
+This is similar to the extended BNF notation used later, except that
+the notation <...> is used to give an informal description of a character,
+and that spaces and tabs are not to be ignored.
+
+\section{Identifiers}
+
+Identifiers are described by the following regular expressions:
+
+\begin{verbatim}
+identifier: (letter|'_') (letter|digit|'_')*
+letter: lowercase | uppercase
+lowercase: 'a'|'b'|...|'z'
+uppercase: 'A'|'B'|...|'Z'
+digit: '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'
+\end{verbatim}
+
+Identifiers are unlimited in length.
+Upper and lower case letters are different.
+
+\section{Keywords}
+
+The following tokens are used as reserved words,
+or keywords of the language,
+and may not be used as ordinary identifiers.
+They must be spelled exactly as written here:
+
+{\tt
+ and
+ break
+ class
+ continue
+ def
+ del
+ elif
+ else
+ except
+ finally
+ for
+ from
+ if
+ import
+ in
+ is
+ not
+ or
+ pass
+ print
+ raise
+ return
+ try
+ while
+}
+
+\section{Literals}
+
+\subsection{String literals}
+
+String literals are described by the following regular expressions:
+
+\begin{verbatim}
+stringliteral: '\'' stringitem* '\''
+stringitem: stringchar | escapeseq
+stringchar: <any character except newline or '\\' or '\''>
+escapeseq: '\\' <any character except newline>
+\end{verbatim}
+
+String literals cannot span physical line boundaries.
+Escape sequences in strings are actually interpreted according to almost the
+same rules as used by Standard C
+(XXX which should be made explicit here),
+except that \verb/\E/ is equivalent to \verb/\033/,
+\verb/\"/ is not recognized,
+newline characters cannot be escaped, and
+{\em all unrecognized escape sequences are left in the string unchanged}.
+(The latter rule is useful when debugging: if an escape sequence is
+mistyped, the resulting output is more easily recognized as broken.
+It also helps somewhat for string literals used as regular expressions
+or otherwise passed to other modules that do their own escape handling.)
+
+\subsection{Numeric literals}
+
+There are three types of numeric literals: integers, long integers,
+and floating point numbers.
+
+Integers and long integers are described by the following regular expressions:
+
+\begin{verbatim}
+longinteger: integer ('l'|'L')
+integer: decimalinteger | octinteger | hexinteger
+decimalinteger: nonzerodigit digit* | '0'
+octinteger: '0' octdigit+
+hexinteger: '0' ('x'|'X') hexdigit+
+
+nonzerodigit: '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'
+octdigit: '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'
+hexdigit: digit|'a'|'b'|'c'|'d'|'e'|'f'|'A'|'B'|'C'|'D'|'E'|'F'
+\end{verbatim}
+
+Floating point numbers are described by the following regular expressions:
+
+\begin{verbatim}
+floatnumber: [intpart] fraction [exponent] | intpart ['.'] exponent
+intpart: digit+
+fraction: '.' digit+
+exponent: ('e'|'E') ['+'|'-'] digit+
+\end{verbatim}
+
+\section{Operators}
+
+The following tokens are operators:
+
+\begin{verbatim}
++ - * / %
+<< >> & | ^ ~
+< = == > <= <> != >=
+\end{verbatim}
+
+\section{Delimiters}
+
+The following tokens are delimiters:
+
+\begin{verbatim}
+( ) [ ] { }
+; , : . `
+\end{verbatim}
+
+The following printing ASCII characters are currently not used;
+their occurrence is an unconditional error:
+
+\begin{verbatim}
+! @ $ " ?
+\end{verbatim}
+
+\chapter{Execution model}
+
+(XXX This chapter should explain the general model
+of the execution of Python code and
+the evaluation of expressions.
+It should introduce objects, values, code blocks, scopes, name spaces,
+name binding,
+types, sequences, numbers, mappings,
+exceptions, and other technical terms needed to make the following
+chapters concise and exact.)
+
+\chapter{Expressions and conditions}
+
+(From now on, extended BNF notation will be used to describe
+syntax, not lexical analysis.)
+(XXX Explain the notation.)
+
+This chapter explains the meaning of the elements of expressions and
+conditions. Conditions are a superset of expressions, and a condition
+may be used where an expression is required by enclosing it in
+parentheses. The only place where an unparenthesized condition
+is not allowed is on the right-hand side of the assignment operator,
+because this operator is the same token (\verb/'='/) as used for
+compasisons.
+
+The comma plays a somewhat special role in Python's syntax.
+It is an operator with a lower precedence than all others, but
+occasionally serves other purposes as well (e.g., it has special
+semantics in print statements). When a comma is accepted by the
+syntax, one of the syntactic categories \verb/expression_list/
+or \verb/condition_list/ is always used.
+
+When (one alternative of) a syntax rule has the form
+
+\begin{verbatim}
+name: othername
+\end{verbatim}
+
+and no semantics are given, the semantics of this form of \verb/name/
+are the same as for \verb/othername/.
+
+\section{Arithmetic conversions}
+
+When a description of an arithmetic operator below uses the phrase
+``the numeric arguments are converted to a common type'',
+this both means that if either argument is not a number, a
+{\tt TypeError} exception is raised, and that otherwise
+the following conversions are applied:
+
+\begin{itemize}
+\item First, if either argument is a floating point number,
+ the other is converted to floating point;
+\item else, if either argument is a long integer,
+ the other is converted to long integer;
+\item otherwise, both must be short integers and no conversion
+ is necessary.
+\end{itemize}
+
+(Note: ``short integers'' in Python are at least 32 bits in size;
+``long integers'' are arbitrary precision integers.)
+
+\section{Atoms}
+
+Atoms are the most basic elements of expressions.
+Forms enclosed in reverse quotes or various types of parentheses
+or braces are also categorized syntactically as atoms.
+Syntax rules for atoms:
+
+\begin{verbatim}
+atom: identifier | literal | parenth_form | string_conversion
+literal: stringliteral | integer | longinteger | floatnumber
+parenth_form: enclosure | list_display | dict_display
+enclosure: '(' [condition_list] ')'
+list_display: '[' [condition_list] ']'
+dict_display: '{' [key_datum (',' key_datum)* [','] '}'
+key_datum: condition ':' condition
+string_conversion:'`' condition_list '`'
+\end{verbatim}
+
+\subsection{Identifiers (Names)}
+
+An identifier occurring as an atom is a reference to a local, global
+or built-in name binding. If a name can be assigned to anywhere in a code
+block, it refers to a local name throughout that code block.
+Otherwise, it refers to a global name if one exists, else to a
+built-in name.
+
+When the name is bound to an object, evaluation of the atom
+yields that object.
+When it is not bound, a {\tt NameError} exception
+is raised, with the identifier as string parameter.
+
+\subsection{Literals}
+
+Evaluation of a literal yields an object of the given type
+(string, integer, long integer, floating point number)
+with the given value.
+The value may be approximated in the case of floating point literals.
+
+All literals correspond to immutable data types, and hence the object's
+identity is less important than its value.
+Multiple evaluations of the same literal (either the same occurrence
+in the program text or a different occurrence) may
+obtain the same object or a different object with the same value.
+
+(In the original implementation, all literals in the same code block
+with the same type and value yield the same object.)
+
+\subsection{Enclosures}
+
+An empty enclosure yields an empty tuple object.
+
+An enclosed condition list yields whatever that condition list yields.
+
+(Note that, except for empty tuples, tuples are not formed by
+enclosure in parentheses, but rather by use of the comma operator.)
+
+\subsection{List displays}
+
+A list display yields a new list object.
+
+If it has no condition list, the list object has no items.
+Otherwise, the elements of the condition list are evaluated
+from left to right and inserted in the list object in that order.
+
+\subsection{Dictionary displays}
+
+A dictionary display yields a new dictionary object.
+
+The key/datum pairs are evaluated from left to right to
+define the entries of the dictionary:
+each key object is used as a key into the dictionary to store
+the corresponding datum pair.
+
+Key objects must be strings, otherwise a {\tt TypeError}
+exception is raised.
+Clashes between keys are not detected; the last datum stored for a given
+key value prevails.
+
+\subsection{String conversions}
+
+A string conversion evaluates the contained condition list and converts the
+resulting object into a string according to rules specific to its type.
+
+If the object is a string, a number, \verb/None/, or a tuple, list or
+dictionary containing only objects whose type is in this list,
+the resulting
+string is a valid Python expression which can be passed to the
+built-in function \verb/eval()/ to yield an expression with the
+same value (or an approximation, if floating point numbers are
+involved).
+
+(In particular, converting a string adds quotes around it and converts
+``funny'' characters to escape sequences that are safe to print.)
+
+It is illegal to attempt to convert recursive objects (e.g.,
+lists or dictionaries that -- directly or indirectly -- contain a reference
+to themselves.)
+
+\section{Primaries}
+
+Primaries represent the most tightly bound operations of the language.
+Their syntax is:
+
+\begin{verbatim}
+primary: atom | attributeref | call | subscription | slicing
+attributeref: primary '.' identifier
+call: primary '(' [condition_list] ')'
+subscription: primary '[' condition ']'
+slicing: primary '[' [condition] ':' [condition] ']'
+\end{verbatim}
+
+\subsection{Attribute references}
+
+\subsection{Calls}
+
+\subsection{Subscriptions}
+
+\subsection{Slicings}
+
+\section{Factors}
+
+Factors represent the unary numeric operators.
+Their syntax is:
+
+\begin{verbatim}
+factor: primary | '-' factor | '+' factor | '~' factor
+\end{verbatim}
+
+The unary \verb/'-'/ operator yields the negative of its numeric argument.
+
+The unary \verb/'+'/ operator yields its numeric argument unchanged.
+
+The unary \verb/'~'/ operator yields the bit-wise negation of its
+integral numerical argument.
+
+In all three cases, if the argument does not have the proper type,
+a {\tt TypeError} exception is raised.
+
+\section{Terms}
+
+Terms represent the most tightly binding binary operators:
+
+\begin{verbatim}
+term: factor | term '*' factor | term '/' factor | term '%' factor
+\end{verbatim}
+
+The \verb/'*'/ operator yields the product of its arguments.
+The arguments must either both be numbers, or one argument must be
+a (short) integer and the other must be a string.
+In the former case, the numbers are converted to a common type
+and then multiplied together.
+In the latter case, string repetition is performed; a negative
+repetition factor yields the empty string.
+
+The \verb|'/'| operator yields the quotient of its arguments.
+The numeric arguments are first converted to a common type.
+(Short or long) integer division yields an integer of the same type,
+truncating towards zero.
+Division by zero raises a {\tt RuntimeError} exception.
+
+The \verb|'%'| operator yields the remainder from the division
+of the first argument by the second.
+The numeric arguments are first converted to a common type.
+The outcome of $x % y$ is defined as $x - y*trunc(x/y)$.
+A zero right argument raises a {\tt RuntimeError} exception.
+The arguments may be floating point numbers, e.g.,
+$3.14 % 0.7$ equals $0.34$.
+
+\section{Arithmetic expressions}
+
+\begin{verbatim}
+arith_expr: term | arith_expr '+' term | arith_expr '-' term
+\end{verbatim}
+
+The \verb|'+'| operator yields the sum of its arguments.
+The arguments must either both be numbers, or both strings.
+In the former case, the numbers are converted to a common type
+and then added together.
+In the latter case, the strings are concatenated directly,
+without inserting a space.
+
+The \verb|'-'| operator yields the difference of its arguments.
+The numeric arguments are first converted to a common type.
+
+\section{Shift expressions}
+
+\begin{verbatim}
+shift_expr: arith_expr | shift_expr '<<' arith_expr | shift_expr '>>' arith_expr
+\end{verbatim}
+
+These operators accept short integers as arguments only.
+They shift their left argument to the left or right by the number of bits
+given by the right argument. Shifts are ``logical'', e.g., bits shifted
+out on one end are lost, and bits shifted in are zero;
+negative numbers are shifted as if they were unsigned in C.
+Negative shift counts and shift counts greater than {\em or equal to}
+the word size yield undefined results.
+
+\section{Bitwise AND expressions}
+
+\begin{verbatim}
+and_expr: shift_expr | and_expr '&' shift_expr
+\end{verbatim}
+
+This operator yields the bitwise AND of its arguments,
+which must be short integers.
+
+\section{Bitwise XOR expressions}
+
+\begin{verbatim}
+xor_expr: and_expr | xor_expr '^' and_expr
+\end{verbatim}
+
+This operator yields the bitwise exclusive OR of its arguments,
+which must be short integers.
+
+\section{Bitwise OR expressions}
+
+\begin{verbatim}
+or_expr: xor_expr | or_expr '|' xor_expr
+\end{verbatim}
+
+This operator yields the bitwise OR of its arguments,
+which must be short integers.
+
+\section{Expressions and expression lists}
+
+\begin{verbatim}
+expression: or_expression
+expr_list: expression (',' expression)* [',']
+\end{verbatim}
+
+An expression list containing at least one comma yields a new tuple.
+The length of the tuple is the number of expressions in the list.
+The expressions are evaluated from left to right.
+
+The trailing comma is required only to create a single tuple;
+it is optional in all other cases (a single expression without
+a trailing comma doesn't create a tuple, but rather yields the
+value of that expression).
+
+To create an empty tuple, use an empty pair of parentheses: \verb/()/.
+
+\section{Comparisons}
+
+\begin{verbatim}
+comparison: expression (comp_operator expression)*
+comp_operator: '<'|'>'|'='|'=='|'>='|'<='|'<>'|'!='|['not'] 'in'|is' ['not']
+\end{verbatim}
+
+Comparisons yield integer value: 1 for true, 0 for false.
+
+Comparisons can be chained arbitrarily,
+e.g., $x < y <= z$ is equivalent to
+$x < y$ {\tt and} $y <= z$, except that $y$ is evaluated only once
+(but in both cases $z$ is not evaluated at all when $x < y$ is
+found to be false).
+
+Formally, $e_0 op_1 e_1 op_2 e_2 ...e_{n-1} op_n e_n$ is equivalent to
+$e_0 op_1 e_1$ {\tt and} $e_1 op_2 e_2$ {\tt and} ... {\tt and}
+$e_{n-1} op_n e_n$, except that each expression is evaluated at most once.
+
+Note that $e_0 op_1 e_1 op_2 e_2$ does not imply any kind of comparison
+between $e_0$ and $e_2$, e.g., $x < y > z$ is perfectly legal.
+
+For the benefit of C programmers,
+the comparison operators \verb/=/ and \verb/==/ are equivalent,
+and so are \verb/<>/ and \verb/!=/.
+Use of the C variants is discouraged.
+
+The operators {\tt '<', '>', '=', '>=', '<='}, and {\tt '<>'} compare
+the values of two objects. The objects needn't have the same type.
+If both are numbers, they are compared to a common type.
+Otherwise, objects of different types {\em always} compare unequal,
+and are ordered consistently but arbitrarily, except that
+the value \verb\None\ compares smaller than the values of any other type.
+
+(This unusual
+definition of comparison is done to simplify the definition of
+operations like sorting and the \verb/in/ and \verb/not in/ operators.)
+
+Comparison of objects of the same type depends on the type:
+
+\begin{itemize}
+\item Numbers are compared arithmetically.
+\item Strings are compared lexicographically using the numeric
+ equivalents (the result of the built-in function ord())
+ of their characters.
+\item Tuples and lists are compared lexicographically
+ using comparison of corresponding items.
+\item Dictionaries compare unequal unless they are the same object;
+ the choice whether one dictionary object is considered smaller
+ or larger than another one is made arbitrarily but
+ consistently within one execution of a program.
+\item The latter rule is also used for most other built-in types.
+\end{itemize}
+
+The operators \verb\in\ and \verb\not in\ test for sequence membership:
+if $y$ is a sequence, $x {\tt in} y$ is true if and only if there exists
+an index $i$ such that $x = y_i$.
+$x {\tt not in} y$ yields the inverse truth value.
+The exception {\tt TypeError} is raised when $y$ is not a sequence,
+or when $y$ is a string and $x$ is not a string of length one.
+
+The operators \verb\is\ and \verb\is not\ compare object identity:
+$x {\tt is} y$ is true if and only if $x$ and $y$ are the same object.
+$x {\tt is not} y$ yields the inverse truth value.
+
+\section{Boolean operators}
+
+\begin{verbatim}
+condition: or_test
+or_test: and_test | or_test 'or' and_test
+and_test: not_test | and_test 'and' not_test
+not_test: comparison | 'not' not_test
+\end{verbatim}
+
+In the context of Boolean operators, and also when conditions are
+used by control flow statements, the following values are interpreted
+as false: None, numeric zero of all types, empty sequences (strings,
+tuples and lists), and empty mappings (dictionaries).
+All other values are interpreted as true.
+
+The operator \verb\not\ yields 1 if its argument is false, 0 otherwise.
+
+The condition $x {\tt and} y$ first evaluates $x$; if $x$ is false,
+$x$ is returned; otherwise, $y$ is evaluated and returned.
+
+The condition $x {\tt or} y$ first evaluates $x$; if $x$ is true,
+$x$ is returned; otherwise, $y$ is evaluated and returned.
+
+(Note that \verb\and\ and \verb\or\ do not restrict the value and type
+they return to 0 and 1, but rather return the last evaluated argument.
+This is sometimes useful, e.g., if $s$ is a string, which should be
+replaced by a default value if it is empty, $s {\tt or} 'foo'$
+returns the desired value. Because \verb\not\ has to invent a value
+anyway, it does not bother to return a value of the same type as its
+argument, so \verb\not 'foo'\ yields $0$, not $''$.)
+
+\chapter{Simple statements}
+
+Simple statements are comprised within a single logical line.
+Several simple statements may occor on a single line separated
+by semicolons. The syntax for simple statements is:
+
+\begin{verbatim}
+stmt_list: simple_stmt (';' simple_stmt)* [';']
+simple_stmt: expression_stmt
+ | assignment
+ | pass_stmt
+ | del_stmt
+ | print_stmt
+ | return_stmt
+ | raise_stmt
+ | break_stmt
+ | continue_stmt
+ | import_stmt
+\end{verbatim}
+
+\section{Expression statements}
+
+\begin{verbatim}
+expression_stmt: expression_list
+\end{verbatim}
+
+An expression statement evaluates the expression list (which may
+be a single expression).
+If the value is not \verb\None\, it is converted to a string
+using the rules for string conversions, and the resulting string
+is written to standard output on a line by itself.
+
+(The exception for \verb\None\ is made so that procedure calls,
+which are syntactically equivalent to expressions,
+do not cause any output.)
+
+\section{Assignments}
+
+\begin{verbatim}
+assignment: target_list ('=' target_list)* '=' expression_list
+target_list: target (',' target)* [',']
+target: identifier | '(' target_list ')' | '[' target_list ']'
+ | attributeref | subscription | slicing
+\end{verbatim}
+
+(See the section on primaries for the definition of the last
+three symbols.)
+
+An assignment evaluates the expression list (remember that this can
+be a single expression or a comma-separated list,
+the latter yielding a tuple)
+and assigns the single resulting object to each of the target lists,
+from left to right.
+
+Assignment is defined recursively depending on the type of the
+target. Where assignment is to part of a mutable object
+(through an attribute reference, subscription or slicing),
+the mutable object must ultimately perform the
+assignment and decide about its validity, raising an exception
+if the assignment is unacceptable. The rules observed by
+various types and the exceptions raised are given with the
+definition of the object types (some of which are defined
+in the library reference).
+
+Assignment of an object to a target list is recursively
+defined as follows.
+
+\begin{itemize}
+\item
+If the target list contains no commas (except in nested constructs):
+the object is assigned to the single target contained in the list.
+
+\item
+If the target list contains commas (that are not in nested constructs):
+the object must be a tuple with as many items
+as the list contains targets, and the items are assigned, from left
+to right, to the corresponding targets.
+
+\end{itemize}
+
+Assignment of an object to a (non-list)
+target is recursively defined as follows.
+
+\begin{itemize}
+
+\item
+If the target is an identifier (name):
+the object is bound to that name
+in the current local scope. Any previous binding of the same name
+is undone.
+
+\item
+If the target is a target list enclosed in parentheses:
+the object is assigned to that target list.
+
+\item
+If the target is a target list enclosed in square brackets:
+the object must be a list with as many items
+as the target list contains targets,
+and the list's items are assigned, from left to right,
+to the corresponding targets.
+
+\item
+If the target is an attribute reference:
+The primary expression in the reference is evaluated.
+It should yield an object with assignable attributes;
+if this is not the case, a {\tt TypeError} exception is raised.
+That object is then asked to assign the assigned object
+to the given attribute; if it cannot perform the assignment,
+it raises an exception.
+
+\item
+If the target is a subscription:
+The primary expression in the reference is evaluated.
+It should yield either a mutable sequence object or a mapping
+(dictionary) object.
+Next, the subscript expression is evaluated.
+
+If the primary is a sequence object, the subscript must yield a
+nonnegative integer smaller than the sequence's length,
+and the sequence is asked to assign the assigned object
+to its item with that index.
+
+If the primary is a mapping object, the subscript must have a
+type compatible with the mapping's key type,
+and the mapping is then asked to to create a key/datum pair
+which maps the subscript to the assigned object.
+
+Various exceptions can be raised.
+
+\item
+If the target is a slicing:
+The primary expression in the reference is evaluated.
+It should yield a mutable sequence object (currently only lists).
+The assigned object should be a sequence object of the same type.
+Next, the lower and upper bound expressions are evaluated,
+insofar they are present; defaults are zero and the sequence's length.
+The bounds should evaluate to (small) integers.
+If either bound is negative, the sequence's length is added to it (once).
+The resulting bounds are clipped to lie between zero
+and the sequence's length, inclusive.
+(XXX Shouldn't this description be with expressions?)
+Finally, the sequence object is asked to replace the items
+indicated by the slice with the items of the assigned sequence.
+This may change the sequence's length, if it allows it.
+
+\end{itemize}
+
+(In the original implementation, the syntax for targets is taken
+to be the same as for expressions, and invalid syntax is rejected
+during the code generation phase, causing less detailed error
+messages.)
+
+\section{The {\tt pass} statement}
+
+\begin{verbatim}
+pass_stmt: 'pass'
+\end{verbatim}
+
+{\tt pass} is a null operation -- when it is executed,
+nothing happens.
+
+\section{The {\tt del} statement}
+
+\begin{verbatim}
+del_stmt: 'del' target_list
+\end{verbatim}
+
+Deletion is recursively defined similar to assignment.
+
+(XXX Rather that spelling it out in full details,
+here are some hints.)
+
+Deletion of a target list recursively deletes each target,
+from left to right.
+
+Deletion of a name removes the binding of that name (which must exist)
+from the local scope.
+
+Deletion of attribute references, subscriptions and slicings
+is passed to the primary object involved; deletion of a slicing
+is in general equivalent to assignment of an empty slice of the
+right type (but even this is determined by the sliced object).
+
+\section{The {\tt print} statement}
+
+\begin{verbatim}
+print_stmt: 'print' [ condition (',' condition)* [','] ]
+\end{verbatim}
+
+{\tt print} evaluates each condition in turn and writes the resulting
+object to standard output (see below).
+If an object is not a string, it is first converted to
+a string using the rules for string conversions.
+The (resulting or original) string is then written.
+A space is written before each object is (converted and) written,
+unless the output system believes it is positioned at the beginning
+of a line. This is the case: (1) when no characters have been written
+to standard output; or (2) when the last character written to
+standard output is \verb/'\n'/;
+or (3) when the last I/O operation
+on standard output was not a \verb\print\ statement.
+
+Finally,
+a \verb/'\n'/ character is written at the end,
+unless the \verb\print\ statement ends with a comma.
+This is the only action if the statement contains just the keyword
+\verb\print\.
+
+Standard output is defined as the file object named \verb\stdout\
+in the built-in module \verb\sys\. If no such object exists,
+or if it is not a writable file, a {\tt RuntimeError} exception is raised.
+(The original implementation attempts to write to the system's original
+standard output instead, but this is not safe, and should be fixed.)
+
+\section{The {\tt return} statement}
+
+\begin{verbatim}
+return_stmt: 'return' [condition_list]
+\end{verbatim}
+
+\verb\return\ may only occur syntactically nested in a function
+definition, not within a nested class definition.
+
+If a condition list is present, it is evaluated, else \verb\None\
+is substituted.
+
+\verb\return\ leaves the current function call with the condition
+list (or \verb\None\) as return value.
+
+When \verb\return\ passes control out of a \verb\try\ statement
+with a \verb\finally\ clause, that finally clause is executed
+before really leaving the function.
+(XXX This should be made more exact, a la Modula-3.)
+
+\section{The {\tt raise} statement}
+
+\begin{verbatim}
+raise_stmt: 'raise' condition [',' condition]
+\end{verbatim}
+
+\verb\raise\ evaluates its first condition, which must yield
+a string object. If there is a second condition, this is evaluated,
+else \verb\None\ is substituted.
+
+It then raises the exception identified by the first object,
+with the second one (or \verb\None\) as its parameter.
+
+\section{The {\tt break} statement}
+
+\begin{verbatim}
+break_stmt: 'break'
+\end{verbatim}
+
+\verb\break\ may only occur syntactically nested in a \verb\for\
+or \verb\while\ loop, not nested in a function or class definition.
+
+It terminates the neares enclosing loop, skipping the optional
+\verb\else\ clause if the loop has one.
+
+If a \verb\for\ loop is terminated by \verb\break\, the loop control
+target (list) keeps its current value.
+
+When \verb\break\ passes control out of a \verb\try\ statement
+with a \verb\finally\ clause, that finally clause is executed
+before really leaving the loop.
+
+\section{The {\tt continue} statement}
+
+\begin{verbatim}
+continue_stmt: 'continue'
+\end{verbatim}
+
+\verb\continue\ may only occur syntactically nested in a \verb\for\
+or \verb\while\ loop, not nested in a function or class definition,
+and {\em not nested in a \verb\try\ statement with a \verb\finally\
+clause}.
+
+It continues with the next cycle of the nearest enclosing loop.
+
+\section{The {\tt import} statement}
+
+\begin{verbatim}
+import_stmt: 'import' identifier (',' identifier)*
+ | 'from' identifier 'import' identifier (',' identifier)*
+ | 'from' identifier 'import' '*'
+\end{verbatim}
+
+(XXX To be done.)
+
+\chapter{Compound statements}
+
+(XXX The semantic definitions of this chapter are still to be done.)
+
+\begin{verbatim}
+statement: stmt_list NEWLINE | compound_stmt
+compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef
+suite: statement | NEWLINE INDENT statement+ DEDENT
+\end{verbatim}
+
+\section{The {\tt if} statement}
+
+\begin{verbatim}
+if_stmt: 'if' condition ':' suite
+ ('elif' condition ':' suite)*
+ ['else' ':' suite]
+\end{verbatim}
+
+\section{The {\tt while} statement}
+
+\begin{verbatim}
+while_stmt: 'while' condition ':' suite ['else' ':' suite]
+\end{verbatim}
+
+\section{The {\tt for} statement}
+
+\begin{verbatim}
+for_stmt: 'for' target_list 'in' condition_list ':' suite
+ ['else' ':' suite]
+\end{verbatim}
+
+\section{The {\tt try} statement}
+
+\begin{verbatim}
+try_stmt: 'try' ':' suite
+ ('except' condition [',' condition] ':' suite)*
+ ['finally' ':' suite]
+\end{verbatim}
+
+\section{Function definitions}
+
+\begin{verbatim}
+funcdef: 'def' identifier '(' [parameter_list] ')' ':' suite
+parameter_list: parameter (',' parameter)*
+parameter: identifier | '(' parameter_list ')'
+\end{verbatim}
+
+\section{Class definitions}
+
+\begin{verbatim}
+classdef: 'class' identifier '(' ')' [inheritance] ':' suite
+inheritance: '=' identifier '(' ')' (',' identifier '(' ')')*
+\end{verbatim}
+
+XXX Syntax for scripts, modules
+XXX Syntax for interactive input, eval, exec, input
+
+\end{document}