pedal怎么记忆,Python之父:PEG解析器执行过程的可视化

极简大道 极简大道 2023-05-14 记忆方法 阅读: 238
摘要: 原题 | Visualizing PEG Parsing作者 | Guido van Rossum(Python之父)译者 | 豌豆花下猫(“Python猫”公众号作者)声明 | 本翻译是出于交流学习的目的,基于 CC BY-NC-SA 4.0 授权协议。为便于阅读,内容略有改动。上周我展示了一个简单的 PEG 解析器生成器。本周我将展示生成的解析器在解析程序时实际执行的操作。我深入研究了 ASCII 艺术的复古世界,特别是一个名为“curses”的库,它可以在 Linux 和 Mac 的 Python 标准库中找到,也可以作为 Windows 的附加组件。

原题 | Visualizing PEG Parsing

作者 | Guido van Rossum(Python之父)

译者 | 豌豆花下猫(“Python猫”公众号作者)

声明 | 本翻译是出于交流学习的目的,基于 CC BY-NC-SA 4.0 授权协议。为便于阅读,内容略有改动。

上周我展示了一个简单的 PEG 解析器生成器。本周我将展示生成的解析器在解析程序时实际执行的操作。我深入研究了 ASCII 艺术的复古世界,特别是一个名为“curses”的库,它可以在 Linux 和 Mac 的 Python 标准库中找到,也可以作为 Windows 的附加组件。

【这是我的 PEG 系列的第 4 部分。见第1部分,第2部分,第3部分,第5部分 】(译注:对应的译文,第1篇、第2篇、第3篇、第5篇待译 )

让我们来看看可视化已取得的进展。截图里的屏幕被分隔为三个部分,分别是简单的 ASCII 字符,以及用连字符划出的线:

  • 上部分显示了解析器的调用堆栈,你可能还记得它是一个具有无限回溯的递归下降解析器。我将在下面解释如何阅读它。

  • 中间的单行部分展示了标记符缓冲区的内容,光标指向下一个要解析的标记符。

  • 在底部,我们呈现 packrat 解析算法使用的记忆缓存。它的条目类似于一些解析器堆栈条目(具有结果的条目)。

可视化的截图

阅读此图表时,要注意的主要事项是:顶部和底部部分的缩进线与标记符缓冲区相对应。(译注:最好看一下后面的 gif 动图,再往下看这部分内容。)

  • 前两行(以statement 和assignment 开头)表示尚未返回的解析方法调用,并且当标记位置处在第一个标记符('aap' )之前时调用。

  • 接下来的两行(以expr 和term 开头)与标记符'cat' 的开头垂直对齐,后者是调用相应解析方法的地方。

  • 堆栈部分所显示的第五行和最后一行是一个expect('/') 调用,它返回 None 。它是在标记符'+' 处被调用的。

缓存部分的条目的缩进也对应着标记符缓冲区的位置。例如,在底部,我们看到有负数缓存条目(negative cache entries)在标记符缓冲区的开头查找标记符'if' 以及规则if_statement 。我们还发现标记符'=' 和NAME (特别是'cat' )所成功缓存的条目,它们与将来的输入位置相对应。

在显示出来的解析器堆栈和缓存中,已返回的调用被显示成function(args) -> result 。有时解析器堆栈也会显示几个已返回的方法——我这样做是为了减少显示时的“跳跃性”。

(说到“跳跃”,顶部显示的解析器堆栈会在一个调用被添加到堆栈时,向上移动,而当从堆栈中弹出一个调用时,它则向下移动。似乎我们的眼睛跟随这样的动作不会有太大问题——至少我没有。这很可能因为我们大脑中有一块区域是用于跟踪移动的物体。:-)

缓存被可视化为一种 LRU 缓存,最近使用过的缓存条目位于顶部,较少使用的项目则向屏幕底部掉落。(我在之前的帖子中展示的 packrat 解析器原型不使用 LRU,但它可能是改善其内存使用的好策略。)

让我们看一下解析堆栈在显示时的更多一些细节。前四个条目对应于尚未返回的解析方法,每一行显示了语法中的一行。带下划线的条目会引起下一次调用。

在这种情况下,我们看到我们处于 statement 的第二种选择,也即 assignment,并且在该规则中我们处于第三项,即 expr。在 expr 规则中,我们只是在第一个可选项的第一个条目(term '+' expr );而在 term 规则中,我们处在最后的选项(atom)。

在那之后,我们看到导致第二个选项(atom '/' term )失败的结果:expect('/') - > None 用 '+' 标记符缩进。当我们将可视化向前移动时,我们会看到它沉入缓存中。

gif 动图

但当然了,你肯定宁愿自己看动画!我已经录制了示例程序的完整解析。你也可以自己玩代码,但请注意,这只是一个临时的黑科技。

gif图:
https://raw.githubusercontent.com/gvanrossum/pegen/master/story3/tty.gif

示例代码:
https://github.com/gvanrossum/pegen/tree/master/story3

当你在观看录制的GIF时,可能会感到有些迷惑,有时下一个标记符还未显示(例如,在最开始时,堆栈在标记符'aap' 被显示之前,就增长了几个条目)。

这正是解析器所看到的:标记符缓冲区被延迟地填充,并且在解析器通过调用 expect() 来请求它们之前,并不会扫描标记符。一旦标记符出现在缓冲区中,它就会保留在那里,即便在解析器回溯时也如此。

标记符缓冲区中的光标向左跳跃,显示了回溯过程;该动图中有很多次出现这种现象。你还可以在 gif 中观察到缓存填充,解析器在那不会进行额外的递归调用。(发现这种情况时,我应该加以强调,但我没时间了。)

下周我将进一步开发解析器,很可能会添加我对左递归语法规则的实现。(它们很棒!)

致谢:录制时所用的ttygif (Ilia Choly 开发) 和 ttyrec (Matthew Jording 开发)。

本文内容、示例代码和图片的授权协议:CC BY-NC-SA 4.0

英文原文:https://medium.com/@
gvanrossum_83706/visualizing-peg-parsing-93a36f259423

作者简介: Guido van Rossum,Python 的创造者,一直是“终身仁慈独裁者”,直到 2018 年 7 月 12 日退位。目前,他是新的最高决策层的五位成员之一,依然活跃在社区中。本文出自他在 Medium 开博客所写的解析器系列,该系列仍在连载中,每周日更新。

译者简介: 豌豆花下猫,生于广东毕业于武大,现为苏漂程序员,有一些极客思维,也有一些人文情怀,有一些温度,还有一些态度。公众号:「Python猫」(python_cat)。

其他相关

grape怎么记忆,pebble怎么记忆,生物分析专栏 - PEG修饰药物的药代动力学和生物分析

作者: 极简大道 时间:2023-09-21 阅读: 89
聚乙二醇(PEG)是一种被广泛应用于蛋白质和多肽等生物聚合物进行共价修饰的高分子材料[1]。PEG化修饰(PEGylation)是将PEG共价结合在药物上,以改善药物的药代动力学、药效学和免疫学特性,从而增强其治疗效果的一种药物技术[2]。...

perpetuate怎么记忆,grape怎么记忆,0-6岁孩子的记忆力提高非常重要!只需要宝妈掌握以下几点

作者: 极简大道 时间:2023-09-21 阅读: 122
0-6岁是孩子智力发展最重要的时期,俗称黄金海绵期,而在这个重要的时期中,记忆又处于意识中心,心理活动的各个方面占着优势地位,如果没有记忆,孩子在学到新的技能的时候,碰到新的事物的时候,他/她是不会获得什么经验的,所以说记忆是智力的仓库。...
peep怎么记忆,Python 之父的解析器系列之五:左递归 PEG 语法

peep怎么记忆,Python 之父的解析器系列之五:左递归 PEG 语法

作者: 极简大道 时间:2023-05-14 阅读: 140
原题 | Left-recursive PEG grammars作者 | Guido van Rossum(Python之父)译者 | 豌豆花下猫(“Python猫”公众号作者)声明 | 本翻译是出于交流学习的目的,基于 https://creativecommons.org/licenses/by-nc-sa/4.0/ 授权协议。为便于阅读,内容略有改动。...
rag怎么记忆,Python之父手写解析器教程:左递归 PEG 语法

rag怎么记忆,Python之父手写解析器教程:左递归 PEG 语法

作者: 极简大道 时间:2023-05-14 阅读: 164
原题 | Left-recursive PEG grammars作者 | Guido van Rossum(Python之父)译者 | 豌豆花下猫(“Python猫”公众号作者)声明 | 本翻译是出于交流学习的目的,基于 https://creativecommons.org/licenses/by-nc-sa/4.0/ 授权协议。为便于阅读,内容略有改动。...

pebble怎么记忆,想要有效提高记忆能力,父母要先了解这些,再行动也不迟

作者: 极简大道 时间:2023-05-14 阅读: 177
家长都希望孩子“望子成龙,望女成凤”,因此对于孩子的教育都舍得花钱,总去给孩子报各种辅导班。但好多家长都表示,这样并没有结果。其实这是和孩子记忆力有着密切关联的,基础没打好,也是记忆力不好的原因。那应该怎样培养孩子记忆力呢?...

年度爆文