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
我想使用 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