首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的微型DSL实现

Python中的微型DSL实现
EN

Stack Overflow用户
提问于 2015-06-26 19:30:25
回答 2查看 2.1K关注 0票数 2

我正在研究用Python实现DSL,我正在寻找一种小型DSL语言,对那些没有设计和实现语言经验的人来说是友好的。到目前为止,我回顾了两个实现,即Hy和Mochi。Hy实际上是一种lisp方言,Mochi似乎非常类似于长生不老药。这两个问题对我来说都很复杂,因为我现在的目标是在语言的原型中四处游玩,以便找出它是否真的有助于解决问题,是否符合问题所需的风格。我知道Python通过标准库中提供的语言工具得到了很好的支持。到目前为止,我实现了一个非常简单的lisp方言,实际上,我没有使用python,它纯粹是通过字符串处理实现的,而字符串处理对于我所要寻找的内容来说是完全不灵活的。

是否有任何实现,而不是上面提到的两种语言,足够小以供研究?

在这个问题上,有哪些好书(在某种意义上实用,不仅停留在理论和学术方面)?

研究Python并使用它的好方法是什么?

在实际生成的字节码的开销方面,是否存在与Python (如Hy )构建的语言相关的显著性能问题?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-26 19:55:44

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

  • 语法
  • 语义与解释

语法

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

示例:LISP的语法:

代码语言:javascript
复制
expression ::= atom   | list
atom       ::= number | symbol    
number     ::= [+-]?['0'-'9']+
symbol     ::= ['A'-'Z''a'-'z'].*
list       ::= '(' expression* ')'

如何读取:表达式要么是原子,要么是列表;原子是数字或符号;数字是.诸若此类。

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

一旦定义了语法,您就需要一个解析器,该解析器给定一个句子(程序),可以构建派生树或抽象语法树。

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

有几个解析器(LL、LR、递归下降、.)。您不一定需要自己编写语言解析器,因为有一些工具可以从语法规范(LEX & YACCFlex & BisonJavaCC;也可以检查这个可用于Python的解析器列表)生成解析器。

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

有用的读物:

语义与解释

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

  • 操作语义:非常流行的一种。它分为两类:
    • 小步骤语义:描述计算的各个步骤
    • 大步骤语义:描述计算的总体结果

  • 约简语义:一种基于lambda演算的形式化
  • 转换语义:如果像过渡系统一样查看解释器,就可以使用转换语义指定它的语义。这对于不终止(即连续运行)的程序尤其有用,比如控制器。

有用的读物:

票数 6
EN

Stack Overflow用户

发布于 2017-03-16 17:28:25

编写自己的语言并不需要对解析有太多的了解。

我编写了一个库,让您可以很容易地做到这一点:https://github.com/erezsh/lark

下面是我写的一篇博文,解释如何用它来编写你自己的语言:http://blog.erezsh.com/how-to-write-a-dsl-in-python-with-lark/

我希望你不要介意我无耻的插头,但它似乎与你的问题非常相关。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31080796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档