我用的是 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!
?
3条答案
按热度按时间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中,没有定义:
zlwx9yxi2#
这是一个复活节彩蛋,与新peg解析器的推出有关。复活节彩蛋和旧的ll(1)解析器将在3.10中删除。
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版:
python 3.6版:
python 3.9版: