我正在尝试编写一个小型DSL,用于将类从一个域转换到另一个域,其中类和属性基本相同,但有些属性名称可能不同。例如,属性的含义是颠倒的。
类似这样的东西:
class foo {
boolean x_is_true
}
class bar {
boolean x_is_false
}
translate foo to bar { // foo is src and bar is dest
dest.x_is_false = not(src.x_is_true)
}
到目前为止,我有一个语法是这样的:
Model:
classes*=Class
translations*=Translation
;
Class:
'class' name=ID '{'
parameters+=Parameter
'}'
;
Parameter:
type=Type name=ID
;
Type:
'boolean'
;
Translation:
'translate' source=[Class] 'to' dest=[Class] '{'
mappings+=Mapping
'}'
;
Mapping:
src=[Parameter|FQN|^classes*.parameters]
;
Comment: ///.*$/;
FQN: ID('.'ID)*;
如果我这样写翻译,只是为了获得参考:,这将起作用
translate foo to bar {
bar.x_is_false
}
我可以写一个RREL,这样它就可以在不重复foo/bar的情况下匹配父作用域中的引用吗?在实际使用中,foo/bar将是更长的字符串。
这样做的一种方法是:
Mapping:
dest=Destination '=' src=Source
;
Destination:
'dest.' dest=[Parameter|FQN|...~dest.parameters]
;
Source:
'src.' src=[Parameter|FQN|...~source.parameters]
;
并且匹配的CCD_ 1部分将是:
translate foo to bar { // foo is src and bar is dest
dest.x_is_false = src.x_is_true
}
因此,在这里使用src
引用源类,使用dest
引用目标类,就像您的示例中一样。
当然,对于翻译中的RHS,你需要一种完整的表达语言,但这应该会让你朝着正确的方向前进。
如果您需要更复杂的作用域逻辑,您可以通过在Python中实现作用域提供程序来完全控制。