我正在研究用 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 的规划领域特定语言。
有用的读物:
- 书籍:Compilers: Principles, Techniques, and Tools 作者:Alfred Aho、Jeffrey Ullman、Monica S. Lam 和 Ravi Sethi,也称为The Dragon Book (因为封面中的龙)
- https://en.wikipedia.org/?title=Syntax_(programming_languages)
- https://en.wikibooks.org/wiki/Introduction_to_Programming_Languages/Grammars
- How to define a grammar for a programming language
- https://en.wikipedia.org/wiki/LL_parser
- https://en.wikipedia.org/wiki/Recursive_descent_parser
- https://en.wikipedia.org/wiki/LALR_parser
- https://en.wikipedia.org/wiki/LR_parser
语义与解释
一旦有了程序的抽象语法树,就可以执行程序了。有几种形式可以指定执行(部分)程序的“规则”:
- 操作语义:一种非常流行的语义。它分为两类:
- 小步骤语义:描述计算的各个步骤
- Big Step Semantics:描述计算的整体结果
- 归约语义:基于 lambda 演算的形式主义
- 转换语义:如果你把你的解释器看成一个 transition system ,您可以使用转换语义指定其语义。这对于不会终止(即连续运行)的程序特别有用,例如 Controller 。
有用的读物:
- 书籍:操作语义的结构化方法 [ pdf link ] Gordon D. Plotkin 着
- 书籍:Structure and Interpretation of Computer Programs 作者:Gerald Jay Sussman 和 Hal Abelson
- 书籍:Semantics Engineering with PLT Redex (SEwPR),作者:Matthias Felleisen、Robert Bruce Findler 和 Matthew Flatt
- https://en.wikipedia.org/wiki/Semantics_(computer_science)
- https://en.wikipedia.org/wiki/Operational_semantics
- https://en.wikipedia.org/wiki/Transition_system
- https://en.wikipedia.org/wiki/Kripke_structure_(model_checking)
- https://en.wikipedia.org/wiki/Hoare_logic
- https://en.wikipedia.org/wiki/Lambda_calculus
