Xtext 添加元素到父特性

Xtext add elements to parent feature

我想使用 Xtext 实现领域特定语言,但在保持内容清洁和可重用方面遇到了一些麻烦。考虑以下示例:

Spec:
    'spec' '(' attrs=AttrAsgnList? ')';
AttrAsgnList:
    attrs+=AttrAsgn (',' attrs+=AttrAsgn)*;
AttrAsgn:
    name=ID '=' value=INT;

在 Xtend 中使用它,现在可以像这样访问单个属性(给定一个 Spec 对象):

for (a : spec.attrs.attrs) ...

如果我每次想访问属性时不必经过两个级别,我会更喜欢它。防止这种情况的明显方法是将整个 AttrAsgnList 规则内联到 Spec,以便 attrs Spec 的特征变成了一个列表。但是,我需要在我的 DSL 中大量使用这样的结构,我认为一遍又一遍地复制它是一种糟糕的风格。

我基本上是在寻找一种直接将单个 AttrAsgn 元素提供给父 attrs 特征的方法。这可能吗,或者我是否坚持使用间接寻址或通过内联使所有内容膨胀?

你的情况应该没问题

Spec:
'spec' '(' (attrs+=AttrAsgn (',' attrs+=AttrAsgn)*)? ')';

并且没有直接的方法来防止这种复制和粘贴

唯一的机会是通过 IDerivedStateComputer 的 m2m,但这意味着您将有两次元素,因此无论如何您都必须弄乱语法和元模型 http://xtextcasts.org/episodes/18-model-optimization