我想使用Xtext实现一个特定于域的语言,而且我在保持内容清洁和可重用方面遇到了一些麻烦。请考虑以下示例:
Spec:
'spec' '(' attrs=AttrAsgnList? ')';
AttrAsgnList:
attrs+=AttrAsgn (',' attrs+=AttrAsgn)*;
AttrAsgn:
name=ID '=' value=INT;
在Xtend中使用它,现在可以访问像这样的单个属性(给定一个Spec对象):
for (a : spec.attrs.attrs) ...
如果我每次想要访问属性时都不需要经历两个级别,我会更喜欢它。防止这种情况的显而易见的方法是将整个 AttrAsgnList 规则内联到 Spec 中,以便 Spec 的 attrs 功能>成为一个清单。但是,我需要在我的DSL中使用这样的结构,并且重复复制它是不好的风格。
我基本上在寻找一种方法将单个 AttrAsgn 元素直接输入到父 attrs 功能中。这是可能的,还是我坚持要么与间接生活在一起,要么通过内联来淹没一切?
答案 0 :(得分:0)
在你的情况下应该没问题
displayBlock
并且没有没有直接的方法来阻止此副本和粘贴
唯一的机会是m2m到<style>
,但这意味着你会有两次元素,所以你不得不混淆语法和元模型http://xtextcasts.org/episodes/18-model-optimization