592 lines
46 KiB
HTML
592 lines
46 KiB
HTML
|
|
<!DOCTYPE html>
|
|
|
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh_CN">
|
|
<head>
|
|
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
|
|
|
|
<title>parser --- 访问 Python 解析树 — Python 3.8.20 文档</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
|
|
<link rel="stylesheet" href="../_static/pydoctheme.css" type="text/css" />
|
|
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
|
|
|
<script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
|
|
<script src="../_static/jquery.js"></script>
|
|
<script src="../_static/underscore.js"></script>
|
|
<script src="../_static/doctools.js"></script>
|
|
<script src="../_static/language_data.js"></script>
|
|
<script src="../_static/translations.js"></script>
|
|
|
|
<script src="../_static/sidebar.js"></script>
|
|
|
|
<link rel="search" type="application/opensearchdescription+xml"
|
|
title="在 Python 3.8.20 文档 中搜索"
|
|
href="../_static/opensearch.xml"/>
|
|
<link rel="author" title="关于这些文档" href="../about.html" />
|
|
<link rel="index" title="索引" href="../genindex.html" />
|
|
<link rel="search" title="搜索" href="../search.html" />
|
|
<link rel="copyright" title="版权所有" href="../copyright.html" />
|
|
<link rel="next" title="ast --- 抽象语法树" href="ast.html" />
|
|
<link rel="prev" title="Python 语言服务" href="language.html" />
|
|
<link rel="canonical" href="https://docs.python.org/3/library/parser.html" />
|
|
|
|
|
|
|
|
|
|
|
|
<style>
|
|
@media only screen {
|
|
table.full-width-table {
|
|
width: 100%;
|
|
}
|
|
}
|
|
</style>
|
|
<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>
|
|
|
|
</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" />
|
|
<label for="menuToggler" class="toggler__label">
|
|
<span></span>
|
|
</label>
|
|
<nav class="nav-content" role="navigation">
|
|
<a href="https://www.python.org/" class="nav-logo">
|
|
<img src="../_static/py.svg" alt="Logo"/>
|
|
</a>
|
|
<div class="version_switcher_placeholder"></div>
|
|
<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"
|
|
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" fill="#444"></path>
|
|
</svg>
|
|
<input type="text" name="q" aria-label="快速搜索"/>
|
|
<input type="submit" value="转向"/>
|
|
</form>
|
|
</nav>
|
|
<div class="menu-wrapper">
|
|
<nav class="menu" role="navigation" aria-label="main navigation">
|
|
<div class="language_switcher_placeholder"></div>
|
|
<h3><a href="../contents.html">目录</a></h3>
|
|
<ul>
|
|
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">parser</span></code> --- 访问 Python 解析树</a><ul>
|
|
<li><a class="reference internal" href="#creating-st-objects">创建 ST 对象</a></li>
|
|
<li><a class="reference internal" href="#converting-st-objects">转换 ST 对象</a></li>
|
|
<li><a class="reference internal" href="#queries-on-st-objects">Queries on ST Objects</a></li>
|
|
<li><a class="reference internal" href="#exceptions-and-error-handling">异常和错误处理</a></li>
|
|
<li><a class="reference internal" href="#st-objects">ST 对象</a></li>
|
|
<li><a class="reference internal" href="#example-emulation-of-compile">示例: <code class="xref py py-func docutils literal notranslate"><span class="pre">compile()</span></code> 的模拟</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
|
|
<h4>上一个主题</h4>
|
|
<p class="topless"><a href="language.html"
|
|
title="上一章">Python 语言服务</a></p>
|
|
<h4>下一个主题</h4>
|
|
<p class="topless"><a href="ast.html"
|
|
title="下一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">ast</span></code> --- 抽象语法树</a></p>
|
|
<div role="note" aria-label="source link">
|
|
<h3>本页</h3>
|
|
<ul class="this-page-menu">
|
|
<li><a href="../bugs.html">报告 Bug</a></li>
|
|
<li>
|
|
<a href="https://github.com/python/cpython/blob/3.8/Doc/library/parser.rst"
|
|
rel="nofollow">显示源代码
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outdated-warning" style="padding: .5em; text-align: center; background-color: #FFBABA; color: #6A0E0E;">
|
|
这个文档所针对的是一个已不再受支持的 Python 旧版本。
|
|
你应当升级版本,并阅读
|
|
<a href="/3/library/parser.html"> Python 当前稳定版本的文档</a>.
|
|
</div>
|
|
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>导航</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../genindex.html" title="总目录"
|
|
accesskey="I">索引</a></li>
|
|
<li class="right" >
|
|
<a href="../py-modindex.html" title="Python 模块索引"
|
|
>模块</a> |</li>
|
|
<li class="right" >
|
|
<a href="ast.html" title="ast --- 抽象语法树"
|
|
accesskey="N">下一页</a> |</li>
|
|
<li class="right" >
|
|
<a href="language.html" title="Python 语言服务"
|
|
accesskey="P">上一页</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> »</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.8.20 Documentation</a> »
|
|
</li>
|
|
|
|
<li class="nav-item nav-item-1"><a href="index.html" >Python 标准库</a> »</li>
|
|
<li class="nav-item nav-item-2"><a href="language.html" accesskey="U">Python 语言服务</a> »</li>
|
|
<li class="right">
|
|
|
|
|
|
<div class="inline-search" role="search">
|
|
<form class="inline-search" action="../search.html" method="get">
|
|
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
|
|
<input type="submit" value="转向" />
|
|
<input type="hidden" name="check_keywords" value="yes" />
|
|
<input type="hidden" name="area" value="default" />
|
|
</form>
|
|
</div>
|
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="document">
|
|
<div class="documentwrapper">
|
|
<div class="bodywrapper">
|
|
<div class="body" role="main">
|
|
|
|
<section id="module-parser">
|
|
<span id="parser-access-python-parse-trees"></span><h1><a class="reference internal" href="#module-parser" title="parser: Access parse trees for Python source code."><code class="xref py py-mod docutils literal notranslate"><span class="pre">parser</span></code></a> --- 访问 Python 解析树<a class="headerlink" href="#module-parser" title="永久链接至标题">¶</a></h1>
|
|
<hr class="docutils" id="index-0" />
|
|
<p>The <a class="reference internal" href="#module-parser" title="parser: Access parse trees for Python source code."><code class="xref py py-mod docutils literal notranslate"><span class="pre">parser</span></code></a> module provides an interface to Python's internal parser and
|
|
byte-code compiler. The primary purpose for this interface is to allow Python
|
|
code to edit the parse tree of a Python expression and create executable code
|
|
from this. This is better than trying to parse and modify an arbitrary Python
|
|
code fragment as a string because parsing is performed in a manner identical to
|
|
the code forming the application. It is also faster.</p>
|
|
<div class="admonition note">
|
|
<p class="admonition-title">注解</p>
|
|
<p>From Python 2.5 onward, it's much more convenient to cut in at the Abstract
|
|
Syntax Tree (AST) generation and compilation stage, using the <a class="reference internal" href="ast.html#module-ast" title="ast: Abstract Syntax Tree classes and manipulation."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ast</span></code></a>
|
|
module.</p>
|
|
</div>
|
|
<p>There are a few things to note about this module which are important to making
|
|
use of the data structures created. This is not a tutorial on editing the parse
|
|
trees for Python code, but some examples of using the <a class="reference internal" href="#module-parser" title="parser: Access parse trees for Python source code."><code class="xref py py-mod docutils literal notranslate"><span class="pre">parser</span></code></a> module are
|
|
presented.</p>
|
|
<p>Most importantly, a good understanding of the Python grammar processed by the
|
|
internal parser is required. For full information on the language syntax, refer
|
|
to <a class="reference internal" href="../reference/index.html#reference-index"><span class="std std-ref">Python语言参考</span></a>. The parser
|
|
itself is created from a grammar specification defined in the file
|
|
<code class="file docutils literal notranslate"><span class="pre">Grammar/Grammar</span></code> in the standard Python distribution. The parse trees
|
|
stored in the ST objects created by this module are the actual output from the
|
|
internal parser when created by the <a class="reference internal" href="#parser.expr" title="parser.expr"><code class="xref py py-func docutils literal notranslate"><span class="pre">expr()</span></code></a> or <a class="reference internal" href="#parser.suite" title="parser.suite"><code class="xref py py-func docutils literal notranslate"><span class="pre">suite()</span></code></a> functions,
|
|
described below. The ST objects created by <a class="reference internal" href="#parser.sequence2st" title="parser.sequence2st"><code class="xref py py-func docutils literal notranslate"><span class="pre">sequence2st()</span></code></a> faithfully
|
|
simulate those structures. Be aware that the values of the sequences which are
|
|
considered "correct" will vary from one version of Python to another as the
|
|
formal grammar for the language is revised. However, transporting code from one
|
|
Python version to another as source text will always allow correct parse trees
|
|
to be created in the target version, with the only restriction being that
|
|
migrating to an older version of the interpreter will not support more recent
|
|
language constructs. The parse trees are not typically compatible from one
|
|
version to another, though source code has usually been forward-compatible within
|
|
a major release series.</p>
|
|
<p>Each element of the sequences returned by <a class="reference internal" href="#parser.st2list" title="parser.st2list"><code class="xref py py-func docutils literal notranslate"><span class="pre">st2list()</span></code></a> or <a class="reference internal" href="#parser.st2tuple" title="parser.st2tuple"><code class="xref py py-func docutils literal notranslate"><span class="pre">st2tuple()</span></code></a>
|
|
has a simple form. Sequences representing non-terminal elements in the grammar
|
|
always have a length greater than one. The first element is an integer which
|
|
identifies a production in the grammar. These integers are given symbolic names
|
|
in the C header file <code class="file docutils literal notranslate"><span class="pre">Include/graminit.h</span></code> and the Python module
|
|
<a class="reference internal" href="symbol.html#module-symbol" title="symbol: Constants representing internal nodes of the parse tree."><code class="xref py py-mod docutils literal notranslate"><span class="pre">symbol</span></code></a>. Each additional element of the sequence represents a component
|
|
of the production as recognized in the input string: these are always sequences
|
|
which have the same form as the parent. An important aspect of this structure
|
|
which should be noted is that keywords used to identify the parent node type,
|
|
such as the keyword <a class="reference internal" href="../reference/compound_stmts.html#if"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">if</span></code></a> in an <code class="xref py py-const docutils literal notranslate"><span class="pre">if_stmt</span></code>, are included in the
|
|
node tree without any special treatment. For example, the <code class="xref std std-keyword docutils literal notranslate"><span class="pre">if</span></code> keyword
|
|
is represented by the tuple <code class="docutils literal notranslate"><span class="pre">(1,</span> <span class="pre">'if')</span></code>, where <code class="docutils literal notranslate"><span class="pre">1</span></code> is the numeric value
|
|
associated with all <code class="xref py py-const docutils literal notranslate"><span class="pre">NAME</span></code> tokens, including variable and function names
|
|
defined by the user. In an alternate form returned when line number information
|
|
is requested, the same token might be represented as <code class="docutils literal notranslate"><span class="pre">(1,</span> <span class="pre">'if',</span> <span class="pre">12)</span></code>, where
|
|
the <code class="docutils literal notranslate"><span class="pre">12</span></code> represents the line number at which the terminal symbol was found.</p>
|
|
<p>Terminal elements are represented in much the same way, but without any child
|
|
elements and the addition of the source text which was identified. The example
|
|
of the <a class="reference internal" href="../reference/compound_stmts.html#if"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">if</span></code></a> keyword above is representative. The various types of
|
|
terminal symbols are defined in the C header file <code class="file docutils literal notranslate"><span class="pre">Include/token.h</span></code> and
|
|
the Python module <a class="reference internal" href="token.html#module-token" title="token: Constants representing terminal nodes of the parse tree."><code class="xref py py-mod docutils literal notranslate"><span class="pre">token</span></code></a>.</p>
|
|
<p>The ST objects are not required to support the functionality of this module,
|
|
but are provided for three purposes: to allow an application to amortize the
|
|
cost of processing complex parse trees, to provide a parse tree representation
|
|
which conserves memory space when compared to the Python list or tuple
|
|
representation, and to ease the creation of additional modules in C which
|
|
manipulate parse trees. A simple "wrapper" class may be created in Python to
|
|
hide the use of ST objects.</p>
|
|
<p>The <a class="reference internal" href="#module-parser" title="parser: Access parse trees for Python source code."><code class="xref py py-mod docutils literal notranslate"><span class="pre">parser</span></code></a> module defines functions for a few distinct purposes. The
|
|
most important purposes are to create ST objects and to convert ST objects to
|
|
other representations such as parse trees and compiled code objects, but there
|
|
are also functions which serve to query the type of parse tree represented by an
|
|
ST object.</p>
|
|
<div class="admonition seealso">
|
|
<p class="admonition-title">参见</p>
|
|
<dl class="simple">
|
|
<dt>模块 <a class="reference internal" href="symbol.html#module-symbol" title="symbol: Constants representing internal nodes of the parse tree."><code class="xref py py-mod docutils literal notranslate"><span class="pre">symbol</span></code></a></dt><dd><p>代表解析树内部节点的有用常量。</p>
|
|
</dd>
|
|
<dt>模块 <a class="reference internal" href="token.html#module-token" title="token: Constants representing terminal nodes of the parse tree."><code class="xref py py-mod docutils literal notranslate"><span class="pre">token</span></code></a></dt><dd><p>代表解析树叶子节点和测试节点值的函数的有用常量。</p>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<section id="creating-st-objects">
|
|
<span id="creating-sts"></span><h2>创建 ST 对象<a class="headerlink" href="#creating-st-objects" title="永久链接至标题">¶</a></h2>
|
|
<p>ST对象可以由源代码或解析树创建。当ST对象由源代码创建时, 不同的函数将被创建``'eval'<code class="docutils literal notranslate"><span class="pre">和</span></code>'exec'``</p>
|
|
<dl class="function">
|
|
<dt id="parser.expr">
|
|
<code class="sig-prename descclassname">parser.</code><code class="sig-name descname">expr</code><span class="sig-paren">(</span><em class="sig-param">source</em><span class="sig-paren">)</span><a class="headerlink" href="#parser.expr" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>The <a class="reference internal" href="#parser.expr" title="parser.expr"><code class="xref py py-func docutils literal notranslate"><span class="pre">expr()</span></code></a> function parses the parameter <em>source</em> as if it were an input
|
|
to <code class="docutils literal notranslate"><span class="pre">compile(source,</span> <span class="pre">'file.py',</span> <span class="pre">'eval')</span></code>. If the parse succeeds, an ST object
|
|
is created to hold the internal parse tree representation, otherwise an
|
|
appropriate exception is raised.</p>
|
|
</dd></dl>
|
|
|
|
<dl class="function">
|
|
<dt id="parser.suite">
|
|
<code class="sig-prename descclassname">parser.</code><code class="sig-name descname">suite</code><span class="sig-paren">(</span><em class="sig-param">source</em><span class="sig-paren">)</span><a class="headerlink" href="#parser.suite" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>The <a class="reference internal" href="#parser.suite" title="parser.suite"><code class="xref py py-func docutils literal notranslate"><span class="pre">suite()</span></code></a> function parses the parameter <em>source</em> as if it were an input
|
|
to <code class="docutils literal notranslate"><span class="pre">compile(source,</span> <span class="pre">'file.py',</span> <span class="pre">'exec')</span></code>. If the parse succeeds, an ST object
|
|
is created to hold the internal parse tree representation, otherwise an
|
|
appropriate exception is raised.</p>
|
|
</dd></dl>
|
|
|
|
<dl class="function">
|
|
<dt id="parser.sequence2st">
|
|
<code class="sig-prename descclassname">parser.</code><code class="sig-name descname">sequence2st</code><span class="sig-paren">(</span><em class="sig-param">sequence</em><span class="sig-paren">)</span><a class="headerlink" href="#parser.sequence2st" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>This function accepts a parse tree represented as a sequence and builds an
|
|
internal representation if possible. If it can validate that the tree conforms
|
|
to the Python grammar and all nodes are valid node types in the host version of
|
|
Python, an ST object is created from the internal representation and returned
|
|
to the called. If there is a problem creating the internal representation, or
|
|
if the tree cannot be validated, a <a class="reference internal" href="#parser.ParserError" title="parser.ParserError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ParserError</span></code></a> exception is raised. An
|
|
ST object created this way should not be assumed to compile correctly; normal
|
|
exceptions raised by compilation may still be initiated when the ST object is
|
|
passed to <a class="reference internal" href="#parser.compilest" title="parser.compilest"><code class="xref py py-func docutils literal notranslate"><span class="pre">compilest()</span></code></a>. This may indicate problems not related to syntax
|
|
(such as a <a class="reference internal" href="exceptions.html#MemoryError" title="MemoryError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">MemoryError</span></code></a> exception), but may also be due to constructs such
|
|
as the result of parsing <code class="docutils literal notranslate"><span class="pre">del</span> <span class="pre">f(0)</span></code>, which escapes the Python parser but is
|
|
checked by the bytecode compiler.</p>
|
|
<p>Sequences representing terminal tokens may be represented as either two-element
|
|
lists of the form <code class="docutils literal notranslate"><span class="pre">(1,</span> <span class="pre">'name')</span></code> or as three-element lists of the form <code class="docutils literal notranslate"><span class="pre">(1,</span>
|
|
<span class="pre">'name',</span> <span class="pre">56)</span></code>. If the third element is present, it is assumed to be a valid
|
|
line number. The line number may be specified for any subset of the terminal
|
|
symbols in the input tree.</p>
|
|
</dd></dl>
|
|
|
|
<dl class="function">
|
|
<dt id="parser.tuple2st">
|
|
<code class="sig-prename descclassname">parser.</code><code class="sig-name descname">tuple2st</code><span class="sig-paren">(</span><em class="sig-param">sequence</em><span class="sig-paren">)</span><a class="headerlink" href="#parser.tuple2st" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>This is the same function as <a class="reference internal" href="#parser.sequence2st" title="parser.sequence2st"><code class="xref py py-func docutils literal notranslate"><span class="pre">sequence2st()</span></code></a>. This entry point is
|
|
maintained for backward compatibility.</p>
|
|
</dd></dl>
|
|
|
|
</section>
|
|
<section id="converting-st-objects">
|
|
<span id="converting-sts"></span><h2>转换 ST 对象<a class="headerlink" href="#converting-st-objects" title="永久链接至标题">¶</a></h2>
|
|
<p>ST objects, regardless of the input used to create them, may be converted to
|
|
parse trees represented as list- or tuple- trees, or may be compiled into
|
|
executable code objects. Parse trees may be extracted with or without line
|
|
numbering information.</p>
|
|
<dl class="function">
|
|
<dt id="parser.st2list">
|
|
<code class="sig-prename descclassname">parser.</code><code class="sig-name descname">st2list</code><span class="sig-paren">(</span><em class="sig-param">st</em>, <em class="sig-param">line_info=False</em>, <em class="sig-param">col_info=False</em><span class="sig-paren">)</span><a class="headerlink" href="#parser.st2list" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>This function accepts an ST object from the caller in <em>st</em> and returns a
|
|
Python list representing the equivalent parse tree. The resulting list
|
|
representation can be used for inspection or the creation of a new parse tree in
|
|
list form. This function does not fail so long as memory is available to build
|
|
the list representation. If the parse tree will only be used for inspection,
|
|
<a class="reference internal" href="#parser.st2tuple" title="parser.st2tuple"><code class="xref py py-func docutils literal notranslate"><span class="pre">st2tuple()</span></code></a> should be used instead to reduce memory consumption and
|
|
fragmentation. When the list representation is required, this function is
|
|
significantly faster than retrieving a tuple representation and converting that
|
|
to nested lists.</p>
|
|
<p>If <em>line_info</em> is true, line number information will be included for all
|
|
terminal tokens as a third element of the list representing the token. Note
|
|
that the line number provided specifies the line on which the token <em>ends</em>.
|
|
This information is omitted if the flag is false or omitted.</p>
|
|
</dd></dl>
|
|
|
|
<dl class="function">
|
|
<dt id="parser.st2tuple">
|
|
<code class="sig-prename descclassname">parser.</code><code class="sig-name descname">st2tuple</code><span class="sig-paren">(</span><em class="sig-param">st</em>, <em class="sig-param">line_info=False</em>, <em class="sig-param">col_info=False</em><span class="sig-paren">)</span><a class="headerlink" href="#parser.st2tuple" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>This function accepts an ST object from the caller in <em>st</em> and returns a
|
|
Python tuple representing the equivalent parse tree. Other than returning a
|
|
tuple instead of a list, this function is identical to <a class="reference internal" href="#parser.st2list" title="parser.st2list"><code class="xref py py-func docutils literal notranslate"><span class="pre">st2list()</span></code></a>.</p>
|
|
<p>If <em>line_info</em> is true, line number information will be included for all
|
|
terminal tokens as a third element of the list representing the token. This
|
|
information is omitted if the flag is false or omitted.</p>
|
|
</dd></dl>
|
|
|
|
<dl class="function">
|
|
<dt id="parser.compilest">
|
|
<code class="sig-prename descclassname">parser.</code><code class="sig-name descname">compilest</code><span class="sig-paren">(</span><em class="sig-param">st</em>, <em class="sig-param">filename='<syntax-tree>'</em><span class="sig-paren">)</span><a class="headerlink" href="#parser.compilest" title="永久链接至目标">¶</a></dt>
|
|
<dd><p id="index-1">The Python byte compiler can be invoked on an ST object to produce code objects
|
|
which can be used as part of a call to the built-in <a class="reference internal" href="functions.html#exec" title="exec"><code class="xref py py-func docutils literal notranslate"><span class="pre">exec()</span></code></a> or <a class="reference internal" href="functions.html#eval" title="eval"><code class="xref py py-func docutils literal notranslate"><span class="pre">eval()</span></code></a>
|
|
functions. This function provides the interface to the compiler, passing the
|
|
internal parse tree from <em>st</em> to the parser, using the source file name
|
|
specified by the <em>filename</em> parameter. The default value supplied for <em>filename</em>
|
|
indicates that the source was an ST object.</p>
|
|
<p>Compiling an ST object may result in exceptions related to compilation; an
|
|
example would be a <a class="reference internal" href="exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a> caused by the parse tree for <code class="docutils literal notranslate"><span class="pre">del</span> <span class="pre">f(0)</span></code>:
|
|
this statement is considered legal within the formal grammar for Python but is
|
|
not a legal language construct. The <a class="reference internal" href="exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a> raised for this
|
|
condition is actually generated by the Python byte-compiler normally, which is
|
|
why it can be raised at this point by the <a class="reference internal" href="#module-parser" title="parser: Access parse trees for Python source code."><code class="xref py py-mod docutils literal notranslate"><span class="pre">parser</span></code></a> module. Most causes of
|
|
compilation failure can be diagnosed programmatically by inspection of the parse
|
|
tree.</p>
|
|
</dd></dl>
|
|
|
|
</section>
|
|
<section id="queries-on-st-objects">
|
|
<span id="querying-sts"></span><h2>Queries on ST Objects<a class="headerlink" href="#queries-on-st-objects" title="永久链接至标题">¶</a></h2>
|
|
<p>Two functions are provided which allow an application to determine if an ST was
|
|
created as an expression or a suite. Neither of these functions can be used to
|
|
determine if an ST was created from source code via <a class="reference internal" href="#parser.expr" title="parser.expr"><code class="xref py py-func docutils literal notranslate"><span class="pre">expr()</span></code></a> or
|
|
<a class="reference internal" href="#parser.suite" title="parser.suite"><code class="xref py py-func docutils literal notranslate"><span class="pre">suite()</span></code></a> or from a parse tree via <a class="reference internal" href="#parser.sequence2st" title="parser.sequence2st"><code class="xref py py-func docutils literal notranslate"><span class="pre">sequence2st()</span></code></a>.</p>
|
|
<dl class="function">
|
|
<dt id="parser.isexpr">
|
|
<code class="sig-prename descclassname">parser.</code><code class="sig-name descname">isexpr</code><span class="sig-paren">(</span><em class="sig-param">st</em><span class="sig-paren">)</span><a class="headerlink" href="#parser.isexpr" title="永久链接至目标">¶</a></dt>
|
|
<dd><p id="index-2">When <em>st</em> represents an <code class="docutils literal notranslate"><span class="pre">'eval'</span></code> form, this function returns <code class="docutils literal notranslate"><span class="pre">True</span></code>, otherwise
|
|
it returns <code class="docutils literal notranslate"><span class="pre">False</span></code>. This is useful, since code objects normally cannot be queried
|
|
for this information using existing built-in functions. Note that the code
|
|
objects created by <a class="reference internal" href="#parser.compilest" title="parser.compilest"><code class="xref py py-func docutils literal notranslate"><span class="pre">compilest()</span></code></a> cannot be queried like this either, and
|
|
are identical to those created by the built-in <a class="reference internal" href="functions.html#compile" title="compile"><code class="xref py py-func docutils literal notranslate"><span class="pre">compile()</span></code></a> function.</p>
|
|
</dd></dl>
|
|
|
|
<dl class="function">
|
|
<dt id="parser.issuite">
|
|
<code class="sig-prename descclassname">parser.</code><code class="sig-name descname">issuite</code><span class="sig-paren">(</span><em class="sig-param">st</em><span class="sig-paren">)</span><a class="headerlink" href="#parser.issuite" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>This function mirrors <a class="reference internal" href="#parser.isexpr" title="parser.isexpr"><code class="xref py py-func docutils literal notranslate"><span class="pre">isexpr()</span></code></a> in that it reports whether an ST object
|
|
represents an <code class="docutils literal notranslate"><span class="pre">'exec'</span></code> form, commonly known as a "suite." It is not safe to
|
|
assume that this function is equivalent to <code class="docutils literal notranslate"><span class="pre">not</span> <span class="pre">isexpr(st)</span></code>, as additional
|
|
syntactic fragments may be supported in the future.</p>
|
|
</dd></dl>
|
|
|
|
</section>
|
|
<section id="exceptions-and-error-handling">
|
|
<span id="st-errors"></span><h2>异常和错误处理<a class="headerlink" href="#exceptions-and-error-handling" title="永久链接至标题">¶</a></h2>
|
|
<p>The parser module defines a single exception, but may also pass other built-in
|
|
exceptions from other portions of the Python runtime environment. See each
|
|
function for information about the exceptions it can raise.</p>
|
|
<dl class="exception">
|
|
<dt id="parser.ParserError">
|
|
<em class="property">exception </em><code class="sig-prename descclassname">parser.</code><code class="sig-name descname">ParserError</code><a class="headerlink" href="#parser.ParserError" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>Exception raised when a failure occurs within the parser module. This is
|
|
generally produced for validation failures rather than the built-in
|
|
<a class="reference internal" href="exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a> raised during normal parsing. The exception argument is
|
|
either a string describing the reason of the failure or a tuple containing a
|
|
sequence causing the failure from a parse tree passed to <a class="reference internal" href="#parser.sequence2st" title="parser.sequence2st"><code class="xref py py-func docutils literal notranslate"><span class="pre">sequence2st()</span></code></a>
|
|
and an explanatory string. Calls to <a class="reference internal" href="#parser.sequence2st" title="parser.sequence2st"><code class="xref py py-func docutils literal notranslate"><span class="pre">sequence2st()</span></code></a> need to be able to
|
|
handle either type of exception, while calls to other functions in the module
|
|
will only need to be aware of the simple string values.</p>
|
|
</dd></dl>
|
|
|
|
<p>Note that the functions <a class="reference internal" href="#parser.compilest" title="parser.compilest"><code class="xref py py-func docutils literal notranslate"><span class="pre">compilest()</span></code></a>, <a class="reference internal" href="#parser.expr" title="parser.expr"><code class="xref py py-func docutils literal notranslate"><span class="pre">expr()</span></code></a>, and <a class="reference internal" href="#parser.suite" title="parser.suite"><code class="xref py py-func docutils literal notranslate"><span class="pre">suite()</span></code></a> may
|
|
raise exceptions which are normally raised by the parsing and compilation
|
|
process. These include the built in exceptions <a class="reference internal" href="exceptions.html#MemoryError" title="MemoryError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">MemoryError</span></code></a>,
|
|
<a class="reference internal" href="exceptions.html#OverflowError" title="OverflowError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">OverflowError</span></code></a>, <a class="reference internal" href="exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a>, and <a class="reference internal" href="exceptions.html#SystemError" title="SystemError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SystemError</span></code></a>. In these
|
|
cases, these exceptions carry all the meaning normally associated with them.
|
|
Refer to the descriptions of each function for detailed information.</p>
|
|
</section>
|
|
<section id="st-objects">
|
|
<span id="id1"></span><h2>ST 对象<a class="headerlink" href="#st-objects" title="永久链接至标题">¶</a></h2>
|
|
<p>Ordered and equality comparisons are supported between ST objects. Pickling of
|
|
ST objects (using the <a class="reference internal" href="pickle.html#module-pickle" title="pickle: Convert Python objects to streams of bytes and back."><code class="xref py py-mod docutils literal notranslate"><span class="pre">pickle</span></code></a> module) is also supported.</p>
|
|
<dl class="data">
|
|
<dt id="parser.STType">
|
|
<code class="sig-prename descclassname">parser.</code><code class="sig-name descname">STType</code><a class="headerlink" href="#parser.STType" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>The type of the objects returned by <a class="reference internal" href="#parser.expr" title="parser.expr"><code class="xref py py-func docutils literal notranslate"><span class="pre">expr()</span></code></a>, <a class="reference internal" href="#parser.suite" title="parser.suite"><code class="xref py py-func docutils literal notranslate"><span class="pre">suite()</span></code></a> and
|
|
<a class="reference internal" href="#parser.sequence2st" title="parser.sequence2st"><code class="xref py py-func docutils literal notranslate"><span class="pre">sequence2st()</span></code></a>.</p>
|
|
</dd></dl>
|
|
|
|
<p>ST 对象具有以下方法:</p>
|
|
<dl class="method">
|
|
<dt id="parser.ST.compile">
|
|
<code class="sig-prename descclassname">ST.</code><code class="sig-name descname">compile</code><span class="sig-paren">(</span><em class="sig-param">filename='<syntax-tree>'</em><span class="sig-paren">)</span><a class="headerlink" href="#parser.ST.compile" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>和 <code class="docutils literal notranslate"><span class="pre">compilest(st,</span> <span class="pre">filename)</span></code> 相同.</p>
|
|
</dd></dl>
|
|
|
|
<dl class="method">
|
|
<dt id="parser.ST.isexpr">
|
|
<code class="sig-prename descclassname">ST.</code><code class="sig-name descname">isexpr</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#parser.ST.isexpr" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>和 <code class="docutils literal notranslate"><span class="pre">isexpr(st)</span></code> 相同。</p>
|
|
</dd></dl>
|
|
|
|
<dl class="method">
|
|
<dt id="parser.ST.issuite">
|
|
<code class="sig-prename descclassname">ST.</code><code class="sig-name descname">issuite</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#parser.ST.issuite" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>和 <code class="docutils literal notranslate"><span class="pre">issuite(st)</span></code> 相同。</p>
|
|
</dd></dl>
|
|
|
|
<dl class="method">
|
|
<dt id="parser.ST.tolist">
|
|
<code class="sig-prename descclassname">ST.</code><code class="sig-name descname">tolist</code><span class="sig-paren">(</span><em class="sig-param">line_info=False</em>, <em class="sig-param">col_info=False</em><span class="sig-paren">)</span><a class="headerlink" href="#parser.ST.tolist" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>和 <code class="docutils literal notranslate"><span class="pre">st2list(st,</span> <span class="pre">line_info,</span> <span class="pre">col_info)</span></code> 相同。</p>
|
|
</dd></dl>
|
|
|
|
<dl class="method">
|
|
<dt id="parser.ST.totuple">
|
|
<code class="sig-prename descclassname">ST.</code><code class="sig-name descname">totuple</code><span class="sig-paren">(</span><em class="sig-param">line_info=False</em>, <em class="sig-param">col_info=False</em><span class="sig-paren">)</span><a class="headerlink" href="#parser.ST.totuple" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>和 <code class="docutils literal notranslate"><span class="pre">st2tuple(st,</span> <span class="pre">line_info,</span> <span class="pre">col_info)</span></code> 相同。</p>
|
|
</dd></dl>
|
|
|
|
</section>
|
|
<section id="example-emulation-of-compile">
|
|
<h2>示例: <a class="reference internal" href="functions.html#compile" title="compile"><code class="xref py py-func docutils literal notranslate"><span class="pre">compile()</span></code></a> 的模拟<a class="headerlink" href="#example-emulation-of-compile" title="永久链接至标题">¶</a></h2>
|
|
<p>While many useful operations may take place between parsing and bytecode
|
|
generation, the simplest operation is to do nothing. For this purpose, using
|
|
the <a class="reference internal" href="#module-parser" title="parser: Access parse trees for Python source code."><code class="xref py py-mod docutils literal notranslate"><span class="pre">parser</span></code></a> module to produce an intermediate data structure is equivalent
|
|
to the code</p>
|
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">code</span> <span class="o">=</span> <span class="nb">compile</span><span class="p">(</span><span class="s1">'a + 5'</span><span class="p">,</span> <span class="s1">'file.py'</span><span class="p">,</span> <span class="s1">'eval'</span><span class="p">)</span>
|
|
<span class="gp">>>> </span><span class="n">a</span> <span class="o">=</span> <span class="mi">5</span>
|
|
<span class="gp">>>> </span><span class="nb">eval</span><span class="p">(</span><span class="n">code</span><span class="p">)</span>
|
|
<span class="go">10</span>
|
|
</pre></div>
|
|
</div>
|
|
<p>The equivalent operation using the <a class="reference internal" href="#module-parser" title="parser: Access parse trees for Python source code."><code class="xref py py-mod docutils literal notranslate"><span class="pre">parser</span></code></a> module is somewhat longer, and
|
|
allows the intermediate internal parse tree to be retained as an ST object:</p>
|
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">parser</span>
|
|
<span class="gp">>>> </span><span class="n">st</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">expr</span><span class="p">(</span><span class="s1">'a + 5'</span><span class="p">)</span>
|
|
<span class="gp">>>> </span><span class="n">code</span> <span class="o">=</span> <span class="n">st</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">'file.py'</span><span class="p">)</span>
|
|
<span class="gp">>>> </span><span class="n">a</span> <span class="o">=</span> <span class="mi">5</span>
|
|
<span class="gp">>>> </span><span class="nb">eval</span><span class="p">(</span><span class="n">code</span><span class="p">)</span>
|
|
<span class="go">10</span>
|
|
</pre></div>
|
|
</div>
|
|
<p>An application which needs both ST and code objects can package this code into
|
|
readily available functions:</p>
|
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">parser</span>
|
|
|
|
<span class="k">def</span> <span class="nf">load_suite</span><span class="p">(</span><span class="n">source_string</span><span class="p">):</span>
|
|
<span class="n">st</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">suite</span><span class="p">(</span><span class="n">source_string</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">st</span><span class="p">,</span> <span class="n">st</span><span class="o">.</span><span class="n">compile</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">load_expression</span><span class="p">(</span><span class="n">source_string</span><span class="p">):</span>
|
|
<span class="n">st</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">expr</span><span class="p">(</span><span class="n">source_string</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">st</span><span class="p">,</span> <span class="n">st</span><span class="o">.</span><span class="n">compile</span><span class="p">()</span>
|
|
</pre></div>
|
|
</div>
|
|
</section>
|
|
</section>
|
|
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
|
<div class="sphinxsidebarwrapper">
|
|
<h3><a href="../contents.html">目录</a></h3>
|
|
<ul>
|
|
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">parser</span></code> --- 访问 Python 解析树</a><ul>
|
|
<li><a class="reference internal" href="#creating-st-objects">创建 ST 对象</a></li>
|
|
<li><a class="reference internal" href="#converting-st-objects">转换 ST 对象</a></li>
|
|
<li><a class="reference internal" href="#queries-on-st-objects">Queries on ST Objects</a></li>
|
|
<li><a class="reference internal" href="#exceptions-and-error-handling">异常和错误处理</a></li>
|
|
<li><a class="reference internal" href="#st-objects">ST 对象</a></li>
|
|
<li><a class="reference internal" href="#example-emulation-of-compile">示例: <code class="xref py py-func docutils literal notranslate"><span class="pre">compile()</span></code> 的模拟</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
|
|
<h4>上一个主题</h4>
|
|
<p class="topless"><a href="language.html"
|
|
title="上一章">Python 语言服务</a></p>
|
|
<h4>下一个主题</h4>
|
|
<p class="topless"><a href="ast.html"
|
|
title="下一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">ast</span></code> --- 抽象语法树</a></p>
|
|
<div role="note" aria-label="source link">
|
|
<h3>本页</h3>
|
|
<ul class="this-page-menu">
|
|
<li><a href="../bugs.html">报告 Bug</a></li>
|
|
<li>
|
|
<a href="https://github.com/python/cpython/blob/3.8/Doc/library/parser.rst"
|
|
rel="nofollow">显示源代码
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="clearer"></div>
|
|
</div>
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>导航</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../genindex.html" title="总目录"
|
|
>索引</a></li>
|
|
<li class="right" >
|
|
<a href="../py-modindex.html" title="Python 模块索引"
|
|
>模块</a> |</li>
|
|
<li class="right" >
|
|
<a href="ast.html" title="ast --- 抽象语法树"
|
|
>下一页</a> |</li>
|
|
<li class="right" >
|
|
<a href="language.html" title="Python 语言服务"
|
|
>上一页</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> »</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.8.20 Documentation</a> »
|
|
</li>
|
|
|
|
<li class="nav-item nav-item-1"><a href="index.html" >Python 标准库</a> »</li>
|
|
<li class="nav-item nav-item-2"><a href="language.html" >Python 语言服务</a> »</li>
|
|
<li class="right">
|
|
|
|
|
|
<div class="inline-search" role="search">
|
|
<form class="inline-search" action="../search.html" method="get">
|
|
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
|
|
<input type="submit" value="转向" />
|
|
<input type="hidden" name="check_keywords" value="yes" />
|
|
<input type="hidden" name="area" value="default" />
|
|
</form>
|
|
</div>
|
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</div>
|
|
<div class="footer">
|
|
© <a href="../copyright.html">版权所有</a> 2001-2024, 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 />
|
|
|
|
<br />
|
|
|
|
The Python Software Foundation is a non-profit corporation.
|
|
<a href="https://www.python.org/psf/donations/">Please donate.</a>
|
|
<br />
|
|
<br />
|
|
|
|
最后更新于 12月 09, 2024.
|
|
<a href="https://docs.python.org/3/bugs.html">Found a bug</a>?
|
|
<br />
|
|
|
|
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 2.4.4.
|
|
</div>
|
|
|
|
</body>
|
|
</html> |