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

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

**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 or keyword <identifiers>`.

.. 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.

