Language agnostic 业务对象的特定于域的语言?

Language agnostic 业务对象的特定于域的语言?,language-agnostic,code-generation,Language Agnostic,Code Generation,我正在考虑编写一种领域特定语言(DSL)来为业务对象建模。DSL将不会被执行,而是由基于模板的代码生成器(可能是CodeSmith)使用它来生成.NET和SQL DSL将需要支持以下元素的定义: 类别(名称和说明) 属性(名称、友好名称、类型、空/非空) 简单验证(必需、正则表达式、范围等) 类之间的关系(1到1、1到多、多到多) 继承(好的,可能在版本2中) 下面是一个DSL代码的简单示例: Class: Insured Desc: "Represents a person cover

我正在考虑编写一种领域特定语言(DSL)来为业务对象建模。DSL将不会被执行,而是由基于模板的代码生成器(可能是CodeSmith)使用它来生成.NET和SQL

DSL将需要支持以下元素的定义:

  • 类别(名称和说明)
  • 属性(名称、友好名称、类型、空/非空)
  • 简单验证(必需、正则表达式、范围等)
  • 类之间的关系(1到1、1到多、多到多)
  • 继承(好的,可能在版本2中)
下面是一个DSL代码的简单示例:

Class: Insured
  Desc: "Represents a person covered by an insurance policy"
  Prop: FirstName, "First Name", String(20), not null
  Prop: LastName, "Last Name", String(20), not null
  Prop: MailAddress, "Mailing Address", Address, not null
  Prop: SSN, "Social Security Number", String(9), null      
  Rule: RegEx, SSN, ^\d{9}$

Class: Address
  Prop: Line1, "Line 1", String(30), not null
  Prop: City, "City", String(30), not null
  Prop: State, "State", String(2), not null
  ...
为了使DSL保持简单,更复杂的验证规则将用目标语言编码。当前的计划是禁止生成代码,并将更复杂的规则添加到子类中


有人写过类似的东西吗?您可以提供类似解决方案的提示或链接吗?

建议您看一看,如果只是为了避免重新创建它。

建议您看一看,如果只是为了避免重新创建它。

自动将您呈现的结构转换为XML非常容易。从这里开始,我设想可以通过XSLT或XQuery编写某种转换,转换成您想要的任何最终结果。我编写了一个名为visualstudio的外接程序,以便于进行转换


如果您真的想编写自己的解析器,我建议您查看现有的文本DSL解决方案,例如。

自动将呈现的结构转换为XML非常容易。从这里开始,我设想可以通过XSLT或XQuery编写某种转换,转换成您想要的任何最终结果。我编写了一个名为visualstudio的外接程序,以便于进行转换

如果您真的想编写自己的解析器,我建议您查看现有的文本DSL解决方案,例如。

我有一个项目,名为,在创建将用户故事建模为C#接口和单元测试的DSL时,我使用了框架的一部分

示例输入的一部分:

begin story "AUserStory":
begin setup 
    @Person to have a ~Spouse(@Person) 
            ~IsActive(true) 
            ~Age(0) 
            ~IsDead(false) 
            and several ~Children(@Person)
            and a ~Location(@Location)
        I want a @Person to be able to #Kill another @Person
        I want a @Person to be able to #Marry another @Person
        I want to be able to #Find all @Person
    @Location to have a ~Latitude(0.0)
            and a ~Longitude(0.0)
end setup
相应生成的C#代码:

[PluginFamily(“bdUnit”)]
公共接口IPerson
{
IPerson{get;set;}
布尔是活动的{get;set;}
int Age{get;set;}
bool IsDead{get;set;}
IList子项{get;set;}
ILocation位置{get;set;}
无效终止(IPerson用户);
void Marry(IPerson用户);
void Find();
}
[插件家庭(“bdUnit”)]
公共接口定位
{
十进制纬度{get;set;}
十进制经度{get;set;}
}
我在dll中编译接口和测试,因此它们是“禁止使用的”。这些接口只能在继承类中实现。然后,我使用将所需的依赖项注入到单元测试中。

我有一个名为的项目,其中我使用框架的部分内容创建了一个DSL,该DSL将用户情景建模为C#接口和单元测试

示例输入的一部分:

begin story "AUserStory":
begin setup 
    @Person to have a ~Spouse(@Person) 
            ~IsActive(true) 
            ~Age(0) 
            ~IsDead(false) 
            and several ~Children(@Person)
            and a ~Location(@Location)
        I want a @Person to be able to #Kill another @Person
        I want a @Person to be able to #Marry another @Person
        I want to be able to #Find all @Person
    @Location to have a ~Latitude(0.0)
            and a ~Longitude(0.0)
end setup
相应生成的C#代码:

[PluginFamily(“bdUnit”)]
公共接口IPerson
{
IPerson{get;set;}
布尔是活动的{get;set;}
int Age{get;set;}
bool IsDead{get;set;}
IList子项{get;set;}
ILocation位置{get;set;}
无效终止(IPerson用户);
void Marry(IPerson用户);
void Find();
}
[插件家庭(“bdUnit”)]
公共接口定位
{
十进制纬度{get;set;}
十进制经度{get;set;}
}

我在dll中编译接口和测试,因此它们是“禁止使用的”。这些接口只能在继承类中实现。然后,我使用将所需的依赖项注入单元测试。

嗯,它来自Java世界,但是使用Eclipse项目TMF Xtext,这样的任务将在几分钟内完成。
查看他们的主页,我提供了非常类似的示例。

嗯,它来自Java世界,但是使用Eclipse项目TMF Xtext,这样的任务将在几分钟内完成。
查看他们的主页,我提供了非常类似的示例。

谢谢链接。乍一看,它似乎比我要找的要复杂得多,但我会继续读下去。谢谢你的链接。乍一看,它似乎比我想要的要复杂得多,但我会继续读下去。事实上,MPS不是基于文本的。但它仍然是我见过的最好的DSL编程系统。事实上,MPS不是基于文本的。但它仍然是我见过的最好的DSL编程系统。