原标题|可视化PEG解析的作者|GuidovanRossum(Python之父)译者||本翻译以交流学习为目的,基于CCBY-NC-SA4.0许可协议。为便于阅读,内容略有修改。上周我展示了一个简单的PEG解析器生成器。本周我将展示生成的解析器在解析程序时实际做了什么。我深入研究了ASCII艺术的复古世界,特别是一个名为“curses”的库,它在Linux和Mac的Python标准库中可用,并且作为Windows的附加组件。[这是我的PEG系列的第4部分。SeePart1,Part2,Part3,Part5](译注:对应翻译,Part1,Part2,Part3,Part5待译)来看看可视化取得了哪些进展。屏幕截图中的屏幕分为三个部分,简单的ASCII字符和一个带连字符的行:上半部分显示了解析器的调用堆栈,您可能记得它是一个具有无限回溯解析器的递归下降。我将在下面解释如何阅读它。中间的单行部分显示了令牌缓冲区的内容,光标指向下一个要解析的令牌。在底部,我们展示了Packrat解析算法使用的内存缓存。它的条目类似于一些解析器堆栈条目(带有结果的条目)。阅读此图时要注意的主要事项是顶部和底部的缩进线对应于标记缓冲区。(译注:最好看下面的gif动图,再看这部分。)前两行(以statement和assignment开头)表示还没有返回的解析方法调用,当标记位置在调用前的第一个标记字符('aap')。接下来的两行(以expr和term开头)与标记“cat”的开头垂直对齐,这是调用相应解析方法的地方。堆栈部分中显示的第五行也是最后一行是expect('/')调用,它返回None。它在标记“+”处被调用。缓存段条目的缩进也对应于令牌缓冲区的位置。例如,在底部我们看到有负缓存条目在令牌缓冲区的开头和规则if_statement寻找令牌“if”。我们还找到了标记“=”和NAME(特别是“cat”)的成功缓存条目,它们对应于未来的输入位置。返回的调用显示为function(args)->resultinthedisplayedparserstackandcache.有时解析器堆栈也会显示几个返回的方法——我这样做是为了减少显示中的“跳跃”。(说到“跳转”,顶部显示的解析器堆栈在调用被添加到堆栈时向上移动,而当调用从堆栈中弹出时向下移动。看起来我们的眼睛会跟随这样的移动不会很大问题-至少我没有。这可能是因为我们大脑中有一个区域专门用于跟踪移动物体。:-)缓存可视化为一种LRU缓存,最近使用的缓存条目位于top和较少使用的项目落向屏幕底部。(我在上一篇文章中展示的packrat解析器原型没有使用LRU,但它可能是提高其内存使用率的好策略。)让我们看看解析堆栈如何显示的更多细节。前四项对应还没有返回的parse方法,每一行表示语法中的一行。带下划线的条目会导致下一次调用。在本例中,我们看到我们处于语句的第二个选项中,即赋值,而在规则中我们处于第三个选项中,即expr。在expr规则中,我们刚好位于第一个可选项(术语“+”expr)的第一项;而在术语规则中,我们处于最后一个选项(原子)。在那之后,我们看到导致第二个选项(atom'/'term)失败的原因:expect('/')->None缩进了'+'标记。当我们向前移动可视化时,我们将看到它沉入缓存中。但当然,你更愿意自己看动漫!我已经记录了示例程序的完整剖析。你也可以自己把玩代码,但请注意,这只是暂时的黑科技。gif图片:https://raw.githubusercontent...示例代码:https://github.com/gvanrossum...当您在观看录制的GIF时,您可能会感到有点困惑,有时下一个标记还没有显示(例如,在最开始,堆栈在显示标记“aap”之前增长了几个条目)。这正是解析器所看到的:令牌缓冲区被延迟填充,直到解析器通过调用expect()请求它们时才会扫描令牌。一旦令牌出现在缓冲区中,它就会保留在那里,即使解析器回溯也是如此。标记缓冲区中的光标向左跳,表示回溯;这在这个动画中发生了很多次。您还可以观察gif中的缓存填充情况,其中解析器不会进行额外的递归调用。(当我发现时我应该强调这一点,但我没时间了。)下周我将进一步开发解析器,可能会添加我的左递归语法规则的实现。(他们很棒!)致谢:用于录制的ttygif(IliaCholy)和ttyrec(MatthewJording)。本文内容、示例代码和图片的许可协议:CCBY-NC-SA4.0英文原文:https://medium.com/@gvanrossum_83706/visualizing-peg-parsing-93a36f259423作者简介:GuidovanRossumPython的创造者,在2018年7月12日退位之前,一直是“终生仁慈的独裁者”。目前,他是新的最高决策层级的五名成员之一,并在社区中保持活跃。本文来自他在Medium博客上写的解析器系列,还在连载中,每周日更新。译者简介:猫下豌豆花,出生于广东,毕业于武汉大学,现为苏飘程序员。他有一些极客思维,有一些人文情怀,有一些温暖,有一些态度。公众号:“蟒猫”(python_cat)。公众号【Python猫】,本号连载系列精品文章,包括喵星哲学猫系列、Python进阶系列、好书推荐系列、技术写作、优质英文推荐与翻译等,欢迎收看注意。
