如何在Golang中编写基于语法树的领域特定语言 - Victor


基于 AST 的 DSL 在表示递归结构方面的强大功能,如果你从事计算机科学方面研究,点击标题,以下是摘录

领域特定语言 (DSL)
您不必成为领域特定语言(DSL) 方面的专家也可以跟随。事实上,你并不需要真正了解它,因为它是一种范围比通用语言(GPR) 更小的语言,例如 Go。这意味着 DSL 经过优化,可以非常有效地解决某个特定领域的问题(无论是在计算方面还是在实现方面),并且它甚至可能不支持在该领域之外做任何事情。
由于 DSL 的功能非常有限,因此它们通常以其他语言实现。因此,可以将用于构建 SQL 查询的包视为 DSL,其中域是 SQL 查询。在我们的工作示例中,域将是代数表达式并实现为 Go 包。

抽象语法树(AST)
抽象语法树(AST)是一种数据结构,用于表示一些数据的抽象语法结构。这对我们来说意味着,顾名思义,AST将一些数据的结构和意义表现为一棵树。容易被AST建模的数据类型通常是递归的,例如代数表达式或源代码。AST常用于编译器中,因为它使表示意义成为可能。

就我们的意图和目的而言,只需意识到一个代数表达式,例如图1中的4 + 6x,很适合树状结构。更确切地说,每个运算符(+、-、*、/、Const、x)都由一个节点表示,其参数(如果有的话)由子节点表示。

有了DSL和AST的概念,我们就可以把它拼凑起来,形成我们基于语法树的简单代数表达式领域特定语言的工作实例的想法。

我们希望能够表示任何包含任何或所有基本算术运算符(+, -, *, /)的一个变量的代数表达式,并且我们希望有办法在某个指定的值上评估一个给定的表达式。