XDSL:通用的领域特定语言设计

Nop平台提供了面向语言编程的编程范式,即我们解决问题时总是倾向于先设计一个领域特定语言(DSL),然后再利用该DSL来具体描述业务逻辑。Nop平台中极大简化了创建自定义DSL的过程。

一. 采用XML或者JSON语法

领域特定语言的价值在于它精炼了领域内特有的逻辑关系,定义了专属于该领域的原子语义概念,至于具体语法形式,并不是关键。程序代码经过Lexer和Parser解析后会得到抽象语法树(AST),所有的程序语义原则上都是由AST来承载。XML和JSON都是树形结构,可以直接表达AST,从而完全避免编写特殊的Lexer和Parser。

我们使用XDef元模型定义语言来约束DSL的语法结构,例如 beans.xdef。相比于XML Schema或者JSON Schema,XDef定义更加简单直观,而且可以表达更复杂的约束条件。

XDef不仅仅定义了XML格式的DSL语法,它还规定了一种XML和JSON之间的双向转换规则。因此,只要定义了XDef元模型,就可以自动得到JSON表示,可以直接用于前台可视化编辑器的输入输出。

在没有定义XDef元模型的情况下,Nop平台也定义了一种紧凑的约定转换规则,可以实现无Schema约束情况下XML和JSON的双向转换。具体参见前端AMIS页面的XML表示:

二. XDSL通用语法

将所有的DSL都归一化为XML格式之后,就可以统一提供模块分解、差量合并、元编程等高级机制了。Nop平台定义了统一的XDSL扩展语法,自动为所有通过XDef元模型定义的DSL语言增加可逆计算扩展语法,具体XDSL语法的内容由xdsl.xdef这一元模型来定义。

XDSL的主要语法元素示例如下:

<orm x:schema="/nop/schema/orm/orm.xdef"
x:extends="base.orm.xml" x:dump="true"
xmlns:x="/nop/schema/xdsl.xdef" xmlns:xpl="/nop/schema/xpl.xdef">
<x:gen-extends>
<pdman:GenOrm src="test.pdma.json" xpl:lib="/nop/orm/xlib/pdman.xlib"
versionCol="REVISION"
createrCol="CREATED_BY" createTimeCol="CREATED_TIME"
updaterCol="UPDATED_BY" updateTimeCol="UPDATED_TIME"
tenantCol="TENANT_ID"
/>
</x:gen-extends>

<x:post-extends>
<orm-gen:JsonComponentSupport xpl:lib="/nop/orm/xlib/orm-gen.xlib"/>
</x:post-extends>

<entities>
<entity name="io.nop.app.SimsClassFee" x:override="remove"/>
</entities>
</orm>

<< · Back Index ·>>

发表回复

相关推荐

妄图复出的张哲瀚上演疯批大戏,还想拉龚俊下水?

大家好。 好久没和大家聊聊明星了, 这几天有个艺人让我很上头, 那就是告别娱乐圈接近300天, 如今装疯卖傻的劣迹艺人 ...

· 53秒前

芍药是什么?带你走进芍药的前世今生!

嗨,花痴!欢迎来到花派千卉谷! “芍药,犹绰约也,美好貌。此草花容绰约,故以为名。” ——《本草纲目》 花派,绽放生活美 ...

· 3分钟前

芯片的分类

一、从芯片种类划分 (1)计算芯片(大脑):如CPU,GPU,FPGA,MCU,AI等都用作计算分析的,和人体大脑类似。 (2)存储芯 ...

· 10分钟前

增值税税负率如何计算,并附全套税负率预警表格,还不快收藏码住

身为会计,我们都知道增值税的税负率=当期应纳增值税/当期应税销售收入*100%!有很多会计都对企业税负率有疑问,也会问:我 ...

· 40分钟前

麦克斯韦速度分布律

速度空间和速度分布函数 在经典物理学中速度的取值看作连续,可以引入速度空间的概念来描述分子的速度。 简单来说,速度空间 ...

· 45分钟前