我正在研究用Python实现DSL,我正在寻找一种对没有设计和实现语言经验的人友好的小型DSL语言。到目前为止,我回顾了Hy和Mochi的两个实现。 Hy实际上是lisp的方言,而Mochi似乎与Elixir非常相似。对我来说,两者都很复杂,因为我的目标是对语言进行原型设计并在其中进行游戏,以便找出它是否真的有助于解决问题并适应问题需要与否的风格。我知道Python通过标准库中提供的语言工具提供了很好的支持。到目前为止,我实现了一个非常简单的lisp方言,我没有使用任何python AST,它纯粹是通过字符串处理实现的,这对于我正在寻找的东西绝对不灵活。
是否有任何实现而不是上面提到的两种语言,小到可以研究?
在这个问题上,有哪些好书(在某种意义上是实用的,不仅仅是坚持政治和学术方面)?
学习Python AST并使用它的好方法是什么?
在实际生成的字节码的开销方面,是否存在与基于Python构建的语言(如Hy)相关的任何重大性能问题?
由于
答案 0 :(得分:3)
您可以在至少两个重要步骤中分割创建(又一种!)新语言的任务:
您需要为您的语言定义语法,并使用生成规则指定如何从简单表达式创建复杂表达式。
示例:LISP的语法:
expression ::= atom | list
atom ::= number | symbol
number ::= [+-]?['0'-'9']+
symbol ::= ['A'-'Z''a'-'z'].*
list ::= '(' expression* ')'
如何阅读:表达式是 atom 或 list ; atom 是数字或符号; 数字是...等等。
通常,您还会定义一些标记化规则,因为大多数语法都在令牌级别工作,而不是在字符级别。
一旦你定义了你的语法,你需要一个解析器,给定一个句子(一个程序)能够构建派生树或抽象语法树。
例如,对于表达式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的规划。
有用的读物:
获得程序的抽象语法树后,您需要执行程序。有几种形式可以指定执行(部分)程序的“规则”:
有用的读物:
答案 1 :(得分:2)
你真的不需要了解很多关于编写自己语言的解析。
我写了一个库,可以让你轻松地做到这一点:https://github.com/erezsh/lark
以下是我发表的博文,解释如何使用它来编写自己的语言:http://blog.erezsh.com/how-to-write-a-dsl-in-python-with-lark/
我希望你不介意我的无耻插件,但它似乎与你的问题非常相关。