我正在研究用Python实现DSL,我正在寻找一种小型DSL语言,对那些没有设计和实现语言经验的人来说是友好的。到目前为止,我回顾了两个实现,即Hy和Mochi。Hy实际上是一种lisp方言,Mochi似乎非常类似于长生不老药。这两个问题对我来说都很复杂,因为我现在的目标是在语言的原型中四处游玩,以便找出它是否真的有助于解决问题,是否符合问题所需的风格。我知道Python通过标准库中提供的语言工具得到了很好的支持。到目前为止,我实现了一个非常简单的lisp方言,实际上,我没有使用python,它纯粹是通过字符串处理实现的,而字符串处理对于我所要寻找的内容来说是完全不灵活的。
是否有任何实现,而不是上面提到的两种语言,足够小以供研究?
在这个问题上,有哪些好书(在某种意义上实用,不仅停留在理论和学术方面)?
研究Python并使用它的好方法是什么?
在实际生成的字节码的开销方面,是否存在与Python (如Hy )构建的语言相关的显著性能问题?
谢谢
发布于 2015-06-26 19:55:44
您可以拆分创建一个(又一个!)的任务!新语言至少有两大步骤:
语法
您需要为您的语言定义语法,并使用生产规则指定如何从简单表达式中创建复杂表达式。
示例: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、反;也可以检查这个可用于Python的解析器列表)生成解析器。
如果您想跳过设计新语法的步骤,您可能希望从一个简单的语法开始,比如LISP语法。在派珀普兰项目中甚至有一个用Python编写的LISP解析器。他们使用它来解析PDDL,这是一种基于LISP的特定于领域的规划语言。
有用的读物:
语义与解释
一旦有了程序的抽象语法树,就需要执行程序。有几种用于指定要执行(部分)程序的“规则”的形式:
有用的读物:
发布于 2017-03-16 17:28:25
编写自己的语言并不需要对解析有太多的了解。
我编写了一个库,让您可以很容易地做到这一点:https://github.com/erezsh/lark
下面是我写的一篇博文,解释如何用它来编写你自己的语言:http://blog.erezsh.com/how-to-write-a-dsl-in-python-with-lark/
我希望你不要介意我无耻的插头,但它似乎与你的问题非常相关。
https://stackoverflow.com/questions/31080796
复制相似问题