1231 lines
85 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en" data-content_root="../">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta property="og:title" content="10. Full Grammar specification" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://docs.python.org/3/reference/grammar.html" />
<meta property="og:site_name" content="Python documentation" />
<meta property="og:description" content="This is the full Python grammar, derived directly from the grammar used to generate the CPython parser (see Grammar/python.gram). The version here omits details related to code generation and error..." />
<meta property="og:image" content="https://docs.python.org/3/_static/og-image.png" />
<meta property="og:image:alt" content="Python documentation" />
<meta name="description" content="This is the full Python grammar, derived directly from the grammar used to generate the CPython parser (see Grammar/python.gram). The version here omits details related to code generation and error..." />
<meta property="og:image:width" content="200">
<meta property="og:image:height" content="200">
<meta name="theme-color" content="#3776ab">
<title>10. Full Grammar specification &#8212; Python 3.13.3 documentation</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="../_static/pydoctheme.css?v=23252803" />
<link id="pygments_dark_css" media="(prefers-color-scheme: dark)" rel="stylesheet" type="text/css" href="../_static/pygments_dark.css?v=5349f25f" />
<script src="../_static/documentation_options.js?v=5d57ca2d"></script>
<script src="../_static/doctools.js?v=9bcbadda"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../_static/sidebar.js"></script>
<link rel="search" type="application/opensearchdescription+xml"
title="Search within Python 3.13.3 documentation"
href="../_static/opensearch.xml"/>
<link rel="author" title="About these documents" href="../about.html" />
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="copyright" title="Copyright" href="../copyright.html" />
<link rel="next" title="The Python Standard Library" href="../library/index.html" />
<link rel="prev" title="9. Top-level components" href="toplevel_components.html" />
<link rel="canonical" href="https://docs.python.org/3/reference/grammar.html">
<style>
@media only screen {
table.full-width-table {
width: 100%;
}
}
</style>
<link rel="stylesheet" href="../_static/pydoctheme_dark.css" media="(prefers-color-scheme: dark)" id="pydoctheme_dark_css">
<link rel="shortcut icon" type="image/png" href="../_static/py.svg" />
<script type="text/javascript" src="../_static/copybutton.js"></script>
<script type="text/javascript" src="../_static/menu.js"></script>
<script type="text/javascript" src="../_static/search-focus.js"></script>
<script type="text/javascript" src="../_static/themetoggle.js"></script>
<script type="text/javascript" src="../_static/rtd_switcher.js"></script>
<meta name="readthedocs-addons-api-version" content="1">
</head>
<body>
<div class="mobile-nav">
<input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
<nav class="nav-content" role="navigation">
<label for="menuToggler" class="toggler__label">
<span></span>
</label>
<span class="nav-items-wrapper">
<a href="https://www.python.org/" class="nav-logo">
<img src="../_static/py.svg" alt="Python logo"/>
</a>
<span class="version_switcher_placeholder"></span>
<form role="search" class="search" action="../search.html" method="get">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
<path fill-rule="nonzero" fill="currentColor" d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
</svg>
<input placeholder="Quick search" aria-label="Quick search" type="search" name="q" />
<input type="submit" value="Go"/>
</form>
</span>
</nav>
<div class="menu-wrapper">
<nav class="menu" role="navigation" aria-label="main navigation">
<div class="language_switcher_placeholder"></div>
<label class="theme-selector-label">
Theme
<select class="theme-selector" oninput="activateTheme(this.value)">
<option value="auto" selected>Auto</option>
<option value="light">Light</option>
<option value="dark">Dark</option>
</select>
</label>
<div>
<h4>Previous topic</h4>
<p class="topless"><a href="toplevel_components.html"
title="previous chapter"><span class="section-number">9. </span>Top-level components</a></p>
</div>
<div>
<h4>Next topic</h4>
<p class="topless"><a href="../library/index.html"
title="next chapter">The Python Standard Library</a></p>
</div>
<div role="note" aria-label="source link">
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="../bugs.html">Report a Bug</a></li>
<li>
<a href="https://github.com/python/cpython/blob/main/Doc/reference/grammar.rst"
rel="nofollow">Show Source
</a>
</li>
</ul>
</div>
</nav>
</div>
</div>
<div class="related" role="navigation" aria-label="Related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="../library/index.html" title="The Python Standard Library"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="toplevel_components.html" title="9. Top-level components"
accesskey="P">previous</a> |</li>
<li><img src="../_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"/></li>
<li><a href="https://www.python.org/">Python</a> &#187;</li>
<li class="switchers">
<div class="language_switcher_placeholder"></div>
<div class="version_switcher_placeholder"></div>
</li>
<li>
</li>
<li id="cpython-language-and-version">
<a href="../index.html">3.13.3 Documentation</a> &#187;
</li>
<li class="nav-item nav-item-1"><a href="index.html" accesskey="U">The Python Language Reference</a> &#187;</li>
<li class="nav-item nav-item-this"><a href=""><span class="section-number">10. </span>Full Grammar specification</a></li>
<li class="right">
<div class="inline-search" role="search">
<form class="inline-search" action="../search.html" method="get">
<input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box" />
<input type="submit" value="Go" />
</form>
</div>
|
</li>
<li class="right">
<label class="theme-selector-label">
Theme
<select class="theme-selector" oninput="activateTheme(this.value)">
<option value="auto" selected>Auto</option>
<option value="light">Light</option>
<option value="dark">Dark</option>
</select>
</label> |</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="full-grammar-specification">
<span id="id1"></span><h1><span class="section-number">10. </span>Full Grammar specification<a class="headerlink" href="#full-grammar-specification" title="Link to this heading"></a></h1>
<p>This is the full Python grammar, derived directly from the grammar
used to generate the CPython parser (see <a class="extlink-source reference external" href="https://github.com/python/cpython/tree/3.13/Grammar/python.gram">Grammar/python.gram</a>).
The version here omits details related to code generation and
error recovery.</p>
<p>The notation is a mixture of <a class="reference external" href="https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form">EBNF</a>
and <a class="reference external" href="https://en.wikipedia.org/wiki/Parsing_expression_grammar">PEG</a>.
In particular, <code class="docutils literal notranslate"><span class="pre">&amp;</span></code> followed by a symbol, token or parenthesized
group indicates a positive lookahead (i.e., is required to match but
not consumed), while <code class="docutils literal notranslate"><span class="pre">!</span></code> indicates a negative lookahead (i.e., is
required <em>not</em> to match). We use the <code class="docutils literal notranslate"><span class="pre">|</span></code> separator to mean PEGs
“ordered choice” (written as <code class="docutils literal notranslate"><span class="pre">/</span></code> in traditional PEG grammars). See
<span class="target" id="index-0"></span><a class="pep reference external" href="https://peps.python.org/pep-0617/"><strong>PEP 617</strong></a> for more details on the grammars syntax.</p>
<div class="highlight-peg notranslate"><div class="highlight"><pre><span></span><span class="c c-Singleline"># PEG grammar for Python</span>
<span class="c c-Singleline"># ========================= START OF THE GRAMMAR =========================</span>
<span class="c c-Singleline"># General grammatical elements and rules:</span>
<span class="c c-Singleline">#</span>
<span class="c c-Singleline"># * Strings with double quotes (&quot;) denote SOFT KEYWORDS</span>
<span class="c c-Singleline"># * Strings with single quotes (&#39;) denote KEYWORDS</span>
<span class="c c-Singleline"># * Upper case names (NAME) denote tokens in the Grammar/Tokens file</span>
<span class="c c-Singleline"># * Rule names starting with &quot;invalid_&quot; are used for specialized syntax errors</span>
<span class="c c-Singleline"># - These rules are NOT used in the first pass of the parser.</span>
<span class="c c-Singleline"># - Only if the first pass fails to parse, a second pass including the invalid</span>
<span class="c c-Singleline"># rules will be executed.</span>
<span class="c c-Singleline"># - If the parser fails in the second phase with a generic syntax error, the</span>
<span class="c c-Singleline"># location of the generic failure of the first pass will be used (this avoids</span>
<span class="c c-Singleline"># reporting incorrect locations due to the invalid rules).</span>
<span class="c c-Singleline"># - The order of the alternatives involving invalid rules matter</span>
<span class="c c-Singleline"># (like any rule in PEG).</span>
<span class="c c-Singleline">#</span>
<span class="c c-Singleline"># Grammar Syntax (see PEP 617 for more information):</span>
<span class="c c-Singleline">#</span>
<span class="c c-Singleline"># rule_name: expression</span>
<span class="c c-Singleline"># Optionally, a type can be included right after the rule name, which</span>
<span class="c c-Singleline"># specifies the return type of the C or Python function corresponding to the</span>
<span class="c c-Singleline"># rule:</span>
<span class="c c-Singleline"># rule_name[return_type]: expression</span>
<span class="c c-Singleline"># If the return type is omitted, then a void * is returned in C and an Any in</span>
<span class="c c-Singleline"># Python.</span>
<span class="c c-Singleline"># e1 e2</span>
<span class="c c-Singleline"># Match e1, then match e2.</span>
<span class="c c-Singleline"># e1 | e2</span>
<span class="c c-Singleline"># Match e1 or e2.</span>
<span class="c c-Singleline"># The first alternative can also appear on the line after the rule name for</span>
<span class="c c-Singleline"># formatting purposes. In that case, a | must be used before the first</span>
<span class="c c-Singleline"># alternative, like so:</span>
<span class="c c-Singleline"># rule_name[return_type]:</span>
<span class="c c-Singleline"># | first_alt</span>
<span class="c c-Singleline"># | second_alt</span>
<span class="c c-Singleline"># ( e )</span>
<span class="c c-Singleline"># Match e (allows also to use other operators in the group like &#39;(e)*&#39;)</span>
<span class="c c-Singleline"># [ e ] or e?</span>
<span class="c c-Singleline"># Optionally match e.</span>
<span class="c c-Singleline"># e*</span>
<span class="c c-Singleline"># Match zero or more occurrences of e.</span>
<span class="c c-Singleline"># e+</span>
<span class="c c-Singleline"># Match one or more occurrences of e.</span>
<span class="c c-Singleline"># s.e+</span>
<span class="c c-Singleline"># Match one or more occurrences of e, separated by s. The generated parse tree</span>
<span class="c c-Singleline"># does not include the separator. This is otherwise identical to (e (s e)*).</span>
<span class="c c-Singleline"># &amp;e</span>
<span class="c c-Singleline"># Succeed if e can be parsed, without consuming any input.</span>
<span class="c c-Singleline"># !e</span>
<span class="c c-Singleline"># Fail if e can be parsed, without consuming any input.</span>
<span class="c c-Singleline"># ~</span>
<span class="c c-Singleline"># Commit to the current alternative, even if it fails to parse.</span>
<span class="c c-Singleline"># &amp;&amp;e</span>
<span class="c c-Singleline"># Eager parse e. The parser will not backtrack and will immediately </span>
<span class="c c-Singleline"># fail with SyntaxError if e cannot be parsed.</span>
<span class="c c-Singleline">#</span>
<span class="c c-Singleline"># STARTING RULES</span>
<span class="c c-Singleline"># ==============</span>
<span class="nf">file</span><span class="p">:</span> <span class="p">[</span><span class="nf">statements</span><span class="p">]</span> ENDMARKER
<span class="nf">interactive</span><span class="p">:</span> <span class="nf">statement_newline</span>
<span class="nf">eval</span><span class="p">:</span> <span class="nf">expressions</span> NEWLINE<span class="o">*</span> ENDMARKER
<span class="nf">func_type</span><span class="p">:</span> &#39;(&#39; <span class="p">[</span><span class="nf">type_expressions</span><span class="p">]</span> &#39;)&#39; &#39;-&gt;&#39; <span class="nf">expression</span> NEWLINE<span class="o">*</span> ENDMARKER
<span class="c c-Singleline"># GENERAL STATEMENTS</span>
<span class="c c-Singleline"># ==================</span>
<span class="nf">statements</span><span class="p">:</span> <span class="nf">statement</span><span class="o">+</span>
<span class="nf">statement</span><span class="p">:</span> <span class="nf">compound_stmt</span> <span class="o">|</span> <span class="nf">simple_stmts</span>
<span class="nf">statement_newline</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">compound_stmt</span> NEWLINE
<span class="o">|</span> <span class="nf">simple_stmts</span>
<span class="o">|</span> NEWLINE
<span class="o">|</span> ENDMARKER
<span class="nf">simple_stmts</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">simple_stmt</span> !&#39;;&#39; NEWLINE <span class="c c-Singleline"># Not needed, there for speedup</span>
<span class="o">|</span> &#39;;&#39;<span class="o">.</span><span class="nf">simple_stmt</span><span class="o">+</span> <span class="p">[</span>&#39;;&#39;<span class="p">]</span> NEWLINE
<span class="c c-Singleline"># NOTE: assignment MUST precede expression, else parsing a simple assignment</span>
<span class="c c-Singleline"># will throw a SyntaxError.</span>
<span class="nf">simple_stmt</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">assignment</span>
<span class="o">|</span> <span class="nf">type_alias</span>
<span class="o">|</span> <span class="nf">star_expressions</span>
<span class="o">|</span> <span class="nf">return_stmt</span>
<span class="o">|</span> <span class="nf">import_stmt</span>
<span class="o">|</span> <span class="nf">raise_stmt</span>
<span class="o">|</span> <span class="k">&#39;pass&#39;</span>
<span class="o">|</span> <span class="nf">del_stmt</span>
<span class="o">|</span> <span class="nf">yield_stmt</span>
<span class="o">|</span> <span class="nf">assert_stmt</span>
<span class="o">|</span> <span class="k">&#39;break&#39;</span>
<span class="o">|</span> <span class="k">&#39;continue&#39;</span>
<span class="o">|</span> <span class="nf">global_stmt</span>
<span class="o">|</span> <span class="nf">nonlocal_stmt</span>
<span class="nf">compound_stmt</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">function_def</span>
<span class="o">|</span> <span class="nf">if_stmt</span>
<span class="o">|</span> <span class="nf">class_def</span>
<span class="o">|</span> <span class="nf">with_stmt</span>
<span class="o">|</span> <span class="nf">for_stmt</span>
<span class="o">|</span> <span class="nf">try_stmt</span>
<span class="o">|</span> <span class="nf">while_stmt</span>
<span class="o">|</span> <span class="nf">match_stmt</span>
<span class="c c-Singleline"># SIMPLE STATEMENTS</span>
<span class="c c-Singleline"># =================</span>
<span class="c c-Singleline"># NOTE: annotated_rhs may start with &#39;yield&#39;; yield_expr must start with &#39;yield&#39;</span>
<span class="nf">assignment</span><span class="p">:</span>
<span class="o">|</span> NAME &#39;:&#39; <span class="nf">expression</span> <span class="p">[</span>&#39;=&#39; <span class="nf">annotated_rhs</span> <span class="p">]</span>
<span class="o">|</span> <span class="p">(</span>&#39;(&#39; <span class="nf">single_target</span> &#39;)&#39;
<span class="o">|</span> <span class="nf">single_subscript_attribute_target</span><span class="p">)</span> &#39;:&#39; <span class="nf">expression</span> <span class="p">[</span>&#39;=&#39; <span class="nf">annotated_rhs</span> <span class="p">]</span>
<span class="o">|</span> <span class="p">(</span><span class="nf">star_targets</span> &#39;=&#39; <span class="p">)</span><span class="o">+</span> <span class="p">(</span><span class="nf">yield_expr</span> <span class="o">|</span> <span class="nf">star_expressions</span><span class="p">)</span> !&#39;=&#39; <span class="p">[</span>TYPE_COMMENT<span class="p">]</span>
<span class="o">|</span> <span class="nf">single_target</span> <span class="nf">augassign</span> ~ <span class="p">(</span><span class="nf">yield_expr</span> <span class="o">|</span> <span class="nf">star_expressions</span><span class="p">)</span>
<span class="nf">annotated_rhs</span><span class="p">:</span> <span class="nf">yield_expr</span> <span class="o">|</span> <span class="nf">star_expressions</span>
<span class="nf">augassign</span><span class="p">:</span>
<span class="o">|</span> &#39;+=&#39;
<span class="o">|</span> &#39;-=&#39;
<span class="o">|</span> &#39;*=&#39;
<span class="o">|</span> &#39;@=&#39;
<span class="o">|</span> &#39;/=&#39;
<span class="o">|</span> &#39;%=&#39;
<span class="o">|</span> &#39;&amp;=&#39;
<span class="o">|</span> &#39;|=&#39;
<span class="o">|</span> &#39;^=&#39;
<span class="o">|</span> &#39;&lt;&lt;=&#39;
<span class="o">|</span> &#39;&gt;&gt;=&#39;
<span class="o">|</span> &#39;**=&#39;
<span class="o">|</span> &#39;//=&#39;
<span class="nf">return_stmt</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;return&#39;</span> <span class="p">[</span><span class="nf">star_expressions</span><span class="p">]</span>
<span class="nf">raise_stmt</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;raise&#39;</span> <span class="nf">expression</span> <span class="p">[</span><span class="k">&#39;from&#39;</span> <span class="nf">expression</span> <span class="p">]</span>
<span class="o">|</span> <span class="k">&#39;raise&#39;</span>
<span class="nf">global_stmt</span><span class="p">:</span> <span class="k">&#39;global&#39;</span> &#39;,&#39;<span class="o">.</span>NAME<span class="o">+</span>
<span class="nf">nonlocal_stmt</span><span class="p">:</span> <span class="k">&#39;nonlocal&#39;</span> &#39;,&#39;<span class="o">.</span>NAME<span class="o">+</span>
<span class="nf">del_stmt</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;del&#39;</span> <span class="nf">del_targets</span> &amp;<span class="p">(</span>&#39;;&#39; <span class="o">|</span> NEWLINE<span class="p">)</span>
<span class="nf">yield_stmt</span><span class="p">:</span> <span class="nf">yield_expr</span>
<span class="nf">assert_stmt</span><span class="p">:</span> <span class="k">&#39;assert&#39;</span> <span class="nf">expression</span> <span class="p">[</span>&#39;,&#39; <span class="nf">expression</span> <span class="p">]</span>
<span class="nf">import_stmt</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">import_name</span>
<span class="o">|</span> <span class="nf">import_from</span>
<span class="c c-Singleline"># Import statements</span>
<span class="c c-Singleline"># -----------------</span>
<span class="nf">import_name</span><span class="p">:</span> <span class="k">&#39;import&#39;</span> <span class="nf">dotted_as_names</span>
<span class="c c-Singleline"># note below: the (&#39;.&#39; | &#39;...&#39;) is necessary because &#39;...&#39; is tokenized as ELLIPSIS</span>
<span class="nf">import_from</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;from&#39;</span> <span class="p">(</span>&#39;.&#39; <span class="o">|</span> &#39;...&#39;<span class="p">)</span><span class="o">*</span> <span class="nf">dotted_name</span> <span class="k">&#39;import&#39;</span> <span class="nf">import_from_targets</span>
<span class="o">|</span> <span class="k">&#39;from&#39;</span> <span class="p">(</span>&#39;.&#39; <span class="o">|</span> &#39;...&#39;<span class="p">)</span><span class="o">+</span> <span class="k">&#39;import&#39;</span> <span class="nf">import_from_targets</span>
<span class="nf">import_from_targets</span><span class="p">:</span>
<span class="o">|</span> &#39;(&#39; <span class="nf">import_from_as_names</span> <span class="p">[</span>&#39;,&#39;<span class="p">]</span> &#39;)&#39;
<span class="o">|</span> <span class="nf">import_from_as_names</span> !&#39;,&#39;
<span class="o">|</span> &#39;*&#39;
<span class="nf">import_from_as_names</span><span class="p">:</span>
<span class="o">|</span> &#39;,&#39;<span class="o">.</span><span class="nf">import_from_as_name</span><span class="o">+</span>
<span class="nf">import_from_as_name</span><span class="p">:</span>
<span class="o">|</span> NAME <span class="p">[</span><span class="k">&#39;as&#39;</span> NAME <span class="p">]</span>
<span class="nf">dotted_as_names</span><span class="p">:</span>
<span class="o">|</span> &#39;,&#39;<span class="o">.</span><span class="nf">dotted_as_name</span><span class="o">+</span>
<span class="nf">dotted_as_name</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">dotted_name</span> <span class="p">[</span><span class="k">&#39;as&#39;</span> NAME <span class="p">]</span>
<span class="nf">dotted_name</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">dotted_name</span> &#39;.&#39; NAME
<span class="o">|</span> NAME
<span class="c c-Singleline"># COMPOUND STATEMENTS</span>
<span class="c c-Singleline"># ===================</span>
<span class="c c-Singleline"># Common elements</span>
<span class="c c-Singleline"># ---------------</span>
<span class="nf">block</span><span class="p">:</span>
<span class="o">|</span> NEWLINE INDENT <span class="nf">statements</span> DEDENT
<span class="o">|</span> <span class="nf">simple_stmts</span>
<span class="nf">decorators</span><span class="p">:</span> <span class="p">(</span>&#39;@&#39; <span class="nf">named_expression</span> NEWLINE <span class="p">)</span><span class="o">+</span>
<span class="c c-Singleline"># Class definitions</span>
<span class="c c-Singleline"># -----------------</span>
<span class="nf">class_def</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">decorators</span> <span class="nf">class_def_raw</span>
<span class="o">|</span> <span class="nf">class_def_raw</span>
<span class="nf">class_def_raw</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;class&#39;</span> NAME <span class="p">[</span><span class="nf">type_params</span><span class="p">]</span> <span class="p">[</span>&#39;(&#39; <span class="p">[</span><span class="nf">arguments</span><span class="p">]</span> &#39;)&#39; <span class="p">]</span> &#39;:&#39; <span class="nf">block</span>
<span class="c c-Singleline"># Function definitions</span>
<span class="c c-Singleline"># --------------------</span>
<span class="nf">function_def</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">decorators</span> <span class="nf">function_def_raw</span>
<span class="o">|</span> <span class="nf">function_def_raw</span>
<span class="nf">function_def_raw</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;def&#39;</span> NAME <span class="p">[</span><span class="nf">type_params</span><span class="p">]</span> &#39;(&#39; <span class="p">[</span><span class="nf">params</span><span class="p">]</span> &#39;)&#39; <span class="p">[</span>&#39;-&gt;&#39; <span class="nf">expression</span> <span class="p">]</span> &#39;:&#39; <span class="p">[</span><span class="nf">func_type_comment</span><span class="p">]</span> <span class="nf">block</span>
<span class="o">|</span> <span class="k">&#39;async&#39;</span> <span class="k">&#39;def&#39;</span> NAME <span class="p">[</span><span class="nf">type_params</span><span class="p">]</span> &#39;(&#39; <span class="p">[</span><span class="nf">params</span><span class="p">]</span> &#39;)&#39; <span class="p">[</span>&#39;-&gt;&#39; <span class="nf">expression</span> <span class="p">]</span> &#39;:&#39; <span class="p">[</span><span class="nf">func_type_comment</span><span class="p">]</span> <span class="nf">block</span>
<span class="c c-Singleline"># Function parameters</span>
<span class="c c-Singleline"># -------------------</span>
<span class="nf">params</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">parameters</span>
<span class="nf">parameters</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">slash_no_default</span> <span class="nf">param_no_default</span><span class="o">*</span> <span class="nf">param_with_default</span><span class="o">*</span> <span class="p">[</span><span class="nf">star_etc</span><span class="p">]</span>
<span class="o">|</span> <span class="nf">slash_with_default</span> <span class="nf">param_with_default</span><span class="o">*</span> <span class="p">[</span><span class="nf">star_etc</span><span class="p">]</span>
<span class="o">|</span> <span class="nf">param_no_default</span><span class="o">+</span> <span class="nf">param_with_default</span><span class="o">*</span> <span class="p">[</span><span class="nf">star_etc</span><span class="p">]</span>
<span class="o">|</span> <span class="nf">param_with_default</span><span class="o">+</span> <span class="p">[</span><span class="nf">star_etc</span><span class="p">]</span>
<span class="o">|</span> <span class="nf">star_etc</span>
<span class="c c-Singleline"># Some duplication here because we can&#39;t write (&#39;,&#39; | &amp;&#39;)&#39;),</span>
<span class="c c-Singleline"># which is because we don&#39;t support empty alternatives (yet).</span>
<span class="nf">slash_no_default</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">param_no_default</span><span class="o">+</span> &#39;/&#39; &#39;,&#39;
<span class="o">|</span> <span class="nf">param_no_default</span><span class="o">+</span> &#39;/&#39; &amp;&#39;)&#39;
<span class="nf">slash_with_default</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">param_no_default</span><span class="o">*</span> <span class="nf">param_with_default</span><span class="o">+</span> &#39;/&#39; &#39;,&#39;
<span class="o">|</span> <span class="nf">param_no_default</span><span class="o">*</span> <span class="nf">param_with_default</span><span class="o">+</span> &#39;/&#39; &amp;&#39;)&#39;
<span class="nf">star_etc</span><span class="p">:</span>
<span class="o">|</span> &#39;*&#39; <span class="nf">param_no_default</span> <span class="nf">param_maybe_default</span><span class="o">*</span> <span class="p">[</span><span class="nf">kwds</span><span class="p">]</span>
<span class="o">|</span> &#39;*&#39; <span class="nf">param_no_default_star_annotation</span> <span class="nf">param_maybe_default</span><span class="o">*</span> <span class="p">[</span><span class="nf">kwds</span><span class="p">]</span>
<span class="o">|</span> &#39;*&#39; &#39;,&#39; <span class="nf">param_maybe_default</span><span class="o">+</span> <span class="p">[</span><span class="nf">kwds</span><span class="p">]</span>
<span class="o">|</span> <span class="nf">kwds</span>
<span class="nf">kwds</span><span class="p">:</span>
<span class="o">|</span> &#39;**&#39; <span class="nf">param_no_default</span>
<span class="c c-Singleline"># One parameter. This *includes* a following comma and type comment.</span>
<span class="c c-Singleline">#</span>
<span class="c c-Singleline"># There are three styles:</span>
<span class="c c-Singleline"># - No default</span>
<span class="c c-Singleline"># - With default</span>
<span class="c c-Singleline"># - Maybe with default</span>
<span class="c c-Singleline">#</span>
<span class="c c-Singleline"># There are two alternative forms of each, to deal with type comments:</span>
<span class="c c-Singleline"># - Ends in a comma followed by an optional type comment</span>
<span class="c c-Singleline"># - No comma, optional type comment, must be followed by close paren</span>
<span class="c c-Singleline"># The latter form is for a final parameter without trailing comma.</span>
<span class="c c-Singleline">#</span>
<span class="nf">param_no_default</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">param</span> &#39;,&#39; TYPE_COMMENT<span class="o">?</span>
<span class="o">|</span> <span class="nf">param</span> TYPE_COMMENT<span class="o">?</span> &amp;&#39;)&#39;
<span class="nf">param_no_default_star_annotation</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">param_star_annotation</span> &#39;,&#39; TYPE_COMMENT<span class="o">?</span>
<span class="o">|</span> <span class="nf">param_star_annotation</span> TYPE_COMMENT<span class="o">?</span> &amp;&#39;)&#39;
<span class="nf">param_with_default</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">param</span> <span class="nf">default</span> &#39;,&#39; TYPE_COMMENT<span class="o">?</span>
<span class="o">|</span> <span class="nf">param</span> <span class="nf">default</span> TYPE_COMMENT<span class="o">?</span> &amp;&#39;)&#39;
<span class="nf">param_maybe_default</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">param</span> <span class="nf">default</span><span class="o">?</span> &#39;,&#39; TYPE_COMMENT<span class="o">?</span>
<span class="o">|</span> <span class="nf">param</span> <span class="nf">default</span><span class="o">?</span> TYPE_COMMENT<span class="o">?</span> &amp;&#39;)&#39;
<span class="nf">param</span><span class="p">:</span> NAME <span class="nf">annotation</span><span class="o">?</span>
<span class="nf">param_star_annotation</span><span class="p">:</span> NAME <span class="nf">star_annotation</span>
<span class="nf">annotation</span><span class="p">:</span> &#39;:&#39; <span class="nf">expression</span>
<span class="nf">star_annotation</span><span class="p">:</span> &#39;:&#39; <span class="nf">star_expression</span>
<span class="nf">default</span><span class="p">:</span> &#39;=&#39; <span class="nf">expression</span> <span class="o">|</span> <span class="nf">invalid_default</span>
<span class="c c-Singleline"># If statement</span>
<span class="c c-Singleline"># ------------</span>
<span class="nf">if_stmt</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;if&#39;</span> <span class="nf">named_expression</span> &#39;:&#39; <span class="nf">block</span> <span class="nf">elif_stmt</span>
<span class="o">|</span> <span class="k">&#39;if&#39;</span> <span class="nf">named_expression</span> &#39;:&#39; <span class="nf">block</span> <span class="p">[</span><span class="nf">else_block</span><span class="p">]</span>
<span class="nf">elif_stmt</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;elif&#39;</span> <span class="nf">named_expression</span> &#39;:&#39; <span class="nf">block</span> <span class="nf">elif_stmt</span>
<span class="o">|</span> <span class="k">&#39;elif&#39;</span> <span class="nf">named_expression</span> &#39;:&#39; <span class="nf">block</span> <span class="p">[</span><span class="nf">else_block</span><span class="p">]</span>
<span class="nf">else_block</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;else&#39;</span> &#39;:&#39; <span class="nf">block</span>
<span class="c c-Singleline"># While statement</span>
<span class="c c-Singleline"># ---------------</span>
<span class="nf">while_stmt</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;while&#39;</span> <span class="nf">named_expression</span> &#39;:&#39; <span class="nf">block</span> <span class="p">[</span><span class="nf">else_block</span><span class="p">]</span>
<span class="c c-Singleline"># For statement</span>
<span class="c c-Singleline"># -------------</span>
<span class="nf">for_stmt</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;for&#39;</span> <span class="nf">star_targets</span> <span class="k">&#39;in&#39;</span> ~ <span class="nf">star_expressions</span> &#39;:&#39; <span class="p">[</span>TYPE_COMMENT<span class="p">]</span> <span class="nf">block</span> <span class="p">[</span><span class="nf">else_block</span><span class="p">]</span>
<span class="o">|</span> <span class="k">&#39;async&#39;</span> <span class="k">&#39;for&#39;</span> <span class="nf">star_targets</span> <span class="k">&#39;in&#39;</span> ~ <span class="nf">star_expressions</span> &#39;:&#39; <span class="p">[</span>TYPE_COMMENT<span class="p">]</span> <span class="nf">block</span> <span class="p">[</span><span class="nf">else_block</span><span class="p">]</span>
<span class="c c-Singleline"># With statement</span>
<span class="c c-Singleline"># --------------</span>
<span class="nf">with_stmt</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;with&#39;</span> &#39;(&#39; &#39;,&#39;<span class="o">.</span><span class="nf">with_item</span><span class="o">+</span> &#39;,&#39;<span class="o">?</span> &#39;)&#39; &#39;:&#39; <span class="p">[</span>TYPE_COMMENT<span class="p">]</span> <span class="nf">block</span>
<span class="o">|</span> <span class="k">&#39;with&#39;</span> &#39;,&#39;<span class="o">.</span><span class="nf">with_item</span><span class="o">+</span> &#39;:&#39; <span class="p">[</span>TYPE_COMMENT<span class="p">]</span> <span class="nf">block</span>
<span class="o">|</span> <span class="k">&#39;async&#39;</span> <span class="k">&#39;with&#39;</span> &#39;(&#39; &#39;,&#39;<span class="o">.</span><span class="nf">with_item</span><span class="o">+</span> &#39;,&#39;<span class="o">?</span> &#39;)&#39; &#39;:&#39; <span class="nf">block</span>
<span class="o">|</span> <span class="k">&#39;async&#39;</span> <span class="k">&#39;with&#39;</span> &#39;,&#39;<span class="o">.</span><span class="nf">with_item</span><span class="o">+</span> &#39;:&#39; <span class="p">[</span>TYPE_COMMENT<span class="p">]</span> <span class="nf">block</span>
<span class="nf">with_item</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">expression</span> <span class="k">&#39;as&#39;</span> <span class="nf">star_target</span> &amp;<span class="p">(</span>&#39;,&#39; <span class="o">|</span> &#39;)&#39; <span class="o">|</span> &#39;:&#39;<span class="p">)</span>
<span class="o">|</span> <span class="nf">expression</span>
<span class="c c-Singleline"># Try statement</span>
<span class="c c-Singleline"># -------------</span>
<span class="nf">try_stmt</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;try&#39;</span> &#39;:&#39; <span class="nf">block</span> <span class="nf">finally_block</span>
<span class="o">|</span> <span class="k">&#39;try&#39;</span> &#39;:&#39; <span class="nf">block</span> <span class="nf">except_block</span><span class="o">+</span> <span class="p">[</span><span class="nf">else_block</span><span class="p">]</span> <span class="p">[</span><span class="nf">finally_block</span><span class="p">]</span>
<span class="o">|</span> <span class="k">&#39;try&#39;</span> &#39;:&#39; <span class="nf">block</span> <span class="nf">except_star_block</span><span class="o">+</span> <span class="p">[</span><span class="nf">else_block</span><span class="p">]</span> <span class="p">[</span><span class="nf">finally_block</span><span class="p">]</span>
<span class="c c-Singleline"># Except statement</span>
<span class="c c-Singleline"># ----------------</span>
<span class="nf">except_block</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;except&#39;</span> <span class="nf">expression</span> <span class="p">[</span><span class="k">&#39;as&#39;</span> NAME <span class="p">]</span> &#39;:&#39; <span class="nf">block</span>
<span class="o">|</span> <span class="k">&#39;except&#39;</span> &#39;:&#39; <span class="nf">block</span>
<span class="nf">except_star_block</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;except&#39;</span> &#39;*&#39; <span class="nf">expression</span> <span class="p">[</span><span class="k">&#39;as&#39;</span> NAME <span class="p">]</span> &#39;:&#39; <span class="nf">block</span>
<span class="nf">finally_block</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;finally&#39;</span> &#39;:&#39; <span class="nf">block</span>
<span class="c c-Singleline"># Match statement</span>
<span class="c c-Singleline"># ---------------</span>
<span class="nf">match_stmt</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&quot;match&quot;</span> <span class="nf">subject_expr</span> &#39;:&#39; NEWLINE INDENT <span class="nf">case_block</span><span class="o">+</span> DEDENT
<span class="nf">subject_expr</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">star_named_expression</span> &#39;,&#39; <span class="nf">star_named_expressions</span><span class="o">?</span>
<span class="o">|</span> <span class="nf">named_expression</span>
<span class="nf">case_block</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&quot;case&quot;</span> <span class="nf">patterns</span> <span class="nf">guard</span><span class="o">?</span> &#39;:&#39; <span class="nf">block</span>
<span class="nf">guard</span><span class="p">:</span> <span class="k">&#39;if&#39;</span> <span class="nf">named_expression</span>
<span class="nf">patterns</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">open_sequence_pattern</span>
<span class="o">|</span> <span class="nf">pattern</span>
<span class="nf">pattern</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">as_pattern</span>
<span class="o">|</span> <span class="nf">or_pattern</span>
<span class="nf">as_pattern</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">or_pattern</span> <span class="k">&#39;as&#39;</span> <span class="nf">pattern_capture_target</span>
<span class="nf">or_pattern</span><span class="p">:</span>
<span class="o">|</span> &#39;|&#39;<span class="o">.</span><span class="nf">closed_pattern</span><span class="o">+</span>
<span class="nf">closed_pattern</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">literal_pattern</span>
<span class="o">|</span> <span class="nf">capture_pattern</span>
<span class="o">|</span> <span class="nf">wildcard_pattern</span>
<span class="o">|</span> <span class="nf">value_pattern</span>
<span class="o">|</span> <span class="nf">group_pattern</span>
<span class="o">|</span> <span class="nf">sequence_pattern</span>
<span class="o">|</span> <span class="nf">mapping_pattern</span>
<span class="o">|</span> <span class="nf">class_pattern</span>
<span class="c c-Singleline"># Literal patterns are used for equality and identity constraints</span>
<span class="nf">literal_pattern</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">signed_number</span> !<span class="p">(</span>&#39;+&#39; <span class="o">|</span> &#39;-&#39;<span class="p">)</span>
<span class="o">|</span> <span class="nf">complex_number</span>
<span class="o">|</span> <span class="nf">strings</span>
<span class="o">|</span> <span class="k">&#39;None&#39;</span>
<span class="o">|</span> <span class="k">&#39;True&#39;</span>
<span class="o">|</span> <span class="k">&#39;False&#39;</span>
<span class="c c-Singleline"># Literal expressions are used to restrict permitted mapping pattern keys</span>
<span class="nf">literal_expr</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">signed_number</span> !<span class="p">(</span>&#39;+&#39; <span class="o">|</span> &#39;-&#39;<span class="p">)</span>
<span class="o">|</span> <span class="nf">complex_number</span>
<span class="o">|</span> <span class="nf">strings</span>
<span class="o">|</span> <span class="k">&#39;None&#39;</span>
<span class="o">|</span> <span class="k">&#39;True&#39;</span>
<span class="o">|</span> <span class="k">&#39;False&#39;</span>
<span class="nf">complex_number</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">signed_real_number</span> &#39;+&#39; <span class="nf">imaginary_number</span>
<span class="o">|</span> <span class="nf">signed_real_number</span> &#39;-&#39; <span class="nf">imaginary_number</span>
<span class="nf">signed_number</span><span class="p">:</span>
<span class="o">|</span> NUMBER
<span class="o">|</span> &#39;-&#39; NUMBER
<span class="nf">signed_real_number</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">real_number</span>
<span class="o">|</span> &#39;-&#39; <span class="nf">real_number</span>
<span class="nf">real_number</span><span class="p">:</span>
<span class="o">|</span> NUMBER
<span class="nf">imaginary_number</span><span class="p">:</span>
<span class="o">|</span> NUMBER
<span class="nf">capture_pattern</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">pattern_capture_target</span>
<span class="nf">pattern_capture_target</span><span class="p">:</span>
<span class="o">|</span> !<span class="k">&quot;_&quot;</span> NAME !<span class="p">(</span>&#39;.&#39; <span class="o">|</span> &#39;(&#39; <span class="o">|</span> &#39;=&#39;<span class="p">)</span>
<span class="nf">wildcard_pattern</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&quot;_&quot;</span>
<span class="nf">value_pattern</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">attr</span> !<span class="p">(</span>&#39;.&#39; <span class="o">|</span> &#39;(&#39; <span class="o">|</span> &#39;=&#39;<span class="p">)</span>
<span class="nf">attr</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">name_or_attr</span> &#39;.&#39; NAME
<span class="nf">name_or_attr</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">attr</span>
<span class="o">|</span> NAME
<span class="nf">group_pattern</span><span class="p">:</span>
<span class="o">|</span> &#39;(&#39; <span class="nf">pattern</span> &#39;)&#39;
<span class="nf">sequence_pattern</span><span class="p">:</span>
<span class="o">|</span> &#39;[&#39; <span class="nf">maybe_sequence_pattern</span><span class="o">?</span> &#39;]&#39;
<span class="o">|</span> &#39;(&#39; <span class="nf">open_sequence_pattern</span><span class="o">?</span> &#39;)&#39;
<span class="nf">open_sequence_pattern</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">maybe_star_pattern</span> &#39;,&#39; <span class="nf">maybe_sequence_pattern</span><span class="o">?</span>
<span class="nf">maybe_sequence_pattern</span><span class="p">:</span>
<span class="o">|</span> &#39;,&#39;<span class="o">.</span><span class="nf">maybe_star_pattern</span><span class="o">+</span> &#39;,&#39;<span class="o">?</span>
<span class="nf">maybe_star_pattern</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">star_pattern</span>
<span class="o">|</span> <span class="nf">pattern</span>
<span class="nf">star_pattern</span><span class="p">:</span>
<span class="o">|</span> &#39;*&#39; <span class="nf">pattern_capture_target</span>
<span class="o">|</span> &#39;*&#39; <span class="nf">wildcard_pattern</span>
<span class="nf">mapping_pattern</span><span class="p">:</span>
<span class="o">|</span> &#39;{&#39; &#39;}&#39;
<span class="o">|</span> &#39;{&#39; <span class="nf">double_star_pattern</span> &#39;,&#39;<span class="o">?</span> &#39;}&#39;
<span class="o">|</span> &#39;{&#39; <span class="nf">items_pattern</span> &#39;,&#39; <span class="nf">double_star_pattern</span> &#39;,&#39;<span class="o">?</span> &#39;}&#39;
<span class="o">|</span> &#39;{&#39; <span class="nf">items_pattern</span> &#39;,&#39;<span class="o">?</span> &#39;}&#39;
<span class="nf">items_pattern</span><span class="p">:</span>
<span class="o">|</span> &#39;,&#39;<span class="o">.</span><span class="nf">key_value_pattern</span><span class="o">+</span>
<span class="nf">key_value_pattern</span><span class="p">:</span>
<span class="o">|</span> <span class="p">(</span><span class="nf">literal_expr</span> <span class="o">|</span> <span class="nf">attr</span><span class="p">)</span> &#39;:&#39; <span class="nf">pattern</span>
<span class="nf">double_star_pattern</span><span class="p">:</span>
<span class="o">|</span> &#39;**&#39; <span class="nf">pattern_capture_target</span>
<span class="nf">class_pattern</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">name_or_attr</span> &#39;(&#39; &#39;)&#39;
<span class="o">|</span> <span class="nf">name_or_attr</span> &#39;(&#39; <span class="nf">positional_patterns</span> &#39;,&#39;<span class="o">?</span> &#39;)&#39;
<span class="o">|</span> <span class="nf">name_or_attr</span> &#39;(&#39; <span class="nf">keyword_patterns</span> &#39;,&#39;<span class="o">?</span> &#39;)&#39;
<span class="o">|</span> <span class="nf">name_or_attr</span> &#39;(&#39; <span class="nf">positional_patterns</span> &#39;,&#39; <span class="nf">keyword_patterns</span> &#39;,&#39;<span class="o">?</span> &#39;)&#39;
<span class="nf">positional_patterns</span><span class="p">:</span>
<span class="o">|</span> &#39;,&#39;<span class="o">.</span><span class="nf">pattern</span><span class="o">+</span>
<span class="nf">keyword_patterns</span><span class="p">:</span>
<span class="o">|</span> &#39;,&#39;<span class="o">.</span><span class="nf">keyword_pattern</span><span class="o">+</span>
<span class="nf">keyword_pattern</span><span class="p">:</span>
<span class="o">|</span> NAME &#39;=&#39; <span class="nf">pattern</span>
<span class="c c-Singleline"># Type statement</span>
<span class="c c-Singleline"># ---------------</span>
<span class="nf">type_alias</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&quot;type&quot;</span> NAME <span class="p">[</span><span class="nf">type_params</span><span class="p">]</span> &#39;=&#39; <span class="nf">expression</span>
<span class="c c-Singleline"># Type parameter declaration</span>
<span class="c c-Singleline"># --------------------------</span>
<span class="nf">type_params</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">invalid_type_params</span>
<span class="o">|</span> &#39;[&#39; <span class="nf">type_param_seq</span> &#39;]&#39;
<span class="nf">type_param_seq</span><span class="p">:</span> &#39;,&#39;<span class="o">.</span><span class="nf">type_param</span><span class="o">+</span> <span class="p">[</span>&#39;,&#39;<span class="p">]</span>
<span class="nf">type_param</span><span class="p">:</span>
<span class="o">|</span> NAME <span class="p">[</span><span class="nf">type_param_bound</span><span class="p">]</span> <span class="p">[</span><span class="nf">type_param_default</span><span class="p">]</span>
<span class="o">|</span> &#39;*&#39; NAME <span class="p">[</span><span class="nf">type_param_starred_default</span><span class="p">]</span>
<span class="o">|</span> &#39;**&#39; NAME <span class="p">[</span><span class="nf">type_param_default</span><span class="p">]</span>
<span class="nf">type_param_bound</span><span class="p">:</span> &#39;:&#39; <span class="nf">expression</span>
<span class="nf">type_param_default</span><span class="p">:</span> &#39;=&#39; <span class="nf">expression</span>
<span class="nf">type_param_starred_default</span><span class="p">:</span> &#39;=&#39; <span class="nf">star_expression</span>
<span class="c c-Singleline"># EXPRESSIONS</span>
<span class="c c-Singleline"># -----------</span>
<span class="nf">expressions</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">expression</span> <span class="p">(</span>&#39;,&#39; <span class="nf">expression</span> <span class="p">)</span><span class="o">+</span> <span class="p">[</span>&#39;,&#39;<span class="p">]</span>
<span class="o">|</span> <span class="nf">expression</span> &#39;,&#39;
<span class="o">|</span> <span class="nf">expression</span>
<span class="nf">expression</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">disjunction</span> <span class="k">&#39;if&#39;</span> <span class="nf">disjunction</span> <span class="k">&#39;else&#39;</span> <span class="nf">expression</span>
<span class="o">|</span> <span class="nf">disjunction</span>
<span class="o">|</span> <span class="nf">lambdef</span>
<span class="nf">yield_expr</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;yield&#39;</span> <span class="k">&#39;from&#39;</span> <span class="nf">expression</span>
<span class="o">|</span> <span class="k">&#39;yield&#39;</span> <span class="p">[</span><span class="nf">star_expressions</span><span class="p">]</span>
<span class="nf">star_expressions</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">star_expression</span> <span class="p">(</span>&#39;,&#39; <span class="nf">star_expression</span> <span class="p">)</span><span class="o">+</span> <span class="p">[</span>&#39;,&#39;<span class="p">]</span>
<span class="o">|</span> <span class="nf">star_expression</span> &#39;,&#39;
<span class="o">|</span> <span class="nf">star_expression</span>
<span class="nf">star_expression</span><span class="p">:</span>
<span class="o">|</span> &#39;*&#39; <span class="nf">bitwise_or</span>
<span class="o">|</span> <span class="nf">expression</span>
<span class="nf">star_named_expressions</span><span class="p">:</span> &#39;,&#39;<span class="o">.</span><span class="nf">star_named_expression</span><span class="o">+</span> <span class="p">[</span>&#39;,&#39;<span class="p">]</span>
<span class="nf">star_named_expression</span><span class="p">:</span>
<span class="o">|</span> &#39;*&#39; <span class="nf">bitwise_or</span>
<span class="o">|</span> <span class="nf">named_expression</span>
<span class="nf">assignment_expression</span><span class="p">:</span>
<span class="o">|</span> NAME &#39;:=&#39; ~ <span class="nf">expression</span>
<span class="nf">named_expression</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">assignment_expression</span>
<span class="o">|</span> <span class="nf">expression</span> !&#39;:=&#39;
<span class="nf">disjunction</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">conjunction</span> <span class="p">(</span><span class="k">&#39;or&#39;</span> <span class="nf">conjunction</span> <span class="p">)</span><span class="o">+</span>
<span class="o">|</span> <span class="nf">conjunction</span>
<span class="nf">conjunction</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">inversion</span> <span class="p">(</span><span class="k">&#39;and&#39;</span> <span class="nf">inversion</span> <span class="p">)</span><span class="o">+</span>
<span class="o">|</span> <span class="nf">inversion</span>
<span class="nf">inversion</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;not&#39;</span> <span class="nf">inversion</span>
<span class="o">|</span> <span class="nf">comparison</span>
<span class="c c-Singleline"># Comparison operators</span>
<span class="c c-Singleline"># --------------------</span>
<span class="nf">comparison</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">bitwise_or</span> <span class="nf">compare_op_bitwise_or_pair</span><span class="o">+</span>
<span class="o">|</span> <span class="nf">bitwise_or</span>
<span class="nf">compare_op_bitwise_or_pair</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">eq_bitwise_or</span>
<span class="o">|</span> <span class="nf">noteq_bitwise_or</span>
<span class="o">|</span> <span class="nf">lte_bitwise_or</span>
<span class="o">|</span> <span class="nf">lt_bitwise_or</span>
<span class="o">|</span> <span class="nf">gte_bitwise_or</span>
<span class="o">|</span> <span class="nf">gt_bitwise_or</span>
<span class="o">|</span> <span class="nf">notin_bitwise_or</span>
<span class="o">|</span> <span class="nf">in_bitwise_or</span>
<span class="o">|</span> <span class="nf">isnot_bitwise_or</span>
<span class="o">|</span> <span class="nf">is_bitwise_or</span>
<span class="nf">eq_bitwise_or</span><span class="p">:</span> &#39;==&#39; <span class="nf">bitwise_or</span>
<span class="nf">noteq_bitwise_or</span><span class="p">:</span>
<span class="o">|</span> <span class="p">(</span>&#39;!=&#39; <span class="p">)</span> <span class="nf">bitwise_or</span>
<span class="nf">lte_bitwise_or</span><span class="p">:</span> &#39;&lt;=&#39; <span class="nf">bitwise_or</span>
<span class="nf">lt_bitwise_or</span><span class="p">:</span> &#39;&lt;&#39; <span class="nf">bitwise_or</span>
<span class="nf">gte_bitwise_or</span><span class="p">:</span> &#39;&gt;=&#39; <span class="nf">bitwise_or</span>
<span class="nf">gt_bitwise_or</span><span class="p">:</span> &#39;&gt;&#39; <span class="nf">bitwise_or</span>
<span class="nf">notin_bitwise_or</span><span class="p">:</span> <span class="k">&#39;not&#39;</span> <span class="k">&#39;in&#39;</span> <span class="nf">bitwise_or</span>
<span class="nf">in_bitwise_or</span><span class="p">:</span> <span class="k">&#39;in&#39;</span> <span class="nf">bitwise_or</span>
<span class="nf">isnot_bitwise_or</span><span class="p">:</span> <span class="k">&#39;is&#39;</span> <span class="k">&#39;not&#39;</span> <span class="nf">bitwise_or</span>
<span class="nf">is_bitwise_or</span><span class="p">:</span> <span class="k">&#39;is&#39;</span> <span class="nf">bitwise_or</span>
<span class="c c-Singleline"># Bitwise operators</span>
<span class="c c-Singleline"># -----------------</span>
<span class="nf">bitwise_or</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">bitwise_or</span> &#39;|&#39; <span class="nf">bitwise_xor</span>
<span class="o">|</span> <span class="nf">bitwise_xor</span>
<span class="nf">bitwise_xor</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">bitwise_xor</span> &#39;^&#39; <span class="nf">bitwise_and</span>
<span class="o">|</span> <span class="nf">bitwise_and</span>
<span class="nf">bitwise_and</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">bitwise_and</span> &#39;&amp;&#39; <span class="nf">shift_expr</span>
<span class="o">|</span> <span class="nf">shift_expr</span>
<span class="nf">shift_expr</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">shift_expr</span> &#39;&lt;&lt;&#39; <span class="nf">sum</span>
<span class="o">|</span> <span class="nf">shift_expr</span> &#39;&gt;&gt;&#39; <span class="nf">sum</span>
<span class="o">|</span> <span class="nf">sum</span>
<span class="c c-Singleline"># Arithmetic operators</span>
<span class="c c-Singleline"># --------------------</span>
<span class="nf">sum</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">sum</span> &#39;+&#39; <span class="nf">term</span>
<span class="o">|</span> <span class="nf">sum</span> &#39;-&#39; <span class="nf">term</span>
<span class="o">|</span> <span class="nf">term</span>
<span class="nf">term</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">term</span> &#39;*&#39; <span class="nf">factor</span>
<span class="o">|</span> <span class="nf">term</span> &#39;/&#39; <span class="nf">factor</span>
<span class="o">|</span> <span class="nf">term</span> &#39;//&#39; <span class="nf">factor</span>
<span class="o">|</span> <span class="nf">term</span> &#39;%&#39; <span class="nf">factor</span>
<span class="o">|</span> <span class="nf">term</span> &#39;@&#39; <span class="nf">factor</span>
<span class="o">|</span> <span class="nf">factor</span>
<span class="nf">factor</span><span class="p">:</span>
<span class="o">|</span> &#39;+&#39; <span class="nf">factor</span>
<span class="o">|</span> &#39;-&#39; <span class="nf">factor</span>
<span class="o">|</span> &#39;~&#39; <span class="nf">factor</span>
<span class="o">|</span> <span class="nf">power</span>
<span class="nf">power</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">await_primary</span> &#39;**&#39; <span class="nf">factor</span>
<span class="o">|</span> <span class="nf">await_primary</span>
<span class="c c-Singleline"># Primary elements</span>
<span class="c c-Singleline"># ----------------</span>
<span class="c c-Singleline"># Primary elements are things like &quot;obj.something.something&quot;, &quot;obj[something]&quot;, &quot;obj(something)&quot;, &quot;obj&quot; ...</span>
<span class="nf">await_primary</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;await&#39;</span> <span class="nf">primary</span>
<span class="o">|</span> <span class="nf">primary</span>
<span class="nf">primary</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">primary</span> &#39;.&#39; NAME
<span class="o">|</span> <span class="nf">primary</span> <span class="nf">genexp</span>
<span class="o">|</span> <span class="nf">primary</span> &#39;(&#39; <span class="p">[</span><span class="nf">arguments</span><span class="p">]</span> &#39;)&#39;
<span class="o">|</span> <span class="nf">primary</span> &#39;[&#39; <span class="nf">slices</span> &#39;]&#39;
<span class="o">|</span> <span class="nf">atom</span>
<span class="nf">slices</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">slice</span> !&#39;,&#39;
<span class="o">|</span> &#39;,&#39;<span class="o">.</span><span class="p">(</span><span class="nf">slice</span> <span class="o">|</span> <span class="nf">starred_expression</span><span class="p">)</span><span class="o">+</span> <span class="p">[</span>&#39;,&#39;<span class="p">]</span>
<span class="nf">slice</span><span class="p">:</span>
<span class="o">|</span> <span class="p">[</span><span class="nf">expression</span><span class="p">]</span> &#39;:&#39; <span class="p">[</span><span class="nf">expression</span><span class="p">]</span> <span class="p">[</span>&#39;:&#39; <span class="p">[</span><span class="nf">expression</span><span class="p">]</span> <span class="p">]</span>
<span class="o">|</span> <span class="nf">named_expression</span>
<span class="nf">atom</span><span class="p">:</span>
<span class="o">|</span> NAME
<span class="o">|</span> <span class="k">&#39;True&#39;</span>
<span class="o">|</span> <span class="k">&#39;False&#39;</span>
<span class="o">|</span> <span class="k">&#39;None&#39;</span>
<span class="o">|</span> <span class="nf">strings</span>
<span class="o">|</span> NUMBER
<span class="o">|</span> <span class="p">(</span><span class="nf">tuple</span> <span class="o">|</span> <span class="nf">group</span> <span class="o">|</span> <span class="nf">genexp</span><span class="p">)</span>
<span class="o">|</span> <span class="p">(</span><span class="nf">list</span> <span class="o">|</span> <span class="nf">listcomp</span><span class="p">)</span>
<span class="o">|</span> <span class="p">(</span><span class="nf">dict</span> <span class="o">|</span> <span class="nf">set</span> <span class="o">|</span> <span class="nf">dictcomp</span> <span class="o">|</span> <span class="nf">setcomp</span><span class="p">)</span>
<span class="o">|</span> &#39;...&#39;
<span class="nf">group</span><span class="p">:</span>
<span class="o">|</span> &#39;(&#39; <span class="p">(</span><span class="nf">yield_expr</span> <span class="o">|</span> <span class="nf">named_expression</span><span class="p">)</span> &#39;)&#39;
<span class="c c-Singleline"># Lambda functions</span>
<span class="c c-Singleline"># ----------------</span>
<span class="nf">lambdef</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;lambda&#39;</span> <span class="p">[</span><span class="nf">lambda_params</span><span class="p">]</span> &#39;:&#39; <span class="nf">expression</span>
<span class="nf">lambda_params</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">lambda_parameters</span>
<span class="c c-Singleline"># lambda_parameters etc. duplicates parameters but without annotations</span>
<span class="c c-Singleline"># or type comments, and if there&#39;s no comma after a parameter, we expect</span>
<span class="c c-Singleline"># a colon, not a close parenthesis. (For more, see parameters above.)</span>
<span class="c c-Singleline">#</span>
<span class="nf">lambda_parameters</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">lambda_slash_no_default</span> <span class="nf">lambda_param_no_default</span><span class="o">*</span> <span class="nf">lambda_param_with_default</span><span class="o">*</span> <span class="p">[</span><span class="nf">lambda_star_etc</span><span class="p">]</span>
<span class="o">|</span> <span class="nf">lambda_slash_with_default</span> <span class="nf">lambda_param_with_default</span><span class="o">*</span> <span class="p">[</span><span class="nf">lambda_star_etc</span><span class="p">]</span>
<span class="o">|</span> <span class="nf">lambda_param_no_default</span><span class="o">+</span> <span class="nf">lambda_param_with_default</span><span class="o">*</span> <span class="p">[</span><span class="nf">lambda_star_etc</span><span class="p">]</span>
<span class="o">|</span> <span class="nf">lambda_param_with_default</span><span class="o">+</span> <span class="p">[</span><span class="nf">lambda_star_etc</span><span class="p">]</span>
<span class="o">|</span> <span class="nf">lambda_star_etc</span>
<span class="nf">lambda_slash_no_default</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">lambda_param_no_default</span><span class="o">+</span> &#39;/&#39; &#39;,&#39;
<span class="o">|</span> <span class="nf">lambda_param_no_default</span><span class="o">+</span> &#39;/&#39; &amp;&#39;:&#39;
<span class="nf">lambda_slash_with_default</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">lambda_param_no_default</span><span class="o">*</span> <span class="nf">lambda_param_with_default</span><span class="o">+</span> &#39;/&#39; &#39;,&#39;
<span class="o">|</span> <span class="nf">lambda_param_no_default</span><span class="o">*</span> <span class="nf">lambda_param_with_default</span><span class="o">+</span> &#39;/&#39; &amp;&#39;:&#39;
<span class="nf">lambda_star_etc</span><span class="p">:</span>
<span class="o">|</span> &#39;*&#39; <span class="nf">lambda_param_no_default</span> <span class="nf">lambda_param_maybe_default</span><span class="o">*</span> <span class="p">[</span><span class="nf">lambda_kwds</span><span class="p">]</span>
<span class="o">|</span> &#39;*&#39; &#39;,&#39; <span class="nf">lambda_param_maybe_default</span><span class="o">+</span> <span class="p">[</span><span class="nf">lambda_kwds</span><span class="p">]</span>
<span class="o">|</span> <span class="nf">lambda_kwds</span>
<span class="nf">lambda_kwds</span><span class="p">:</span>
<span class="o">|</span> &#39;**&#39; <span class="nf">lambda_param_no_default</span>
<span class="nf">lambda_param_no_default</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">lambda_param</span> &#39;,&#39;
<span class="o">|</span> <span class="nf">lambda_param</span> &amp;&#39;:&#39;
<span class="nf">lambda_param_with_default</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">lambda_param</span> <span class="nf">default</span> &#39;,&#39;
<span class="o">|</span> <span class="nf">lambda_param</span> <span class="nf">default</span> &amp;&#39;:&#39;
<span class="nf">lambda_param_maybe_default</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">lambda_param</span> <span class="nf">default</span><span class="o">?</span> &#39;,&#39;
<span class="o">|</span> <span class="nf">lambda_param</span> <span class="nf">default</span><span class="o">?</span> &amp;&#39;:&#39;
<span class="nf">lambda_param</span><span class="p">:</span> NAME
<span class="c c-Singleline"># LITERALS</span>
<span class="c c-Singleline"># ========</span>
<span class="nf">fstring_middle</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">fstring_replacement_field</span>
<span class="o">|</span> FSTRING_MIDDLE
<span class="nf">fstring_replacement_field</span><span class="p">:</span>
<span class="o">|</span> &#39;{&#39; <span class="nf">annotated_rhs</span> &#39;=&#39;<span class="o">?</span> <span class="p">[</span><span class="nf">fstring_conversion</span><span class="p">]</span> <span class="p">[</span><span class="nf">fstring_full_format_spec</span><span class="p">]</span> &#39;}&#39;
<span class="nf">fstring_conversion</span><span class="p">:</span>
<span class="o">|</span> &quot;!&quot; NAME
<span class="nf">fstring_full_format_spec</span><span class="p">:</span>
<span class="o">|</span> &#39;:&#39; <span class="nf">fstring_format_spec</span><span class="o">*</span>
<span class="nf">fstring_format_spec</span><span class="p">:</span>
<span class="o">|</span> FSTRING_MIDDLE
<span class="o">|</span> <span class="nf">fstring_replacement_field</span>
<span class="nf">fstring</span><span class="p">:</span>
<span class="o">|</span> FSTRING_START <span class="nf">fstring_middle</span><span class="o">*</span> FSTRING_END
<span class="nf">string</span><span class="p">:</span> STRING
<span class="nf">strings</span><span class="p">:</span> <span class="p">(</span><span class="nf">fstring</span><span class="o">|</span><span class="nf">string</span><span class="p">)</span><span class="o">+</span>
<span class="nf">list</span><span class="p">:</span>
<span class="o">|</span> &#39;[&#39; <span class="p">[</span><span class="nf">star_named_expressions</span><span class="p">]</span> &#39;]&#39;
<span class="nf">tuple</span><span class="p">:</span>
<span class="o">|</span> &#39;(&#39; <span class="p">[</span><span class="nf">star_named_expression</span> &#39;,&#39; <span class="p">[</span><span class="nf">star_named_expressions</span><span class="p">]</span> <span class="p">]</span> &#39;)&#39;
<span class="nf">set</span><span class="p">:</span> &#39;{&#39; <span class="nf">star_named_expressions</span> &#39;}&#39;
<span class="c c-Singleline"># Dicts</span>
<span class="c c-Singleline"># -----</span>
<span class="nf">dict</span><span class="p">:</span>
<span class="o">|</span> &#39;{&#39; <span class="p">[</span><span class="nf">double_starred_kvpairs</span><span class="p">]</span> &#39;}&#39;
<span class="nf">double_starred_kvpairs</span><span class="p">:</span> &#39;,&#39;<span class="o">.</span><span class="nf">double_starred_kvpair</span><span class="o">+</span> <span class="p">[</span>&#39;,&#39;<span class="p">]</span>
<span class="nf">double_starred_kvpair</span><span class="p">:</span>
<span class="o">|</span> &#39;**&#39; <span class="nf">bitwise_or</span>
<span class="o">|</span> <span class="nf">kvpair</span>
<span class="nf">kvpair</span><span class="p">:</span> <span class="nf">expression</span> &#39;:&#39; <span class="nf">expression</span>
<span class="c c-Singleline"># Comprehensions &amp; Generators</span>
<span class="c c-Singleline"># ---------------------------</span>
<span class="nf">for_if_clauses</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">for_if_clause</span><span class="o">+</span>
<span class="nf">for_if_clause</span><span class="p">:</span>
<span class="o">|</span> <span class="k">&#39;async&#39;</span> <span class="k">&#39;for&#39;</span> <span class="nf">star_targets</span> <span class="k">&#39;in&#39;</span> ~ <span class="nf">disjunction</span> <span class="p">(</span><span class="k">&#39;if&#39;</span> <span class="nf">disjunction</span> <span class="p">)</span><span class="o">*</span>
<span class="o">|</span> <span class="k">&#39;for&#39;</span> <span class="nf">star_targets</span> <span class="k">&#39;in&#39;</span> ~ <span class="nf">disjunction</span> <span class="p">(</span><span class="k">&#39;if&#39;</span> <span class="nf">disjunction</span> <span class="p">)</span><span class="o">*</span>
<span class="nf">listcomp</span><span class="p">:</span>
<span class="o">|</span> &#39;[&#39; <span class="nf">named_expression</span> <span class="nf">for_if_clauses</span> &#39;]&#39;
<span class="nf">setcomp</span><span class="p">:</span>
<span class="o">|</span> &#39;{&#39; <span class="nf">named_expression</span> <span class="nf">for_if_clauses</span> &#39;}&#39;
<span class="nf">genexp</span><span class="p">:</span>
<span class="o">|</span> &#39;(&#39; <span class="p">(</span> <span class="nf">assignment_expression</span> <span class="o">|</span> <span class="nf">expression</span> !&#39;:=&#39;<span class="p">)</span> <span class="nf">for_if_clauses</span> &#39;)&#39;
<span class="nf">dictcomp</span><span class="p">:</span>
<span class="o">|</span> &#39;{&#39; <span class="nf">kvpair</span> <span class="nf">for_if_clauses</span> &#39;}&#39;
<span class="c c-Singleline"># FUNCTION CALL ARGUMENTS</span>
<span class="c c-Singleline"># =======================</span>
<span class="nf">arguments</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">args</span> <span class="p">[</span>&#39;,&#39;<span class="p">]</span> &amp;&#39;)&#39;
<span class="nf">args</span><span class="p">:</span>
<span class="o">|</span> &#39;,&#39;<span class="o">.</span><span class="p">(</span><span class="nf">starred_expression</span> <span class="o">|</span> <span class="p">(</span> <span class="nf">assignment_expression</span> <span class="o">|</span> <span class="nf">expression</span> !&#39;:=&#39;<span class="p">)</span> !&#39;=&#39;<span class="p">)</span><span class="o">+</span> <span class="p">[</span>&#39;,&#39; <span class="nf">kwargs</span> <span class="p">]</span>
<span class="o">|</span> <span class="nf">kwargs</span>
<span class="nf">kwargs</span><span class="p">:</span>
<span class="o">|</span> &#39;,&#39;<span class="o">.</span><span class="nf">kwarg_or_starred</span><span class="o">+</span> &#39;,&#39; &#39;,&#39;<span class="o">.</span><span class="nf">kwarg_or_double_starred</span><span class="o">+</span>
<span class="o">|</span> &#39;,&#39;<span class="o">.</span><span class="nf">kwarg_or_starred</span><span class="o">+</span>
<span class="o">|</span> &#39;,&#39;<span class="o">.</span><span class="nf">kwarg_or_double_starred</span><span class="o">+</span>
<span class="nf">starred_expression</span><span class="p">:</span>
<span class="o">|</span> &#39;*&#39; <span class="nf">expression</span>
<span class="nf">kwarg_or_starred</span><span class="p">:</span>
<span class="o">|</span> NAME &#39;=&#39; <span class="nf">expression</span>
<span class="o">|</span> <span class="nf">starred_expression</span>
<span class="nf">kwarg_or_double_starred</span><span class="p">:</span>
<span class="o">|</span> NAME &#39;=&#39; <span class="nf">expression</span>
<span class="o">|</span> &#39;**&#39; <span class="nf">expression</span>
<span class="c c-Singleline"># ASSIGNMENT TARGETS</span>
<span class="c c-Singleline"># ==================</span>
<span class="c c-Singleline"># Generic targets</span>
<span class="c c-Singleline"># ---------------</span>
<span class="c c-Singleline"># NOTE: star_targets may contain *bitwise_or, targets may not.</span>
<span class="nf">star_targets</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">star_target</span> !&#39;,&#39;
<span class="o">|</span> <span class="nf">star_target</span> <span class="p">(</span>&#39;,&#39; <span class="nf">star_target</span> <span class="p">)</span><span class="o">*</span> <span class="p">[</span>&#39;,&#39;<span class="p">]</span>
<span class="nf">star_targets_list_seq</span><span class="p">:</span> &#39;,&#39;<span class="o">.</span><span class="nf">star_target</span><span class="o">+</span> <span class="p">[</span>&#39;,&#39;<span class="p">]</span>
<span class="nf">star_targets_tuple_seq</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">star_target</span> <span class="p">(</span>&#39;,&#39; <span class="nf">star_target</span> <span class="p">)</span><span class="o">+</span> <span class="p">[</span>&#39;,&#39;<span class="p">]</span>
<span class="o">|</span> <span class="nf">star_target</span> &#39;,&#39;
<span class="nf">star_target</span><span class="p">:</span>
<span class="o">|</span> &#39;*&#39; <span class="p">(</span>!&#39;*&#39; <span class="nf">star_target</span><span class="p">)</span>
<span class="o">|</span> <span class="nf">target_with_star_atom</span>
<span class="nf">target_with_star_atom</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">t_primary</span> &#39;.&#39; NAME !<span class="nf">t_lookahead</span>
<span class="o">|</span> <span class="nf">t_primary</span> &#39;[&#39; <span class="nf">slices</span> &#39;]&#39; !<span class="nf">t_lookahead</span>
<span class="o">|</span> <span class="nf">star_atom</span>
<span class="nf">star_atom</span><span class="p">:</span>
<span class="o">|</span> NAME
<span class="o">|</span> &#39;(&#39; <span class="nf">target_with_star_atom</span> &#39;)&#39;
<span class="o">|</span> &#39;(&#39; <span class="p">[</span><span class="nf">star_targets_tuple_seq</span><span class="p">]</span> &#39;)&#39;
<span class="o">|</span> &#39;[&#39; <span class="p">[</span><span class="nf">star_targets_list_seq</span><span class="p">]</span> &#39;]&#39;
<span class="nf">single_target</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">single_subscript_attribute_target</span>
<span class="o">|</span> NAME
<span class="o">|</span> &#39;(&#39; <span class="nf">single_target</span> &#39;)&#39;
<span class="nf">single_subscript_attribute_target</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">t_primary</span> &#39;.&#39; NAME !<span class="nf">t_lookahead</span>
<span class="o">|</span> <span class="nf">t_primary</span> &#39;[&#39; <span class="nf">slices</span> &#39;]&#39; !<span class="nf">t_lookahead</span>
<span class="nf">t_primary</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">t_primary</span> &#39;.&#39; NAME &amp;<span class="nf">t_lookahead</span>
<span class="o">|</span> <span class="nf">t_primary</span> &#39;[&#39; <span class="nf">slices</span> &#39;]&#39; &amp;<span class="nf">t_lookahead</span>
<span class="o">|</span> <span class="nf">t_primary</span> <span class="nf">genexp</span> &amp;<span class="nf">t_lookahead</span>
<span class="o">|</span> <span class="nf">t_primary</span> &#39;(&#39; <span class="p">[</span><span class="nf">arguments</span><span class="p">]</span> &#39;)&#39; &amp;<span class="nf">t_lookahead</span>
<span class="o">|</span> <span class="nf">atom</span> &amp;<span class="nf">t_lookahead</span>
<span class="nf">t_lookahead</span><span class="p">:</span> &#39;(&#39; <span class="o">|</span> &#39;[&#39; <span class="o">|</span> &#39;.&#39;
<span class="c c-Singleline"># Targets for del statements</span>
<span class="c c-Singleline"># --------------------------</span>
<span class="nf">del_targets</span><span class="p">:</span> &#39;,&#39;<span class="o">.</span><span class="nf">del_target</span><span class="o">+</span> <span class="p">[</span>&#39;,&#39;<span class="p">]</span>
<span class="nf">del_target</span><span class="p">:</span>
<span class="o">|</span> <span class="nf">t_primary</span> &#39;.&#39; NAME !<span class="nf">t_lookahead</span>
<span class="o">|</span> <span class="nf">t_primary</span> &#39;[&#39; <span class="nf">slices</span> &#39;]&#39; !<span class="nf">t_lookahead</span>
<span class="o">|</span> <span class="nf">del_t_atom</span>
<span class="nf">del_t_atom</span><span class="p">:</span>
<span class="o">|</span> NAME
<span class="o">|</span> &#39;(&#39; <span class="nf">del_target</span> &#39;)&#39;
<span class="o">|</span> &#39;(&#39; <span class="p">[</span><span class="nf">del_targets</span><span class="p">]</span> &#39;)&#39;
<span class="o">|</span> &#39;[&#39; <span class="p">[</span><span class="nf">del_targets</span><span class="p">]</span> &#39;]&#39;
<span class="c c-Singleline"># TYPING ELEMENTS</span>
<span class="c c-Singleline"># ---------------</span>
<span class="c c-Singleline"># type_expressions allow */** but ignore them</span>
<span class="nf">type_expressions</span><span class="p">:</span>
<span class="o">|</span> &#39;,&#39;<span class="o">.</span><span class="nf">expression</span><span class="o">+</span> &#39;,&#39; &#39;*&#39; <span class="nf">expression</span> &#39;,&#39; &#39;**&#39; <span class="nf">expression</span>
<span class="o">|</span> &#39;,&#39;<span class="o">.</span><span class="nf">expression</span><span class="o">+</span> &#39;,&#39; &#39;*&#39; <span class="nf">expression</span>
<span class="o">|</span> &#39;,&#39;<span class="o">.</span><span class="nf">expression</span><span class="o">+</span> &#39;,&#39; &#39;**&#39; <span class="nf">expression</span>
<span class="o">|</span> &#39;*&#39; <span class="nf">expression</span> &#39;,&#39; &#39;**&#39; <span class="nf">expression</span>
<span class="o">|</span> &#39;*&#39; <span class="nf">expression</span>
<span class="o">|</span> &#39;**&#39; <span class="nf">expression</span>
<span class="o">|</span> &#39;,&#39;<span class="o">.</span><span class="nf">expression</span><span class="o">+</span>
<span class="nf">func_type_comment</span><span class="p">:</span>
<span class="o">|</span> NEWLINE TYPE_COMMENT &amp;<span class="p">(</span>NEWLINE INDENT<span class="p">)</span> <span class="c c-Singleline"># Must be followed by indented block</span>
<span class="o">|</span> TYPE_COMMENT
<span class="c c-Singleline"># ========================= END OF THE GRAMMAR ===========================</span>
<span class="c c-Singleline"># ========================= START OF INVALID RULES =======================</span>
</pre></div>
</div>
</section>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<div>
<h4>Previous topic</h4>
<p class="topless"><a href="toplevel_components.html"
title="previous chapter"><span class="section-number">9. </span>Top-level components</a></p>
</div>
<div>
<h4>Next topic</h4>
<p class="topless"><a href="../library/index.html"
title="next chapter">The Python Standard Library</a></p>
</div>
<div role="note" aria-label="source link">
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="../bugs.html">Report a Bug</a></li>
<li>
<a href="https://github.com/python/cpython/blob/main/Doc/reference/grammar.rst"
rel="nofollow">Show Source
</a>
</li>
</ul>
</div>
</div>
<div id="sidebarbutton" title="Collapse sidebar">
<span>«</span>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="Related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="../library/index.html" title="The Python Standard Library"
>next</a> |</li>
<li class="right" >
<a href="toplevel_components.html" title="9. Top-level components"
>previous</a> |</li>
<li><img src="../_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"/></li>
<li><a href="https://www.python.org/">Python</a> &#187;</li>
<li class="switchers">
<div class="language_switcher_placeholder"></div>
<div class="version_switcher_placeholder"></div>
</li>
<li>
</li>
<li id="cpython-language-and-version">
<a href="../index.html">3.13.3 Documentation</a> &#187;
</li>
<li class="nav-item nav-item-1"><a href="index.html" >The Python Language Reference</a> &#187;</li>
<li class="nav-item nav-item-this"><a href=""><span class="section-number">10. </span>Full Grammar specification</a></li>
<li class="right">
<div class="inline-search" role="search">
<form class="inline-search" action="../search.html" method="get">
<input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box" />
<input type="submit" value="Go" />
</form>
</div>
|
</li>
<li class="right">
<label class="theme-selector-label">
Theme
<select class="theme-selector" oninput="activateTheme(this.value)">
<option value="auto" selected>Auto</option>
<option value="light">Light</option>
<option value="dark">Dark</option>
</select>
</label> |</li>
</ul>
</div>
<div class="footer">
&copy;
<a href="../copyright.html">
Copyright
</a>
2001-2025, Python Software Foundation.
<br />
This page is licensed under the Python Software Foundation License Version 2.
<br />
Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
<br />
See <a href="/license.html">History and License</a> for more information.<br />
<br />
The Python Software Foundation is a non-profit corporation.
<a href="https://www.python.org/psf/donations/">Please donate.</a>
<br />
<br />
Last updated on Apr 08, 2025 (14:33 UTC).
<a href="/bugs.html">Found a bug</a>?
<br />
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
</div>
</body>
</html>