前几天发了一个帖子,简单地描述了一下设计一种新的语言(说语言太大了,说脚本又不太严谨)并编译运行的流程
[url]http://www.iteye.com/topic/403608[/url]
不过貌似感兴趣的人不多,可能是我表达的不是很清楚
这种方式的好处显而易见,可以让你设计的语言更贴近某一个业务领域。
缺点也显而易见,复杂度过高。
言归正传,现在已经决定用这种方式设计一种ETL领域的专用语言。
首先需要的是设计语法,先考虑数据的拷贝这样一个流程。
之前做Demo的时候,没多想,就这么写出来了
这段代码乍一看,没什么问题。但是现在要认真做了,于是仔细分析了一下这几行代码的语义。
实际上,把上面的代码翻译成自然语言,就是:
声明数据源source和target,做一个数据拷贝操作,条件是source中有某些数据的Name字段值为"LiLei"或者"HanMeiMei",字段映射关系为target.Name=source.Name ,target.Address=source.Address
这里就出现问题了。上文中,对于“数据拷贝”这个操作的描述是包含在#copy,#end中的,if表达式的含义是进行copy操作的条件,即如果某条记录满足这个条件,则拷贝这条记录,同时,字段关系映射和if语句实际上是没有关系的,所以映射不应该出现在if里面,于是可以变成
这样看很奇怪,根据上面的分析,if所表达的含义应该是copy的条件,所以if应该在copy外面。不过可以换种写法
哈哈,这样一来顺眼多了。
还有一种语法思路,即直接写
这一种表达方式更接近java一些。
可行的选择一多,就头疼了,大家有什么意见?
[url]http://www.iteye.com/topic/403608[/url]
不过貌似感兴趣的人不多,可能是我表达的不是很清楚
这种方式的好处显而易见,可以让你设计的语言更贴近某一个业务领域。
缺点也显而易见,复杂度过高。
言归正传,现在已经决定用这种方式设计一种ETL领域的专用语言。
首先需要的是设计语法,先考虑数据的拷贝这样一个流程。
之前做Demo的时候,没多想,就这么写出来了
$source:url="jdbc:hsqldb:mem:Test",table="DB1"
$target:url="jdbc:hsqldb:mem:Test",table="DB2"
#copy
if($source.Name in "LiLei","HanMeiMei"){
$target.Name=$source.Name
$target.Address=$source.Address
}
#end
这段代码乍一看,没什么问题。但是现在要认真做了,于是仔细分析了一下这几行代码的语义。
实际上,把上面的代码翻译成自然语言,就是:
声明数据源source和target,做一个数据拷贝操作,条件是source中有某些数据的Name字段值为"LiLei"或者"HanMeiMei",字段映射关系为target.Name=source.Name ,target.Address=source.Address
这里就出现问题了。上文中,对于“数据拷贝”这个操作的描述是包含在#copy,#end中的,if表达式的含义是进行copy操作的条件,即如果某条记录满足这个条件,则拷贝这条记录,同时,字段关系映射和if语句实际上是没有关系的,所以映射不应该出现在if里面,于是可以变成
#copy
$target.Name=$source.Name
$target.Address=$source.Address
if($source.Name in "LiLei","HanMeiMei"){
}
#end
这样看很奇怪,根据上面的分析,if所表达的含义应该是copy的条件,所以if应该在copy外面。不过可以换种写法
#copy
$target.Name=$source.Name
$target.Address=$source.Address
condition:$source.Name in "LiLei","HanMeiMei"
#end
哈哈,这样一来顺眼多了。
还有一种语法思路,即直接写
$source:url="jdbc:hsqldb:mem:Test",table="DB1"
$target:url="jdbc:hsqldb:mem:Test",table="DB2"
$target.Name=$source.Name
$target.Address=$source.Address
if($source.Name in "LiLei","HanMeiMei"){
#copy
}
这一种表达方式更接近java一些。
可行的选择一多,就头疼了,大家有什么意见?