python中的peg解析器是什么?

5hcedyr0  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(852)

我用的是 keyword 内置模块以获取当前python版本的所有关键字的列表。我就是这么做的:

>>> import keyword
>>> print(keyword.kwlist)
['False', 'None', 'True', '__peg_parser__', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

而在 keyword.kwlist 列表中有 __peg_parser__ . 所以当我打字的时候 __peg_parser__ 在python解释器中,下面是get:

>>> __peg_parser__
  File "<stdin>", line 1
    __peg_parser__
    ^
SyntaxError: You found it!

我以前从未见过这种错误。而且,我在windows上运行python3.9。
我的问题是,什么是 __peg_parser__ ,为什么我会 SyntaxError: You found it! ?

5rgfhyps

5rgfhyps1#

guido在github上发布了新的peg解析器。
它也在python pep上。
正如它提到的:
这个pep建议用一个新的基于peg的解析器替换当前基于ll(1)的cpython解析器。这个新的解析器将允许消除当前语法中存在的多个“hack”,以绕过ll(1)限制。它将大大降低与编译管道相关的某些领域的维护成本,如语法、解析器和ast生成。新的peg解析器还将取消对当前python语法的ll(1)限制。
在python3.9的what'snew页面中也提到了。
在Python3.10中 LL(1) 分析器将被删除。python3.9使用了一个新的解析器,它基于peg而不是ll(1)。
在python 3.6中,没有定义:

>>> __peg_parser__
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    __peg_parser__
NameError: name '__peg_parser__' is not defined
>>>
zlwx9yxi

zlwx9yxi2#

这是一个复活节彩蛋,与新peg解析器的推出有关。复活节彩蛋和旧的ll(1)解析器将在3.10中删除。

7cwmlq89

7cwmlq893#

因为peg解析器,它是python中的复活节彩蛋。 __peg_parser__ 将替换为 __new_parser__ 在python中,它是在这个commit中更改的。在这个bug中也讨论了这个问题。
正如在python3.10的新增功能中所提到的
删除了解析器模块(由于切换到新的peg解析器,在3.9中被弃用),以及所有仅由旧解析器使用的c源文件和头文件,包括 node.h , parser.h , graminit.h 以及 grammar.h .
而且,它在早期版本的python中并不存在。
python 2.7版:

>>> __peg_parser__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '__peg_parser__' is not defined
>>> __new_parser__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '__new_parser__' is not defined

python 3.6版:

>>> __peg_parser__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '__peg_parser__' is not defined
>>> __new_parser__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '__new_parser__' is not defined

python 3.9版:

>>> __peg_parser__
  File "<stdin>", line 1
    __peg_parser__
    ^
SyntaxError: You found it!
>>> __new_parser__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '__new_parser__' is not defined

相关问题