引用父级中的属性

  • 本文关键字:属性 引用 textx
  • 更新时间 :
  • 英文 :


我正在尝试编写一个小型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中实现作用域提供程序来完全控制。

最新更新