.net 在为规则引擎创建DSL时使用什么技术?

.net 在为规则引擎创建DSL时使用什么技术?,.net,f#,dsl,rules,boo,.net,F#,Dsl,Rules,Boo,你会推荐什么技术来为一个客户创建DSL?为什么 建立了框架的体系结构,并通过一个产品测试进行了验证。我只想创建一个.NET处理器,将人类可读的规则转换为编译后的规则实现 我知道的选项有: 使用编译管道 使用F#- 不幸的是,鉴于DSL语法(这将不断发展),这些方法都没有提供任何东西来构建或多或少友好的IDE来编辑DSL 有什么想法或提示吗?如果您想创建一个友好的IDE来编辑DSL,使IDE完全图形化,并编译成.NET对象(或者使用类似IronPython的语言作为粘合语言) 如果规则足够简单

你会推荐什么技术来为一个客户创建DSL?为什么

建立了框架的体系结构,并通过一个产品测试进行了验证。我只想创建一个.NET处理器,将人类可读的规则转换为编译后的规则实现

我知道的选项有:

  • 使用编译管道
  • 使用F#-
不幸的是,鉴于DSL语法(这将不断发展),这些方法都没有提供任何东西来构建或多或少友好的IDE来编辑DSL


有什么想法或提示吗?

如果您想创建一个友好的IDE来编辑DSL,使IDE完全图形化,并编译成.NET对象(或者使用类似IronPython的语言作为粘合语言)

如果规则足够简单,则可以图形化地实现整个规则结构。 如果规则足够复杂,“人类可读性”将成为一个不可能实现的目标

无论哪种方式,如果创建中间代码的一组.NET类或IronPython对象不够“人类可读”,那么很有可能,您需要的是比语法更虚假的证明


也就是说,如果您只想创建一种程序员可以用来创建业务规则的简单语言,请随意使用上述任何一种语言,并将语法简化到不需要Visual Studio的IDE。

用于业务规则的图形化语言不是一个好主意。我会避免it业务规则中有大量的if检查和循环,这些都不能很好地可视化

您最好使用文本语言来描述业务规则

要获得编辑代码的非凡用户体验,您需要:

  • 具有良好错误恢复能力的解析器
  • 执行增量重新编译的能力
  • 良好的错误恢复允许您从语法不完整的构造中有效地确定编程人员的意图。这对于实现intellisence至关重要

    执行增量重新编译的能力使您能够对用户编辑进行有效的后台编译

    获得良好错误恢复的最简单方法是手工编写解析器。这样,您就可以使用任何数量的前瞻或算术规则来确定在出现语法错误时该怎么做

    当您使用解析器生成器来创建解析器时,在处理语法错误时会失去很多灵活性。这种灵活性决定了好的智力体验和糟糕的智力体验之间的区别。所以,我建议您使用递归下降手工编写

    实施Efficient重新编译需要您能够: 1) 正确地将语义分析分解为几个阶段(对于C#之类的东西,这将是:首先构造名称空间和类型符号,然后使用语句解析,然后解析基类,等等)。 2) 构造阶段感知依赖关系图的能力 3) 处理依赖关系图并响应用户编辑使其部分无效的算法

    对于全fleged编程语言,实现重新编译可能会变得非常棘手。在您的例子中,因为您正在描述业务规则,所以它对您来说可能更简单(或者如果编译速度足够快,您甚至可能不需要它)

    因此,我将从解析器开始,然后在其上构建intellisence


    如果你能避免VS集成,我会的。集成到VS中需要大量的管道,互操作可能会引起麻烦。有几家公司出售您将解析器连接到的windows窗体编辑器控件。与VS.相比,它更容易集成。

    另一个可能有趣的选择是使用F#quotes

    引用允许您将程序的一部分作为数据处理,因此您可以获取AST,分析它并将其翻译成其他语言,或者以某种非标准方式执行它。再加上F#的灵活性,你应该能够表达很多东西,因此你必须开发一个内部的F#DSL/combinator库来描述规则,并为F#Quotes开发一个翻译器/解释器来运行它们

    不确定业务规则可能是什么样子,但您可以这样写:

    let rule = <@
      if (exists customer having validEmail) then success
      else require whatever 
    @>
    
    let规则=
    
    我在我的博客上写了一篇关于这个话题的介绍。不幸的是,在F#CTP中已经有了一些大的变化,我还没有更新源代码,但它应该能让您很好地了解这种方法的可能性和局限性

    • -TomasP.Net
    DSL的一个很好的例子是F#单元测试框架:

    • -马修·波德维索基
    [编辑] 我只是想澄清为什么我认为这可能是一个好方法:

    • 如果您使用VisualStudio编辑DSL(并且您可以使用免费安装了F#的Shell版本),您将免费获得非常好的编辑体验。不仅是语法突出显示,还有IntelliSense,它将建议可能的结构,还有一个后台类型检查,作为DSL的“语法”检查器
    • 与其他方法相比,这可能是最容易实现的方法之一
    • 唯一的限制是您受到F#语法的限制。然而,设计自己的语言确实很困难,所以这可能一点也不坏。特别是考虑到F#的灵活性
    [/编辑]


    希望这有帮助

    我会使用Boo,我认为它是目前创建DSL最灵活的工具之一。关于这个问题有一个很好的解释。博客也是很好的灵感来源

    关于IDE,您可以扩展,看看。

    JetBrains

    您可以为任何新语言定义自定义语言编辑器和其他约束,以便使用这些DSL变得非常简单。不熟悉传统编程的领域专家可以使用domai轻松地使用其领域特定语言在MPS中工作