为 .Net 平台编写领域特定语言 (DSL)

11

我正在考虑编写一个能够在.Net环境下运行的领域特定语言DSL。我很可能会使用C#来实现,不过我对此有一定的灵活性。

有没有推荐的在线资源可以展示编写.Net平台DSL的主要步骤呢?

理想情况下,我希望能够提供以下概述:

  • “规格”的定义
  • 如何将规格映射到.Net框架中
  • 最好有一个在.Net语言中实现的简单DSL的“HelloWorld”示例

[编辑]

实际上,我刚刚看到了这篇文章——但它略微过时。是否有人认为这篇文章是一个好的起点呢(.Net框架和C#似乎发展得非常快)?


您可以查看ANTLR(http://www.antlr.org/)。当你说将规格映射到.NET Fx时,我不确定你的意思。您是想构建一种语言和编译器,该编译器生成IL代码并可以轻松使用来自FCL的类型吗?如果是,则可能不起作用。我曾经使用ANTLR解析公式表达式(用于引用业务实体和自定义函数),但是再由我的程序解释分析树。 - VinayC
我想避免使用像lexx/yacc/antlr等“低级”解析器生成器/编译器编译器。基本上,我想创建一个“.Net”语言的“玩具”版本(作为起始模板)。更具体地说,这个“玩具”语言将生成CIL代码,并且可以使用CLR。 - morpheous
1
考虑到“DSL”中的“D”,我会首先问:“领域是什么?” DSL并不等同于“玩具语言”。听起来你的目标是一个小型/简单通用语言,而不是特定领域语言。 - nerraga
请查看这篇文章(http://www.javaworld.com/article/2077865/core-java/core-java-creating-dsls-in-java-part-1-what-is-a-domain-specific-language.html)。 - VivekDev
4个回答

8

这是我最终选择的路线。我已经了解Python,所以对我来说,Boo代表了最浅的学习曲线。顺便说一句,我已经从亚马逊订购了这本书(这甚至是在你发帖之前 - 因为我在发布问题后不久进行了一些进一步的研究)。 - morpheous
Microsoft的链接已经失效。 - Aryan Firouzian

6

有许多不同的解决方案可供选择,包括你提供的文章链接,还有一些来自微软的其他示例...

  • FsLex/FsYacc - 这是 F# 中流行词法分析器和语法分析器 Lex 和 Yacc 的移植版。但不要立刻放弃,如果你以前没有使用过 F#,那么它有一个叫做 "pattern matching" 的功能,可以让你匹配非常复杂的结构(例如遍历树),而不需要大量的 if/else 或者 switch 语句。这非常适合编译语言 - 因为几乎所有 DSL 解决方案都通过将语言解析成 AST(抽象语法树)来工作。在这个 F# 解决方案中,你可以获得一个具有强类型的树形结构。你可以使用F# Parsed Language Started 来开始学习。(也有很多现成的 Lex/Yacc 语法规则可以帮助你)。

  • SQL Server Modeling Tools(以前叫 "Oslo") - 包含一种称为 M 的语言,以前被分成几个部分之一是 MGrammar。它是一个相当先进的语法分析器,可以节省你比其他语法规则更多的时间 - 代码模式(或通用语法规则)和优先级内置且易于使用。如果你刚开始学习解析,我会推荐这个,因为它带有一个可视化工具 - Intellipad,它具有 3 面板 DSL 模式,你可以在其中输入你的语言和一些示例代码 - 它会显示你输入时的输出 AST - 这是相当高效的。生成的 AST 是一个有效的 M 语言构造器(MGraph),可以与 SQL 和 XML 等服务一起使用。MGrammar 的缺点之一是从 C# 或其他地方遍历 AST 是一个繁琐的过程。没有任何强类型支持,你必须使用对象并通过字符串进行搜索 - 很麻烦并容易出错。MSDN 上有一些示例和 Channel9 上的一些视频,可以帮助你入门,例如这个详细概述

  • The Visualization and Modeling SDK - 这是一个完整的解决方案,集成在 VS 中,主要侧重于使用 Visual Studio 的设计工具而非代码进行编写。它带有一个最小的语言起始模板来帮助你入门。我没有使用过,无法推荐。

还有许多其他非微软的解决方案,比如你提到的 C# 目标 ANTLR 等。如果你正在重用现有的语法规则,这些解决方案特别有用 - 因为已经有数十种语法规则可供使用。


2
你可以尝试使用JetBrains的MPS。它是一个非常丰富和强大的生态系统,用于生成DSL。我自己从未使用过它,所以要谨慎,但它是免费的,所以我想尝试一下也不会有太大的风险。

这会为.Net平台生成代码吗?我在论坛和网站本身上进行了搜索,答案似乎是否定的 - 我有什么遗漏的吗? - morpheous
嗯,我以为它有,但似乎只有一些非常初步的努力:http://mps-csharp.googlecode.com/svn/trunk/。 - Marcelo Cantos

1

请查看我的开源项目meta#。它听起来就像你正在寻找的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接