父级中的引用属性

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 来完全控制。