Skip to main content
 首页 » 编程设计

python之Python 中的微型 DSL 实现

2025年05月04日31exmyth

我正在研究用 Python 实现 DSL,我正在寻找一种小型 DSL 语言,它对没有设计和实现语言经验的人来说很友好。到目前为止,我回顾了两个实现,即 Hy 和 Mochi。 Hy 实际上是 lisp 的一种方言,而 Mochi 似乎与 Elixir 非常相似。两者对我来说都很复杂,因为我现在的目标是对语言进行原型(prototype)设计并使用 in 来确定它是否真的有助于解决问题以及是否适合问题所需的风格。我知道 Python 通过标准库中提供的语言工具得到了很好的支持。到目前为止,我实现了一种非常简单的 lisp 方言,我没有使用 python AST,它纯粹是通过字符串处理实现的,这对于我正在寻找的东西来说绝对不灵活。

是否有任何实现而不是上述两种语言,小到可以研究?

有哪些关于这个主题的好书(实用性,不仅仅停留在理论和学术方面)?

学习和使用 Python AST 的好方法是什么?

就实际生成的字节码的开销而言,是否存在与基于 Python 构建的语言(如 Hy)相关的任何重大性能问题?

谢谢

请您参考如下方法:

您可以将创建一门(又一门!)新语言的任务分成至少两个大步骤:

  • 语法
  • 语义与解释

语法

您需要为您的语言定义语法,并使用指定如何从简单表达式创建复杂表达式的产生式规则。

示例:LISP 语法:

expression ::= atom   | list 
atom       ::= number | symbol     
number     ::= [+-]?['0'-'9']+ 
symbol     ::= ['A'-'Z''a'-'z'].* 
list       ::= '(' expression* ')' 

如何解读:一个表达式要么是一个原子,要么是一个列表;一个原子是一个数字或一个符号; 数字是...等等。

通常您还会定义一些标记化规则,因为大多数语法在标记级别而不是字符级别工作。

定义语法后,您需要一个解析器,给定一个句子(一个程序)能够构建派生树或抽象语法树。

例如,对于表达式x=f(y+1)+2,您要获取树:

有几种解析器(LL、LR、递归下降……)。您不一定需要自己编写语言解析器,因为有一些工具可以根据语法规范生成解析器( LEX & YACC 、 Flex & Bison 、 JavaCC 、 ANTLR ;另请查看 this list of parsers available for Python )。

如果你想跳过设计新语法的步骤,你可能想从一个简单的开始,比如 LISP 的语法。 Pyperplan 中甚至还有一个用 Python 编写的 LISP 解析器。项目。他们用它来解析 PDDL ,这是一种基于 LISP 的规划领域特定语言。

有用的读物​​:

语义与解释

一旦有了程序的抽象语法树,就可以执行程序了。有几种形式可以指定执行(部分)程序的“规则”:

  • 操作语义:一种非常流行的语义。它分为两类:
    • 小步骤语义:描述计算的各个步骤
    • Big Step Semantics:描述计算的整体结果
  • 归约语义:基于 lambda 演算的形式主义
  • 转换语义:如果你把你的解释器看成一个 transition system ,您可以使用转换语义指定其语义。这对于不会终止(即连续运行)的程序特别有用,例如 Controller 。

有用的读物​​: