字句解析
********

Python で書かれたプログラムは *パーザ (parser)* に読み込まれます。パー
ザへの入力は、 *字句解析器 (lexical analyzer)* によって生成された一連
の *トークン (token)* からなります。この章では、字句解析器がファイルを
トークン列に分解する方法について解説します。

Python uses the 7-bit ASCII character set for program text.

バージョン 2.3 で追加: An encoding declaration can be used to indicate
that  string literals and comments use an encoding different from
ASCII.

For compatibility with older versions, Python only warns if it finds
8-bit characters; those warnings should be corrected by either
declaring an explicit encoding, or using escape sequences if those
bytes are binary data, instead of characters.

The run-time character set depends on the I/O devices connected to the
program but is generally a superset of ASCII.

**Future compatibility note:** It may be tempting to assume that the
character set for 8-bit characters is ISO Latin-1 (an ASCII superset
that covers most western languages that use the Latin alphabet), but
it is possible that in the future Unicode text editors will become
common.  These generally use the UTF-8 encoding, which is also an
ASCII superset, but with very different use for the characters with
ordinals 128-255.  While there is no consensus on this subject yet, it
is unwise to assume either Latin-1 or UTF-8, even though the current
implementation appears to favor Latin-1.  This applies both to the
source character set and the run-time character set.


行構造
======

Python プログラムは多数の *論理行 (logical lines)* に分割されます。


論理行 (logical line)
---------------------

論理行の終端は、トークン NEWLINE で表されます。構文上許されている場合
(複合文: compound statement 中の実行文: statement) を除いて、実行文は
論理行間にまたがることはできません。論理行は一行またはそれ以上の *物理
行(physical line)* からなり、物理行の末尾には明示的または非明示的な *
行連結(line joining)* 規則が続きます。


物理行 (physical line)
----------------------

物理行とは、行終端コードで区切られた文字列のことです。ソースコード内で
は、各プラットフォームごとの標準の行終端コードを使用することができます
。 Unix形式ではASCII LF (行送り: linefeed)文字、 Windows形式ではASCII
配列の CR LF (復帰: return に続いて行送り) 、 Macintosh形式ではASCII
CR (復帰) 文字です。これら全ての形式のコードは、違うプラットフォームで
も等しく使用することができます。

Pythonに埋め込む場合には、標準のC言語の改行文字の変換規則 (ASCII LFを
表現した文字コード "\n" が行終端となります) に従って、 Python APIにソ
ースコードを渡す必要があります。


コメント (Comments)
-------------------

コメントは文字列リテラル内に入っていないハッシュ文字 ("#") から始まり
、同じ物理行の末端で終わります。非明示的な行継続規則が適用されていない
限り、コメントは論理行を終端させます。コメントは構文上無視されます; コ
メントはトークンになりません。


エンコード宣言 (encoding declaration)
-------------------------------------

Python スクリプト中の一行目か二行目にあるコメントが正規表現
"coding[=:]\s*([-\w.]+)" にマッチする場合、コメントはエンコード宣言と
して処理されます; この表現の最初のグループがソースコードファイルのエン
コードを指定します。エンコード宣言は自身の行になければなりません。二行
目にある場合、一行目もコメントのみの行でなければなりません。エンコード
宣言式として推奨する形式は

   # -*- coding: <encoding-name> -*-

これは GNU Emacs で認識できます。または

   # vim:fileencoding=<encoding-name>

which is recognized by Bram Moolenaar’s VIM. In addition, if the first
bytes of the file are the UTF-8 byte-order mark ("'\xef\xbb\xbf'"),
the declared file encoding is UTF-8 (this is supported, among others,
by Microsoft’s **notepad**).

If an encoding is declared, the encoding name must be recognized by
Python. The encoding is used for all lexical analysis, in particular
to find the end of a string, and to interpret the contents of Unicode
literals. String literals are converted to Unicode for syntactical
analysis, then converted back to their original encoding before
interpretation starts.


明示的な行継続
--------------

二つまたはそれ以上の物理行を論理行としてつなげるためには、バックスラッ
シュ文字 ("\") を使って以下のようにします: 物理行が文字列リテラルやコ
メント中の文字でないバックスラッシュで終わっている場合、後続する行とつ
なげて一つの論理行を構成し、バックスラッシュおよびバックスラッシュの後
ろにある行末文字を削除します。例えば:

   if 1900 < year < 2100 and 1 <= month <= 12 \
      and 1 <= day <= 31 and 0 <= hour < 24 \
      and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
           return 1

バックスラッシュで終わる行にはコメントを入れることはできません。また、
バックスラッシュを使ってコメントを継続することはできません。バックスラ
ッシュが文字列リテラル中にある場合を除き、バックスラッシュの後ろにトー
クンを継続することはできません (すなわち、物理行内の文字列リテラル以外
のトークンをバックスラッシュを使って分断することはできません)。上記以
外の場所では、文字列リテラル外にあるバックスラッシュはどこにあっても不
正となります。


非明示的な行継続
----------------

丸括弧 (parentheses)、角括弧 (square bracket) 、および波括弧 (curly
brace) 内の式は、バックスラッシュを使わずに一行以上の物理行に分割する
ことができます。例えば:

   month_names = ['Januari', 'Februari', 'Maart',      # These are the
                  'April',   'Mei',      'Juni',       # Dutch names
                  'Juli',    'Augustus', 'September',  # for the months
                  'Oktober', 'November', 'December']   # of the year

非明示的に継続された行にはコメントを含めることができます。継続行のイン
デントは重要ではありません。空の継続行を書くことができます。非明示的な
継続行中には、NEWLINE トークンは存在しません。非明示的な行の継続は、三
重クオートされた文字列 (下記参照) でも発生します; この場合には、コメン
トを含めることができません。


空行
----

A logical line that contains only spaces, tabs, formfeeds and possibly
a comment, is ignored (i.e., no NEWLINE token is generated).  During
interactive input of statements, handling of a blank line may differ
depending on the implementation of the read-eval-print loop.  In the
standard implementation, an entirely blank logical line (i.e. one
containing not even whitespace or a comment) terminates a multi-line
statement.


インデント
----------

論理行の行頭にある、先頭の空白 (スペースおよびタブ) の連なりは、その行
のインデントレベルを計算するために使われます。インデントレベルは、実行
文のグループ化方法を決定するために用いられます。

First, tabs are replaced (from left to right) by one to eight spaces
such that the total number of characters up to and including the
replacement is a multiple of eight (this is intended to be the same
rule as used by Unix).  The total number of spaces preceding the first
non-blank character then determines the line’s indentation.
Indentation cannot be split over multiple physical lines using
backslashes; the whitespace up to the first backslash determines the
indentation.

**プラットフォーム間の互換性に関する注意:** 非 UNIX プラットフォームに
おけるテキストエディタの性質上、一つのソースファイル内でタブとインデン
トを混在させて使うのは賢明ではありません。また、プラットフォームによっ
ては、最大インデントレベルを明示的に制限しているかもしれません。

フォームフィード文字が行の先頭にあっても構いません; フォームフィード文
字は上のインデントレベル計算時には無視されます。フォームフィード文字が
先頭の空白中の他の場所にある場合、その影響は未定義です (例えば、スペー
スの数を 0 にリセットするかもしれません)。

連続する行における各々のインデントレベルは、 INDENT および DEDENT トー
クンを生成するために使われます。トークンの生成はスタックを用いて以下の
ように行われます。

ファイル中の最初の行を読み出す前に、スタックにゼロが一つ積まれ (push
され) ます; このゼロは決して除去 (pop) されることはありません。スタッ
クの先頭に積まれてゆく数字は、常にスタックの末尾から先頭にかけて厳密に
増加するようになっています。各論理行の開始位置において、その行のインデ
ントレベル値がスタックの先頭の値と比較されます。値が等しければ何もしま
せん。インデントレベル値がスタック上の値よりも大きければ、インデントレ
ベル値はスタックに積まれ、INDENT トークンが一つ生成されます。インデン
トレベル値がスタック上の値よりも小さい場合、その値はスタック内のいずれ
かの値と *等しくなければなりません* ; スタック上のインデントレベル値よ
りも大きい値はすべて除去され、値が一つ除去されるごとに DEDENT トークン
が一つ生成されます。ファイルの末尾では、スタックに残っているゼロより大
きい値は全て除去され、値が一つ除去されるごとに DEDENT トークンが一つ生
成されます。

以下の例に正しく (しかし当惑させるように) インデントされた Python コー
ドの一部を示します:

   def perm(l):
           # Compute the list of all permutations of l
       if len(l) <= 1:
                     return [l]
       r = []
       for i in range(len(l)):
                s = l[:i] + l[i+1:]
                p = perm(s)
                for x in p:
                 r.append(l[i:i+1] + x)
       return r

以下の例は、様々なインデントエラーになります:

    def perm(l):                       # error: first line indented
   for i in range(len(l)):             # error: not indented
       s = l[:i] + l[i+1:]
           p = perm(l[:i] + l[i+1:])   # error: unexpected indent
           for x in p:
                   r.append(l[i:i+1] + x)
               return r                # error: inconsistent dedent

(実際は、最初の 3 つのエラーはパーザによって検出されます; 最後のエラー
のみが字句解析器で見つかります — "return r" のインデントは、スタックか
ら逐次除去されていくどのインデントレベル値とも一致しません)


トークン間の空白
----------------

論理行の先頭や文字列の内部にある場合を除き、空白文字であるスペース、タ
ブ、およびフォームフィードは、トークンを分割するために自由に利用するこ
とができます。二つのトークンを並べて書くと別のトークンとしてみなされて
しまうような場合には、トークンの間に空白が必要となります (例えば、ab
は一つのトークンですが、 a b は二つのトークンとなります)。


その他のトークン
================

NEWLINE、INDENT、および DEDENT の他、以下のトークンのカテゴリ: *識別子
(identifier)*, *キーワード(keyword)*, *リテラル*, *演算子 (operator)*,
*デリミタ (delimiter)* が存在します。空白文字 (上で述べた行終端文字以
外) はトークンではありませんが、トークンを区切る働きがあります。トーク
ンの解析にあいまいさが生じた場合、トークンは左から右に読んで不正でない
トークンを構築できる最長の文字列を含むように構築されます。


識別子 (identifier) およびキーワード (keyword)
==============================================

Identifiers (also referred to as *names*) are described by the
following lexical definitions:

   identifier ::= (letter|"_") (letter | digit | "_")*
   letter     ::= lowercase | uppercase
   lowercase  ::= "a"..."z"
   uppercase  ::= "A"..."Z"
   digit      ::= "0"..."9"

識別子の長さには制限がありません。大小文字は区別されます。


キーワード (keyword)
--------------------

以下の識別子は、予約語、または Python 言語における *キーワード
(keyword)* として使われ、通常の識別子として使うことはできません。キー
ワードは厳密に下記の通りに綴らなければなりません:

   and       del       from      not       while
   as        elif      global    or        with
   assert    else      if        pass      yield
   break     except    import    print
   class     exec      in        raise
   continue  finally   is        return
   def       for       lambda    try

バージョン 2.4 で変更: "None" became a constant and is now recognized
by the compiler as a name for the built-in object "None".  Although it
is not a keyword, you cannot assign a different object to it.

バージョン 2.5 で変更: Using "as" and "with" as identifiers triggers a
warning.  To use them as keywords, enable the "with_statement" future
feature .

バージョン 2.6 で変更: "as" and "with" are full keywords.


予約済みの識別子種 (reserved classes of identifiers)
----------------------------------------------------

ある種の (キーワードを除く) 識別子には、特殊な意味があります。これらの
識別子種は、先頭や末尾にあるアンダースコア文字のパターンで区別されます
:

"_*"
   Not imported by "from module import *".  The special identifier "_"
   is used in the interactive interpreter to store the result of the
   last evaluation; it is stored in the "__builtin__" module.  When
   not in interactive mode, "_" has no special meaning and is not
   defined. See section import 文.

   注釈: 名前 "_" は、しばしば国際化 (internationalization) と共に用
     いられ ます; この慣習についての詳しい情報は、 "gettext" を参照し
     てくださ い。

"__*__"
   システムで定義された (system-defined) 名前です。これらの名前はイン
   タプリタと (標準ライブラリを含む) 実装上で定義されています; 現行の
   システムでの名前は 特殊メソッド名 などで話題に挙げられています。
   Python の将来のバージョンではより多くの名前が定義されることになりま
   す。このドキュメントで明記されている用法に従わない、 *あらゆる*
   "__*__" の名前は、いかなる文脈における利用でも、警告無く損害を引き
   起こすことがあります。

"__*"
   クラスプライベート (class-private) な名前です。このカテゴリに属する
   名前は、クラス定義のコンテキスト上で用いられた場合、基底クラスと派
   生クラスの 「プライベートな」 属性間で名前衝突が起こるのを防ぐため
   に書き直されます。 識別子 (identifier、または名前 (name)) を参照し
   てください。


リテラル
========

リテラル (literal) とは、いくつかの組み込み型の定数を表記したものです
。


String literals
---------------

文字列リテラルは以下の字句定義で記述されます:

   stringliteral   ::= [stringprefix](shortstring | longstring)
   stringprefix    ::= "r" | "u" | "ur" | "R" | "U" | "UR" | "Ur" | "uR"
                    | "b" | "B" | "br" | "Br" | "bR" | "BR"
   shortstring     ::= "'" shortstringitem* "'" | '"' shortstringitem* '"'
   longstring      ::= "'''" longstringitem* "'''"
                  | '"""' longstringitem* '"""'
   shortstringitem ::= shortstringchar | escapeseq
   longstringitem  ::= longstringchar | escapeseq
   shortstringchar ::= <any source character except "\" or newline or the quote>
   longstringchar  ::= <any source character except "\">
   escapeseq       ::= "\" <any ASCII character>

One syntactic restriction not indicated by these productions is that
whitespace is not allowed between the "stringprefix" and the rest of
the string literal. The source character set is defined by the
encoding declaration; it is ASCII if no encoding declaration is given
in the source file; see section エンコード宣言 (encoding declaration).

In plain English: String literals can be enclosed in matching single
quotes ("'") or double quotes (""").  They can also be enclosed in
matching groups of three single or double quotes (these are generally
referred to as *triple-quoted strings*).  The backslash ("\")
character is used to escape characters that otherwise have a special
meaning, such as newline, backslash itself, or the quote character.
String literals may optionally be prefixed with a letter "'r'" or
"'R'"; such strings are called *raw strings* and use different rules
for interpreting backslash escape sequences.  A prefix of "'u'" or
"'U'" makes the string a Unicode string.  Unicode strings use the
Unicode character set as defined by the Unicode Consortium and ISO
10646.  Some additional escape sequences, described below, are
available in Unicode strings. A prefix of "'b'" or "'B'" is ignored in
Python 2; it indicates that the literal should become a bytes literal
in Python 3 (e.g. when code is automatically converted with 2to3).  A
"'u'" or "'b'" prefix may be followed by an "'r'" prefix.

In triple-quoted strings, unescaped newlines and quotes are allowed
(and are retained), except that three unescaped quotes in a row
terminate the string.  (A 「quote」 is the character used to open the
string, i.e. either "'" or """.)

Unless an "'r'" or "'R'" prefix is present, escape sequences in
strings are interpreted according to rules similar to those used by
Standard C.  The recognized escape sequences are:

+-------------------+-----------------------------------+---------+
| エスケープシーケ  | 意味                              | 注釈    |
| ンス              |                                   |         |
+===================+===================================+=========+
| "\newline"        | Ignored                           |         |
+-------------------+-----------------------------------+---------+
| "\\"              | バックスラッシュ ("\")            |         |
+-------------------+-----------------------------------+---------+
| "\'"              | 一重引用符 ("'")                  |         |
+-------------------+-----------------------------------+---------+
| "\""              | 二重引用符 (""")                  |         |
+-------------------+-----------------------------------+---------+
| "\a"              | ASCII 端末ベル (BEL)              |         |
+-------------------+-----------------------------------+---------+
| "\b"              | ASCII バックスペース (BS)         |         |
+-------------------+-----------------------------------+---------+
| "\f"              | ASCII フォームフィード (FF)       |         |
+-------------------+-----------------------------------+---------+
| "\n"              | ASCII 行送り (LF)                 |         |
+-------------------+-----------------------------------+---------+
| "\N{name}"        | Character named *name* in the     |         |
|                   | Unicode database (Unicode only)   |         |
+-------------------+-----------------------------------+---------+
| "\r"              | ASCII 復帰 (CR)                   |         |
+-------------------+-----------------------------------+---------+
| "\t"              | ASCII 水平タブ (TAB)              |         |
+-------------------+-----------------------------------+---------+
| "\uxxxx"          | Character with 16-bit hex value   | (1)     |
|                   | *xxxx* (Unicode only)             |         |
+-------------------+-----------------------------------+---------+
| "\Uxxxxxxxx"      | Character with 32-bit hex value   | (2)     |
|                   | *xxxxxxxx* (Unicode only)         |         |
+-------------------+-----------------------------------+---------+
| "\v"              | ASCII 垂直タブ (VT)               |         |
+-------------------+-----------------------------------+---------+
| "\ooo"            | 8 進数値 *ooo* を持つ文字         | (3,5)   |
+-------------------+-----------------------------------+---------+
| "\xhh"            | 16 進数値 *hh* を持つ文字         | (4,5)   |
+-------------------+-----------------------------------+---------+

注釈:

1. Individual code units which form parts of a surrogate pair can
   be encoded using this escape sequence.

2. Any Unicode character can be encoded this way, but characters
   outside the Basic Multilingual Plane (BMP) will be encoded using a
   surrogate pair if Python is compiled to use 16-bit code units (the
   default).

3. 標準 C と同じく、最大で 3 桁の 8 進数まで受理します。

4. 標準 C とは違い、ちょうど 2 桁の 16 進数しか受理されません。

5. In a string literal, hexadecimal and octal escapes denote the
   byte with the given value; it is not necessary that the byte
   encodes a character in the source character set. In a Unicode
   literal, these escapes denote a Unicode character with the given
   value.

Unlike Standard C, all unrecognized escape sequences are left in the
string unchanged, i.e., *the backslash is left in the string*.  (This
behavior is useful when debugging: if an escape sequence is mistyped,
the resulting output is more easily recognized as broken.)  It is also
important to note that the escape sequences marked as 「(Unicode only)
」 in the table above fall into the category of unrecognized escapes
for non-Unicode string literals.

When an "'r'" or "'R'" prefix is present, a character following a
backslash is included in the string without change, and *all
backslashes are left in the string*.  For example, the string literal
"r"\n"" consists of two characters: a backslash and a lowercase "'n'".
String quotes can be escaped with a backslash, but the backslash
remains in the string; for example, "r"\""" is a valid string literal
consisting of two characters: a backslash and a double quote; "r"\""
is not a valid string literal (even a raw string cannot end in an odd
number of backslashes).  Specifically, *a raw string cannot end in a
single backslash* (since the backslash would escape the following
quote character).  Note also that a single backslash followed by a
newline is interpreted as those two characters as part of the string,
*not* as a line continuation.

When an "'r'" or "'R'" prefix is used in conjunction with a "'u'" or
"'U'" prefix, then the "\uXXXX" and "\UXXXXXXXX" escape sequences are
processed while  *all other backslashes are left in the string*. For
example, the string literal "ur"\u0062\n"" consists of three Unicode
characters: 『LATIN SMALL LETTER B』, 『REVERSE SOLIDUS』, and 『LATIN
SMALL LETTER N』. Backslashes can be escaped with a preceding
backslash; however, both remain in the string.  As a result, "\uXXXX"
escape sequences are only recognized when there are an odd number of
backslashes.


文字列リテラルの結合 (concatenation)
------------------------------------

Multiple adjacent string literals (delimited by whitespace), possibly
using different quoting conventions, are allowed, and their meaning is
the same as their concatenation.  Thus, ""hello" 'world'" is
equivalent to ""helloworld"".  This feature can be used to reduce the
number of backslashes needed, to split long strings conveniently
across long lines, or even to add comments to parts of strings, for
example:

   re.compile("[A-Za-z_]"       # letter or underscore
              "[A-Za-z0-9_]*"   # letter, digit or underscore
             )

Note that this feature is defined at the syntactical level, but
implemented at compile time.  The 『+』 operator must be used to
concatenate string expressions at run time.  Also note that literal
concatenation can use different quoting styles for each component
(even mixing raw strings and triple quoted strings).


数値リテラル
------------

There are four types of numeric literals: plain integers, long
integers, floating point numbers, and imaginary numbers.  There are no
complex literals (complex numbers can be formed by adding a real
number and an imaginary number).

数値リテラルには符号が含まれていないことに注意してください; "-1" のよ
うな句は、実際には単項演算子 (unary operator) 『"-"『 とリテラル "1"
を組み合わせたものです。


Integer and long integer literals
---------------------------------

Integer and long integer literals are described by the following
lexical definitions:

   longinteger    ::= integer ("l" | "L")
   integer        ::= decimalinteger | octinteger | hexinteger | bininteger
   decimalinteger ::= nonzerodigit digit* | "0"
   octinteger     ::= "0" ("o" | "O") octdigit+ | "0" octdigit+
   hexinteger     ::= "0" ("x" | "X") hexdigit+
   bininteger     ::= "0" ("b" | "B") bindigit+
   nonzerodigit   ::= "1"..."9"
   octdigit       ::= "0"..."7"
   bindigit       ::= "0" | "1"
   hexdigit       ::= digit | "a"..."f" | "A"..."F"

Although both lower case "'l'" and upper case "'L'" are allowed as
suffix for long integers, it is strongly recommended to always use
"'L'", since the letter "'l'" looks too much like the digit "'1'".

Plain integer literals that are above the largest representable plain
integer (e.g., 2147483647 when using 32-bit arithmetic) are accepted
as if they were long integers instead. [1]  There is no limit for long
integer literals apart from what can be stored in available memory.

Some examples of plain integer literals (first row) and long integer
literals (second and third rows):

   7     2147483647                        0177
   3L    79228162514264337593543950336L    0377L   0x100000000L
         79228162514264337593543950336             0xdeadbeef


浮動小数点数リテラル
--------------------

浮動小数点数リテラルは以下の字句定義で記述されます:

   floatnumber   ::= pointfloat | exponentfloat
   pointfloat    ::= [intpart] fraction | intpart "."
   exponentfloat ::= (intpart | pointfloat) exponent
   intpart       ::= digit+
   fraction      ::= "." digit+
   exponent      ::= ("e" | "E") ["+" | "-"] digit+

Note that the integer and exponent parts of floating point numbers can
look like octal integers, but are interpreted using radix 10.  For
example, "077e010" is legal, and denotes the same number as "77e10".
The allowed range of floating point literals is implementation-
dependent. Some examples of floating point literals:

   3.14    10.    .001    1e100    3.14e-10    0e0

数値リテラルには符号が含まれていないことに注意してください; "-1" のよ
うな句は、実際には単項演算子 (unary operator) 『"-"『 とリテラル "1"
を組み合わせたものです。


虚数 (imaginary) リテラル
-------------------------

虚数リテラルは以下のような字句定義で記述されます:

   imagnumber ::= (floatnumber | intpart) ("j" | "J")

虚数リテラルは、実数部が 0.0 の複素数を表します。複素数は二つ組の浮動
小数点型の数値で表され、それぞれの数値は浮動小数点型と同じ定義域の範囲
を持ちます。実数部がゼロでない浮動小数点を生成するには、 "(3+4j)" のよ
うに虚数リテラルに浮動小数点数を加算します。以下に虚数リテラルの例をい
くつか示します:

   3.14j   10.j    10j     .001j   1e100j  3.14e-10j


演算子
======

以下のトークンは演算子です:

   +       -       *       **      /       //      %
   <<      >>      &       |       ^       ~
   <       >       <=      >=      ==      !=      <>

The comparison operators "<>" and "!=" are alternate spellings of the
same operator.  "!=" is the preferred spelling; "<>" is obsolescent.


デリミタ (delimiter)
====================

以下のトークンは文法上のデリミタとして働きます:

   (       )       [       ]       {       }      @
   ,       :       .       `       =       ;
   +=      -=      *=      /=      //=     %=
   &=      |=      ^=      >>=     <<=     **=

The period can also occur in floating-point and imaginary literals.  A
sequence of three periods has a special meaning as an ellipsis in
slices. The second half of the list, the augmented assignment
operators, serve lexically as delimiters, but also perform an
operation.

以下の印字可能 ASCII 文字は、他のトークンの一部として特殊な意味を持っ
ていたり、字句解析器にとって重要な意味を持っています:

   '       "       #       \

以下の印字可能 ASCII 文字は、Python では使われていません。これらの文字
が文字列リテラルやコメントの外にある場合、無条件にエラーとなります:

   $       ?

-[ 脚注 ]-

[1] In versions of Python prior to 2.4, octal and hexadecimal
    literals in the range just above the largest representable plain
    integer but below the largest unsigned 32-bit number (on a machine
    using 32-bit arithmetic), 4294967296, were taken as the negative
    plain integer obtained by subtracting 4294967296 from their
    unsigned value.
