使用Microsoft Visual Studio进行文本域特定语言(DSL)开发

时间:2011-02-16 19:37:27

标签: visual-studio f# dsl-tools dsl oslo

我在视觉工作室开发了一些DSL。最初,我发现VS2010有一个可视化和建模SDK。它有一个名为DSL工具的工具。但它似乎只适用于图形DSL开发。

然后我看到一些帖子说“奥斯陆”是一个用于开发文本DSL的工具,它“是”微软产品 - 微软不再支持该工具。 http://blogs.msdn.com/b/modelcitizen/archive/2010/09/22/update-on-sql-server-modeling-ctp-repository-modeling-services-quot-quadrant-quot-and-quot-m-quot.aspx

因此,我想知道我是否想开发一个文本DSL,哪种工具最好?如果我使用F#powerpack和FSLex和FSYacc实现DSL解析器,你怎么看?

6 个答案:

答案 0 :(得分:7)

我目前正在使用FsLex / FsYacc开发几种基于文本的外部DSL。我正在使用手动解析器,但我发现FsLex / FsYacc在设计阶段更容易维护。

FsLex / FsYacc不如ANTLR复杂,但由于大多数DSL 相当简单,因此FsLex / FsYacc是在Visual Studio中使用的完美选择。保持DSL简单是一件好事,因为它们旨在受到限制并且易于学习。

我发现Martin Fowler的书是一个很好的资源,不像示例和细节,而是作为DSL思想的百科全书。他对DSL的可用性和其他设计方面的讨论也值得一读。正如Toumas所说,它不包括F#或函数语言。福勒先生写道,他缺乏这些科目的经验,无法及时将这本书推向市场。

赞扬了FsLex / FsYacc,我仍然希望有人为F#写一个好的ANTLR后端。 :)

-Neil

答案 1 :(得分:6)

我是嵌入式DSL的粉丝,la

http://lorgonblog.wordpress.com/2010/04/15/using-vs2010-to-edit-f-source-code-and-a-little-logo-edsl/

http://lorgonblog.wordpress.com/2010/04/16/fun-with-turtle-graphics-in-f/

你只需使用杠杆F#语法和一些好的函数名称以及可能的其他语法聪明(列表,工作流程......)来获得“看起来可能是另一种语言”的代码,但实际上只是F#。

但是,对于外部DSL,你只需要一个语法/解析器/等工具链,而且FsLex / FsYacc,或者ANTLR或FParsec都是各种选择。 (我没有足够的经验来解决其中任何一个问题。)

答案 2 :(得分:2)

自从我早些时候发表文章以来,我还购买并阅读了部分Terence Parr的书“语言实现模式”。它非常出色,虽然比Martin Fowler的书更具技术性(有一些额外的材料可能是“龙书”为新千年)。这些示例主要基于Java和ANTLR,但文本是主要内容,因此无论一个人的语言开发环境如何,本书都很有用。

有趣的是,两本书之间几乎没有重叠。 Martin Fowler的书很好地介绍了基本DSL的设计和实现,例如用于规范和配置的那些,而Terence Parr的书更具技术性,涵盖了通过更复杂的语言和字节码扩展的领域。机器。如果你可以为它们预算,我建议两者,否则,它们在给定的域内是一个很好的选择。

答案 3 :(得分:1)

Martin Fowler对于DSL有一个new book。遗憾的是,它不会讨论微软的工具或功能语言。

微软不再支持图形工具“Quadrant”,但MGrammar仍然支持并集成到SQL服务器,对吗? MGrammar是“DSL制作语言”。

不过,我会说功能性语言(阅读:F#)是可行的方法。

本书提供了一个如何使用F#制作DSL的简单示例:http://www.manning.com/petricek/ 谷歌也找到了很多关于这个主题的好的参考资料。

答案 4 :(得分:0)

尝试MBase,但如果您的DSL足够复杂,需要高效的编译器和PEG语法,那么它是值得使用的。否则FsYacc绰绰有余。

答案 5 :(得分:0)

我们的DMS软件再造工具包旨在处理任意DSL(我恰好是架构师)。

大多数人认为如果你有足够的解析器,从技术上讲它是正确的,就像你有晶体管一样,你可以构建一台计算机。

根据我的经验,您需要的不仅仅是解析器:您需要构建符号表的方法,以便您的生成器知道特定标识符的含义,分析规范的方法,轻松编码翻译的方法和将优化应用于生成的结果。

DMS provides all these capabilities以支持构建DSL。从这个意义上说,它远远超出F#。