当前位置:  开发笔记 > 编程语言 > 正文

构建有效的外部DSL

如何解决《构建有效的外部DSL》经验,为你挑选了2个好方法。

我有什么工具可以构建一个真正的,诚实的,善良的外部DSL.不,我不是在讨论滥用Ruby,Boo,XML或其他现有语言或语法,我的意思是真正的外部DSL - 我自己的语言.

我知道有一些语言工作台正在开发中,我听说过像"反讽"这样的东西.而且,当然还有ANTLR,Lex/Yaac等,但我担心这些对于我正在尝试的事情来说太复杂了.

请谈谈您可能已经使用或听过的DSL构建工具以及您对它的帮助及其缺点的印象.



1> Nathan..:

我在Boo,Irony.NET和一个名为Grammatica的工具包中编写了DSL.你说解析器生成器过于复杂,但你的判断可能过于仓促,事实上,一旦你克服了一个小的学习曲线,它们就很容易使用,并开辟了一个可以轻易覆盖的广阔世界.努力.我发现学习为大多数解析器生成器编写语法所需的符号有点类似于学习正则表达式 - 你必须稍微弯曲一下才能让它们进入,但是奖励很重要.

我的意见是:如果你的目标语言足够简单,可以由一个愚蠢的视觉设计师处理,那么使用解析器生成器为它编写语法应该很容易.

如果你的目标DSL足够复杂,你需要打破写一个语法的汗水,那么愚蠢的视觉工具无论如何都不会削减芥末,你最终还是要学会写一个语法.

不过,我同意长期内部与外部DSL的关系.我在Boo中编写了一个内部DSL,并且必须修改我的DSL语法以使其工作,并且它总是感觉像是一个黑客.使用Irony.NET或ANTLR的相同语法同样易于实现,具有更大的灵活性.

我有一篇博客文章讨论了一些选项.这篇文章的主要内容是编写用于运行时表达式评估的DSL,但这些工具都是相同的.

我对Irony.NET的体验是积极的,并且使用它实现了一些参考语言,这是一个很好的起点.如果您的语言很简单,启动和运行绝对不复杂.CodeProject上还有一个名为TinyParser的库 - 这个非常有趣,因为它将解析器生成为纯源代码,这意味着您的最终产品完全没有任何第三方引用.不过,我自己没有用过它.



2> 小智..:

如果您正在考虑编写独立的DSL,那么您正在研究构建编译器 - 没有办法解决它.编译器构造必不可少的编程知识,它实际上并不像通常认为的那么困难.Steve Yegge的Righ Programmer Food总结了如何很好地构建编译器的价值.

有很多方法可以开始.我建议查看文章中提到的2篇论文:想编写一个编译器吗?请阅读这两篇论文.第一个,让我们构建一个编译器,非常容易访问.它使用Turbo Pascal作为实现语言,但您可以使用任何其他语言轻松实现它 - 源代码非常清晰.Pascal是一种简单的语言.

一旦你对事情的运作方式和所涉及的术语有了良好的认识,我建议钻研像ANTLR这样的东西.ANTLR有一个很好的IDE,ANTLRWorks,它带有一个解释器和一个调试器.它还可以即时生成非常好的语法可视化.我发现它在学习上非常宝贵.

ANTLR有几个很好的教程,虽然它们起初可能有点压倒性.这个很好,虽然它是针对ANTLR 2.0的,所以你可能会遇到与更新版本不兼容的问题(目前最新的版本是3.1).

最后,还有另一种DSL方法:Lisp方法.鉴于Lisp的无语法特性(您的代码基本上是抽象语法树),只要您习惯了括号,就可以用它来塑造无穷无尽的语言.

如果你采用这种方法,你想使用嵌入式Lisp.在Java下,你有Clojure,一种Lisp方言,可以与JVM及其库完美地互操作.我没有亲自使用它,但它看起来不错.对于Scheme,有GNU Guile,它是根据LGPL许可的.对于Common Lisp,有ECL,也在LGPL下.两者都使用C接口实现互操作性,因此您几乎可以将它们嵌入到任何其他语言中.ECL在Lisp中是独一无二的,因为每个Lisp函数都是作为C函数实现的,所以你可以在C语言中编写Lisp代码(比如说,在你自己的扩展方法中 - 你可以创建在Lisp对象上运行的C函数,然后从Lisp中调用它们.我一直在使用ECL作为我的侧面项目,我喜欢它.维护者非常积极和敏感.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有