:mod:`!token` --- Constants used with Python parse trees
========================================================

.. module:: token
   :synopsis: Constants representing terminal nodes of the parse tree.

.. sectionauthor:: Fred L. Drake, Jr. <fdrake@acm.org>

**Source code:** :source:`Lib/token.py`

--------------

This module provides constants which represent the numeric values of leaf nodes
of the parse tree (terminal tokens).  Refer to the file :file:`Grammar/Tokens`
in the Python distribution for the definitions of the names in the context of
the language grammar.  The specific numeric values which the names map to may
change between Python versions.

The module also provides a mapping from numeric codes to names and some
functions.  The functions mirror definitions in the Python C header files.

Note that a token's value may depend on tokenizer options. For example, a
``"+"`` token may be reported as either :data:`PLUS` or :data:`OP`, or
a ``"match"`` token may be either :data:`NAME` or :data:`SOFT_KEYWORD`.


.. data:: tok_name

   Dictionary mapping the numeric values of the constants defined in this module
   back to name strings, allowing more human-readable representation of parse trees
   to be generated.


.. function:: ISTERMINAL(x)

   Return ``True`` for terminal token values.


.. function:: ISNONTERMINAL(x)

   Return ``True`` for non-terminal token values.


.. function:: ISEOF(x)

   Return ``True`` if *x* is the marker indicating the end of input.


The token constants are:

.. data:: NAME

   Token value that indicates an :ref:`identifier <identifiers>`.
   Note that keywords are also initially tokenized as ``NAME`` tokens.

.. data:: NUMBER

   Token value that indicates a :ref:`numeric literal <numbers>`

.. data:: STRING

   Token value that indicates a :ref:`string or byte literal <strings>`,
   excluding :ref:`formatted string literals <f-strings>`.
   The token string is not interpreted:
   it includes the surrounding quotation marks and the prefix (if given);
   backslashes are included literally, without processing escape sequences.

.. data:: OP

   A generic token value that indicates an
   :ref:`operator <operators>` or :ref:`delimiter <delimiters>`.

   .. impl-detail::

      This value is only reported by the :mod:`tokenize` module.
      Internally, the tokenizer uses
      :ref:`exact token types <token_operators_delimiters>` instead.

.. data:: COMMENT

   Token value used to indicate a comment.
   The parser ignores :data:`!COMMENT` tokens.

.. data:: NEWLINE

   Token value that indicates the end of a :ref:`logical line <logical-lines>`.

.. data:: NL

   Token value used to indicate a non-terminating newline.
   :data:`!NL` tokens are generated when a logical line of code is continued
   over multiple physical lines. The parser ignores :data:`!NL` tokens.

.. data:: INDENT

   Token value used at the beginning of a :ref:`logical line <logical-lines>`
   to indicate the start of an :ref:`indented block <indentation>`.

.. data:: DEDENT

   Token value used at the beginning of a :ref:`logical line <logical-lines>`
   to indicate the end of an :ref:`indented block <indentation>`.

.. data:: FSTRING_START

   Token value used to indicate the beginning of an
   :ref:`f-string literal <f-strings>`.

   .. impl-detail::

      The token string includes the prefix and the opening quote(s), but none
      of the contents of the literal.

.. data:: FSTRING_MIDDLE

   Token value used for literal text inside an :ref:`f-string literal <f-strings>`,
   including format specifications.

   .. impl-detail::

      Replacement fields (that is, the non-literal parts of f-strings) use
      the same tokens as other expressions, and are delimited by
      :data:`LBRACE`, :data:`RBRACE`, :data:`EXCLAMATION` and :data:`COLON`
      tokens.

.. data:: FSTRING_END

   Token value used to indicate the end of a :ref:`f-string <f-strings>`.

   .. impl-detail::

      The token string contains the closing quote(s).

.. data:: TSTRING_START

   Token value used to indicate the beginning of a template string literal.

   .. impl-detail::

      The token string includes the prefix and the opening quote(s), but none
      of the contents of the literal.

   .. versionadded:: 3.14

.. data:: TSTRING_MIDDLE

   Token value used for literal text inside a template string literal
   including format specifications.

   .. impl-detail::

      Replacement fields (that is, the non-literal parts of t-strings) use
      the same tokens as other expressions, and are delimited by
      :data:`LBRACE`, :data:`RBRACE`, :data:`EXCLAMATION` and :data:`COLON`
      tokens.

   .. versionadded:: 3.14

.. data:: TSTRING_END

   Token value used to indicate the end of a template string literal.

   .. impl-detail::

      The token string contains the closing quote(s).

   .. versionadded:: 3.14

.. data:: ENDMARKER

   Token value that indicates the end of input.
   Used in :ref:`top-level grammar rules <top-level>`.

.. data:: ENCODING

   Token value that indicates the encoding used to decode the source bytes
   into text. The first token returned by :func:`tokenize.tokenize` will
   always be an ``ENCODING`` token.

   .. impl-detail::

      This token type isn't used by the C tokenizer but is needed for
      the :mod:`tokenize` module.


The following token types are not produced by the :mod:`tokenize` module,
and are defined for special uses in the tokenizer or parser:

.. data:: TYPE_IGNORE

   Token value indicating that a ``type: ignore`` comment was recognized.
   Such tokens are produced instead of regular :data:`COMMENT` tokens only
   with the :data:`~ast.PyCF_TYPE_COMMENTS` flag.

.. data:: TYPE_COMMENT

   Token value indicating that a type comment was recognized.
   Such tokens are produced instead of regular :data:`COMMENT` tokens only
   with the :data:`~ast.PyCF_TYPE_COMMENTS` flag.

.. data:: SOFT_KEYWORD

   Token value indicating a :ref:`soft keyword <soft-keywords>`.

   The tokenizer never produces this value.
   To check for a soft keyword, pass a :data:`NAME` token's string to
   :func:`keyword.issoftkeyword`.

.. data:: ERRORTOKEN

   Token value used to indicate wrong input.

   The :mod:`tokenize` module generally indicates errors by
   raising exceptions instead of emitting this token.
   It can also emit tokens such as :data:`OP` or :data:`NAME` with strings that
   are later rejected by the parser.


.. _token_operators_delimiters:

The remaining tokens represent specific :ref:`operators <operators>` and
:ref:`delimiters <delimiters>`.
(The :mod:`tokenize` module reports these as :data:`OP`; see ``exact_type``
in the :mod:`tokenize` documentation for details.)

.. include:: token-list.inc


The following non-token constants are provided:

.. data:: N_TOKENS

   The number of token types defined in this module.

.. NT_OFFSET is deliberately undocumented; if you need it you should be
   reading the source

.. data:: EXACT_TOKEN_TYPES

   A dictionary mapping the string representation of a token to its numeric code.

   .. versionadded:: 3.8


.. versionchanged:: 3.5
   Added :data:`!AWAIT` and :data:`!ASYNC` tokens.

.. versionchanged:: 3.7
   Added :data:`COMMENT`, :data:`NL` and :data:`ENCODING` tokens.

.. versionchanged:: 3.7
   Removed :data:`!AWAIT` and :data:`!ASYNC` tokens. "async" and "await" are
   now tokenized as :data:`NAME` tokens.

.. versionchanged:: 3.8
   Added :data:`TYPE_COMMENT`, :data:`TYPE_IGNORE`, :data:`COLONEQUAL`.
   Added :data:`!AWAIT` and :data:`!ASYNC` tokens back (they're needed
   to support parsing older Python versions for :func:`ast.parse` with
   ``feature_version`` set to 6 or lower).

.. versionchanged:: 3.12
   Added :data:`EXCLAMATION`.

.. versionchanged:: 3.13
   Removed :data:`!AWAIT` and :data:`!ASYNC` tokens again.

