DSL:从DSL规则到C#表达式

boj*_*boj 1 c# compiler-construction dsl designer dsl-tools

问题可能是复合的,让我扩展它:

  • 是否存在基于.NET对象公共bool属性创建基于AND/OR的规则的设计器(存根/框架/元设计器)?保存为任何DSL/Boo/...输出.
  • 是否可以将DSL输出编译成C#表达式?

我们的主要问题是文档和代码之间的差距.我们的产品基于数百个用户定义的规则,我们希望加快变更请求.

如果我们能够为用户提供一个简单的设计器并获取输出,那么在将其转换/编译成C#/ IL代码后,我们就会有一个快速的变更请求周期.

我知道我们的问题是具体的,但任何"墙上的砖头"都是受欢迎的!

示例:

AC#class,主题:

public class TestA
{
     public bool B {...}
     public bool C {...}
}
Run Code Online (Sandbox Code Playgroud)

在设计师中,我们应该能够创造

  • 任何类型的图形设计师(即选择公共属性的下拉列表)

DSL输出:

If TestA.B AND TestA.C Then Return True;
Run Code Online (Sandbox Code Playgroud)

C#输出:

if (testA.B && testA.C) { return true; }
Run Code Online (Sandbox Code Playgroud)

更新#1

我很高兴使用支持使用静态类型.NET类的DSL语言.我的意思是如果用户可以检查代码(示例中的"在DSL输出"),我们不需要设计器.

更新#2

基于tipp,我盯着表达树.几天之后我遇到了DLinq - 我从来不是DLinq的忠实粉丝,但在这种情况下非常适合问题领域.

  • 易于解析(A> 2 AND B <4)或C = 5到表达式树中
  • 很容易创建这样的表达式
  • 很容易序列化/反序列化
  • 基于FlowLayoutPanel的GUI可以很好地用作"表达式构建器"

Sco*_*ski 5

你可以用自己来构建这样的东西.

您可以使用Type.GetMembers()获取类的所有公共属性的列表

但是,我不会生成C#代码,而是使用表达式树.

这样,当用户更改规则时,您不需要涉及C#编译器.相反,您可以将规则存储在数据库中,在运行时加载它们,然后使用Expression.Compile()方法创建可以调用以运行代码的委托.

更新:

在评论中有人问"Expression Tress和域特定语言有什么区别?"

这是答案:

表达式树和领域特定语言是正交的东西.

表达式tress只是一个表示C#表达式的API,可以方便地在运行时动态转换为委托.

DSL或域特定语言是一种旨在解决一小类问题的编程语言.

它们本质上是完全不同的东西.

如果您愿意,可以将表达式树用作DSL实现的一部分.Linq将它们用于此目的.

但是,在您的情况下,您不需要DSL.您需要的是一个生成规则的用户界面(类似于outlook的工作方式),然后是执行这些规则的方法.

创建UI只是普通的UI开发.

表达式树是您可以用来实现规则的.