父级中的引用属性
Reference attribute in parent
我正在尝试编写一个小型 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]
;
和匹配的 translate
部分将是:
translate foo to bar { // foo is src and bar is dest
dest.x_is_false = src.x_is_true
}
因此,您在这里使用 src
来引用源 class 并使用 dest
来引用目标 class,就像您的示例中一样。
当然,对于翻译中的 RHS,您需要一种完整的表达语言,但这应该能让您朝着正确的方向前进。
如果您需要更复杂的范围逻辑,您始终可以通过在 Python 中实施 scoping provider 来完全控制。
我正在尝试编写一个小型 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]
;
和匹配的 translate
部分将是:
translate foo to bar { // foo is src and bar is dest
dest.x_is_false = src.x_is_true
}
因此,您在这里使用 src
来引用源 class 并使用 dest
来引用目标 class,就像您的示例中一样。
当然,对于翻译中的 RHS,您需要一种完整的表达语言,但这应该能让您朝着正确的方向前进。
如果您需要更复杂的范围逻辑,您始终可以通过在 Python 中实施 scoping provider 来完全控制。