代码之家  ›  专栏  ›  技术社区  ›  boj

DSL:从DSL规则转换为C表达式

  •  1
  • boj  · 技术社区  · 16 年前

    这个问题可能是复合的,让我把它展开:

    • 它是否存在 设计师 (stub/framework/meta designer)基于.NET对象公共bool属性创建和/或基于规则?另存为任何DSL/boo/…输出。
    • 是否可以编译 DSL输出到C# 表达?

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

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

    我知道我们的问题是具体的,但任何“墙中之砖”都是受欢迎的!

    例子 :

    C类,主题:

    public class TestA
    {
         public bool B {...}
         public bool C {...}
    }
    

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

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

    DSL中的输出:

    If TestA.B AND TestA.C Then Return True;
    

    C输出:

    if (testA.B && testA.C) { return true; }
    

    更新第1号

    我很乐意使用支持静态类型.NET类的DSL语言。我是说如果用户可以检查代码( “DSL中的输出” 在这个例子中,我们不需要设计师。

    更新第2号

    根据提示,我盯着表情树。几天后,我遇到了DLINQ——我从来不是DLINQ的忠实粉丝,但在这种情况下,它非常适合问题领域。

    • 易于解析 (A>2和B<4)或C=5 到表达式树
    • 很容易创建这样的表达式
    • 非常容易序列化/反序列化
    • 基于flowlayoutpanel的GUI作为“表达式生成器”工作得很好。
    2 回复  |  直到 16 年前
        1
  •  5
  •   Scott Wisniewski    16 年前

    你可以建立这样的自我。

    可以使用type.getmembers()获取类的所有公共属性的列表。

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

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

    更新:

    在评论中,有人问“表达式tres和特定于域的语言有什么区别?”

    答案如下:

    表达式树和特定于域的语言是正交的。

    表达式tres只是表示C表达式的API,可以方便地在运行时动态转换为委托。

    DSL,或特定于领域的语言,是一种程序设计语言,旨在解决一类狭小的问题。

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

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

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

    创建UI只是正常的UI开发。

    表达式树可以用来实现规则。

        2
  •  0
  •   John Saunders    16 年前

    这是一个鲜为人知的事实,Windows工作流基础设计器及其规则引擎尤其可以托管在与VisualStudio分离的Windows窗体应用程序中。以这种方式编写的规则也可以独立于实际的工作流进行评估。

    WF Scenarios Guidance: Workflow Designer Re-Hosting Tutorial: Hosting the WF Designer .