解析算法
Parsing Algorithms
句法分析的理论与实践
您将会学到
-
与上下文无关的语法
-
抽象语法树
-
解析器生成器
-
使用 parser generator 从头开始构建完整的 parser
-
自上而下的 LL 解析器
-
自下而上的 LR 解析器
-
回溯解析器
-
左递归和左因式分解
-
预测递归下降解析器
-
LL(1)、LR(0)、SLR(1)、CLR(1)、LALR(1) 解析器
-
Shift-reduce 算法
-
语法工具:与语言无关的解析器生成器
要求
-
基本数据结构和算法
-
树、图形、遍历
-
对编程语言感兴趣
描述
课程概述
解析或句法分析是设计和实现编译器的最初阶段之一。精心设计的编程语言语法是用户更喜欢并选择您的语言的重要动力。
———————————————————-
经典编译器流派和书籍中“解析器理论”的问题在于,该理论通常被认为“太先进”,直接进入计算理论和形式语法的复杂形式描述。因此,学生可能会对构建处于解析阶段的编译器失去兴趣。
在描述解析器时经常看到的相反问题是仅描述手动(通常是递归下降)解析的肤浅方法,这让学生难以理解自动解析器背后的实际技术。
———————————————————-
我相信这种对解析理论的深入研究应该与实践方法相结合,这种方法是并行的,并允许看到所有在实践中学到的理论材料。
在 Essentials of Parsing (aka Parsing Algorithms) 课程中,我们深入探讨了解析理论的不同方面,详细描述了 LL 和 LR 解析器。然而,与此同时,为了使学习过程和理解变得简单有趣,我们从头开始为完整的编程语言并行构建了一个自动解析器,类似于 JavaScript 或 Python。
完成本课程后,您不仅能够使用解析器生成器为编程语言构建解析器,而且还将了解解析器生成器本身是如何工作的。
为编程语言实现解析器也会使您对其他编程语言的实际使用更加专业。
这门课适合谁?
本课程适合任何好奇的工程师,他们希望获得构建复杂系统的技能(为编程语言构建解析器是一项非常高级的工程任务!),并获得构建此类系统的可转移知识。
如果您对编译器、解释器和源代码转换工具特别感兴趣,那么本课程也适合您。
此类的唯一先决条件是基本数据结构和算法:树、列表、遍历。
什么用于实施?
由于我们构建的语言在语义上与 JavaScript 或 Python(当今最流行的两种编程语言)非常相似,因此我们专门使用 JavaScript——它优雅的多范式结构结合了函数式编程、基于类和基于原型的 OOP 非常适合这一点。
许多工程师都熟悉 JavaScript,因此立即开始编码应该更容易。为了生成自动解析器,我们使用语法工具,它是一个与语言无关的解析器生成器,并支持 Python、Ruby、C#、PHP、Java、Rust 等插件。也就是说,此解析器的实现可以很容易地转换为您选择的任何其他语言。
注意:我们希望我们的学生能够自己真正遵循、理解和实现解析器的每一个细节,而不仅仅是从最终解决方案中复制粘贴。该语言的完整源代码可在视频讲座中找到,展示和指导如何构建特定模块。
这个类的具体内容是什么?
这些讲座的主要特点是:
-
简洁明了。每场讲座都是自给自足的、简洁的,并描述与主题直接相关的信息,不会分散对不相关材料或演讲的注意力。
-
动画演示与实时编辑笔记相结合。这使得理解主题更容易,并展示了对象结构是如何(以及何时)连接的。静态幻灯片根本不适用于复杂的内容。
-
带有作业的端到端实时编码会话。完整的源代码,从零开始,一直到最后,都在课堂的视频讲座中展示
课程内容
课程分为四个部分,共 22 个讲座,每个讲座中有许多子主题。以下是目录和课程。
第 1 部分:独立于上下文的语法和语言
在这一部分中,我们将描述不同的解析管道,讨论正式语法、推导、什么是模棱两可和没有雄心壮志的语法,并开始构建我们的编程语言。
第 2 部分:自上而下的 LL 解析
在这部分,我们详细讨论了 Top-down 解析,描述了手动递归和回溯解析器,并深入研究了 LL(1) 解析算法。
第 3 部分:自下而上的 LR 解析
在这部分,我们将介绍自下而上的解析器和 LR 解析算法。同时,我们继续构建我们的编程语言,分析 shift-reduce 冲突并修复它们。
第 4 部分:练习和最终解析器
课程的最后一部分是完全实用的,我们将完成我们的 Letter 编程语言,构建变量、函数、循环、控制结构、面向对象编程和最终的解析器。
此课程面向哪些人:
- 任何好奇的工程师
- 编译器工程师


评论(0)