Skip to content

Latest commit

 

History

History
16 lines (9 loc) · 2.39 KB

File metadata and controls

16 lines (9 loc) · 2.39 KB

2.3为Monkey语言写一个解析器

当解析一个编程语言时,有两个主要的策略:自顶向下解析或自底向上解析。每种策略存在许多略不同的形式。例如,“递归下降解析”,“早期解析”或“预测解析”都是自顶向下解析的变体。

我们准备写的解析器是递归下降解析。并且尤其是,它是一个“自顶向下运算符优先级”解析器,有时也被称为“Pratt解析器”,以发明者Vaughan Pratt的名字命名。

引用《编译原理》—— 自顶向下语法分析可以被看作是为输入串构造语法分析树的问题,它从语法分析树的根结点开始,按照先根次序深度优先地创建这棵语法分析树的各个结点。自顶向下语法分析也可以被看作寻找输入串的最左推导的过程。

我不会采用深入不同解析器的策略,因为这不是我有资格准确描述它们的地方。相反,我只想说,自顶向下和自底向上解析器的区别在于,前者从构建AST的根节点开始,然后下降,而后者相反。从上到下工作的递归下降解析器通常被推荐给新手解析,因为它密切反映了我们对AST及其构造的看法。我个人发现从根节点开始的递归方法非常好,即使在概念真正被理解之前需要编写一些代码。这是开始使用代码而不是钻研解析策略的另一个原因。

现在,当写一个我们自己的解析器,我们必须做一些权衡,是的。我们的解析器不会是有史以来最快的,我们不会有正确性的正式证明,它的错误恢复过程和错误语法的检测也不是万无一失的。如果没有对围绕解析的理论进行广泛研究,最后一个尤其难以正确。但是我们将要拥有的是一个完整的Monkey编程语言解析器,它对拓展和改进开放,易于理解并且进一步深入解析主题的良好开端,如果有人愿意的话。

我们从解析语句开始:let和return语句。当我们可以解析语句和解析器的基本结构时,我们将查看表达式以及如何解析它们(这是Vaughan Pratt发挥作用的地方)。之后我们扩展了解析器,使其能够解析Monkey编程语言的一个很大的子集。当我们进入目标时,我们为AST构建了必要结构。

< 2.2为什么不是解析器生成器? > 2.4解析器起步:解析LET语句