9

我做了一些关于在 Visual Studio 中开发 DSL 的搜索。一开始,我发现VS2010有一个Visualization and Modeling SDK。它有一个称为 DSL 工具的工具。但它似乎只用于图形 DSL 开发。

然后我看到一些帖子说“Oslo”是一种用于开发文本 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 解析器,你怎么看?

4

6 回答 6

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 后端。:)

-尼尔

于 2011-02-16T21:49:06.423 回答
6

我是嵌入式 DSL 的粉丝,我喜欢

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 都是各种选择。(我没有足够的经验来了解它们之间的权衡。)

于 2011-02-16T20:28:28.343 回答
2

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

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

于 2011-04-06T14:44:08.600 回答
1

Martin Fowler 有一本关于 DSL:s 的新书。遗憾的是,它不会过多讨论微软的工具和功能语言。

Microsoft 不再支持图形工具“Quadrant”,但仍然支持 MGrammar 并集成到 SQL Server 中,对吧?MGrammar 是“DSL 制作语言”。

不过,我会说函数式语言(阅读:F#)是要走的路。

这本书有一个关于如何使用 F# 制作 DSL 的简单示例:http: //www.manning.com/petricek/ 并且 Google 还找到了许多其他关于这个主题的好参考资料。

于 2011-02-16T20:33:33.070 回答
0

试试MBase,但只有当你的 DSL 足够复杂以至于需要高效的编译器和 PEG 语法时才值得使用。否则 FsYacc 绰绰有余。

于 2011-02-21T13:46:02.980 回答
0

我们的 DMS Software Reengineering Toolkit 旨在处理任意 DSL(我恰好是架构师)。

大多数人认为,如果你有一个解析器,你就足够了,这在技术上是正确的,就像如果你有晶体管,你就可以建造一台计算机。

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

DMS提供所有这些功能来支持构建 DSL。从这个意义上说,它远远超出了 F#。

于 2011-03-21T04:12:51.017 回答