如何在另一种语言之上开发领域特定语言?

时间:2010-05-06 01:54:59

标签: dns dsl

说我找到了一个用python编写的好的开源软件/库。我想将我创建的一些函数或方法包装成我自己易于理解的语言。

do porter_stemm(DOC)(DSL)等同于用python编写的函数或一系列方法。

我想创建一个易于学习的DSL,但需要将这个DSL翻译成原始的开源软件软件。

我不确定我在这里是否清楚,但我的意图是:

  1. 创建一种易于学习的代码语言,用户可以使用它来解决特定领域的问题。
  2. 这种简单的语言需要通过一些中间件翻译或编译或解释为原始的开源软件语言(python)。

2 个答案:

答案 0 :(得分:1)

编写DSL的语法和解析器,例如,在Python中,使用pyparsing(比传统的lexx-yacc方法更简单) - 解析器可以生成具有语义意义的节点树,然后您可以(更简单地)遍历该树并对其进行解释,或者(稍微简单一点)遍历该树并生成等效的Python代码。这是我为大多数主机语言建议的方法。一些主机语言(Lisp和Scheme是主要语言)具有强大的宏,因此在这些语言中,用宏构建DSL更为常见。

使用宿主语言嵌入你的DSL基本上意味着你并不是真正做DSL而是更传统的框架,所以这真的是一种不同的方法(可能更强大,但对于非程序员来说可能不那么容易学习) ; - 。)

答案 1 :(得分:0)

通常,DSL仍然具有与其宿主语言相同的基本语法,并且只是扩展语言的功能。因此,所有内容仍然是用Python编写的,它只是带有一些特定于域的函数,变量等的Python。

我使用DSL的经验主要是使用Lisp系列语言。在那里,典型的DSL可以用宏实现,它生成特定于DSL的代码模式。 (另外,与DSL相关的功能)。关键是,尽管宏和函数可以扩展语言的功能,但它们仍然以该语言实现。

我想你可以更进一步,用Python编写一个解释器 - 但是你仍然可以免费获得Python的运行性,因为你的解释器会将你的自定义语言翻译成Python。