Ant*_*val 18 language-agnostic dsl
我只是对领域特定语言感到好奇.我在文章中已经多次看到它们,似乎它们可以在保证或银行数据定义问题之外使用.
所以我来到SO有一些具体的输入.
你有没有使用过DSL?写一个.如果是的话,感觉如何?
你认为你的一个项目可以用DSL更好(更高效,更易维护......)吗?
编辑:我很抱歉把它放在后面,但我的意思是你自己编写的特定DSL.它排除了Tex,HTML,Make,SQL.事实上,问题更多:"编写DSL"
SQL是Michael Dorfman给出的一个很好的例子.我广泛使用的其他人是:
至于它如何运作,我认为这取决于语言和领域.UIL对于指定GUI来说是非常棒的.如果你在内联Motif代码中执行相同的操作,那么UIL编译器捕获的GUI规范错误看起来就像是C或Ada编译器的完全可编译代码.这导致浪费更多时间浪费调试.另外,使用Motif API调用的通用代码看起来很简单.
Make真的可以成为一场噩梦,但是没有很多工具可以做它做的事情,我怀疑它们都有同样的问题.
正则表达式对于非常简单的任务是不必要的,对于非常复杂的任务来说是一场噩梦.对于那些中间人来说,他们是一个很棒的工具.
Lex和yacc非常有帮助.但是,知道自己在做什么的人可以手工创建解析器和词法分析器,并且工作量相同.
你的问题很合适.我最近使用工具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允许您更快,更轻松地描述您的域并提高生产力,那么这是值得的.
我是NUnit 2.0 及更高版本的开发人员之一。它是使用 C# 属性编写的 DSL,用于描述单元测试。它不是 DSL 最明显的例子,但我开始将其视为一个。我用 ANTLR 甚至 MGrammar 写了一些其他的。经历往往是相同的。一旦你把它展示给别人,他们就会想做很多你从未想过的事情。这是一件好事,但您必须准备好继续前进并添加功能。
我现在养成了经常思考和编写 DSL 的习惯。我当前使用的对象关系映射器是 dsl。它不是一种新语言。它是纯 C#,但通过考虑领域语言,并且该领域不仅仅是业务领域,我们创建了一种迷你语言来映射对象。DSL 方面的思考改变了我们构建 API 和框架的方法。