你写了什么样的问题?

Ant*_*val 18 language-agnostic dsl

我只是对领域特定语言感到好奇.我在文章中已经多次看到它们,似乎它们可以在保证或银行数据定义问题之外使用.

所以我来到SO有一些具体的输入.

你有没有使用过DSL?写一个.如果是的话,感觉如何?

你认为你的一个项目可以用DSL更好(更高效,更易维护......)吗?

编辑:我很抱歉把它放在后面,但我的意思是你自己编写的特定DSL.它排除了Tex,HTML,Make,SQL.事实上,问题更多:"编写DSL"

T.E*_*.D. 8

SQL是Michael Dorfman给出的一个很好的例子.我广泛使用的其他人是:

  • UIL - GUI建设
  • 制作 - 程序构建和安装
  • regexp - 字符串模式匹配
  • lex和yacc - 词法分析器和编译器创建

至于它如何运作,我认为这取决于语言和领域.UIL对于指定GUI来说是非常棒的.如果你在内联Motif代码中执行相同的操作,那么UIL编译器捕获的GUI规范错误看起来就像是C或Ada编译器的完全可编译代码.这导致浪费更多时间浪费调试.另外,使用Motif API调用的通用代码看起来很简单.

Make真的可以成为一场噩梦,但是没有很多工具可以做它做的事情,我怀疑它们都有同样的问题.

正则表达式对于非常简单的任务是不必要的,对于非常复杂的任务来说是一场噩梦.对于那些中间人来说,他们是一个很棒的工具.

Lex和yacc非常有帮助.但是,知道自己在做什么的人可以手工创建解析器和词法分析器,并且工作量相同.


Fab*_*eeg 8

我会说,非常易读的API作为DSL的弱形式(有些人称之为流畅的接口),内部DSL作为介于两者之间的东西和另一端的完整语法定义的外部DSL之间存在着相当大的连续性.

最弱的形式是我总是试图实现的(即使API尽可能最接近问题域).如果非程序员将使用该软件,例如输入数据,则连续体另一端的DSL非常有意义.

使用像Xtext这样的框架甚至是完整的外部DSL,包括支持语法着色和错误检查的编辑器比最初看起来更容易实现.


Dar*_*ord 7

你的问题很合适.我最近使用工具Antlr编写了一个DSL .Antlr是一个解析器/词法分析器生成器.
它允许轻松构建DSL(以及许多其他东西),当与StringTemplate(由同一个人编写)结合使用时,代码生成变得非常强大.它还可以针对多种语言.我们的解析器和词法分析器在C#(目标之一)中,即使默认值是Java.

Antlr的众多优点之一是描述性错误消息和IDE /调试器(AntlrWorks),它允许您逐步查看语法并直观地查看AST树.

John Saunders在下面建议使用内置的visual studio DSL工具包.最终,我发现这些工具远远不能收缩.要求GUI,没有任何能够轻松描述基础文本语法的能力,似乎不足以满足我的需求.

除了DSL解析器/词法分析器,我还编写了一个Visual Studio语言服务,以提供智能感知,错误突出显示,代码完成和模板项目/项目.

即使你没有实现附加功能,DSL也可以简化重复性工作.我的DSL专门针对CSLA框架,使用所有管道轻松生成业务对象,允许开发人员只关心业务逻辑.

以下是DSL的一个小例子:

datadef Object1Datadef
{

   tables
   {
      MyTable:PK[MyTableID], column1, column2;
   }

}

root MyObject
{
    datadef Object1Datadef;

    read "all";
    write "admin", "superusers";

    int _Myvariable;    

}
Run Code Online (Sandbox Code Playgroud)

如果您的DSL允许您更快,更轻松地描述您的域并提高生产力,那么这是值得的.


Mic*_*man 6

我认为我们大多数人经常使用的DSL是SQL,一种用于数据操作和提取的小语言.


Mik*_*Two 3

我是NUnit 2.0 及更高版本的开发人员之一。它是使用 C# 属性编写的 DSL,用于描述单元测试。它不是 DSL 最明显的例子,但我开始将其视为一个。我用 ANTLR 甚至 MGrammar 写了一些其他的。经历往往是相同的。一旦你把它展示给别人,他们就会想做很多你从未想过的事情。这是一件好事,但您必须准备好继续前进并添加功能。

我现在养成了经常思考和编写 DSL 的习惯。我当前使用的对象关系映射器是 dsl。它不是一种新语言。它是纯 C#,但通过考虑领域语言,并且该领域不仅仅是业务领域,我们创建了一种迷你语言来映射对象。DSL 方面的思考改变了我们构建 API 和框架的方法。