在范围界定时获取当前多值特征的索引
Getting an index of a current multi-valued feature while scoping
假设我希望能够声明一堆节点,可能与之前的节点有 links。然后在 link 之后声明通过这些节点的路径。我希望 DSL 看起来像这样:
node A
node B1 -> A
node B2 -> A
node C1 -> B1
node C2 -> B1
path C2 -> B1 -> A
path B2 -> A
这是我想使用的 XText 语法。请注意,我将节点 link 放置在路径的多值特征 nodes
中。
Model:(
nodes += Node
| paths += Path
)*
;
Node:
'node' name=ID ('->' from=[Node])? ;
Path:
'path' nodes+=[Node] ('->' nodes+=[Node])* ;
现在,我需要限制路径中的那些 [Node]
link,以便它们仅遵循声明的那些。我想,我必须通过范围界定来做到这一点——使用类似的东西:
override getScope(EObject ctx, EReference ref){
if(ref == MyDslPackage.Literals.PATH__NODES ){
if(ctx instanceof Path)
return Scopes::scopeFor(/* Node link, previous to the current one */);
}
return super.getScope(ctx,ref)
}
为了转到上一个 link,我需要当前索引的索引,但找不到获取它的方法。有没有办法获得这样的索引?我应该通过直接访问 ctx.nodes
来做吗? (这似乎会导致 linking-resolution-cycle-error,但是,也许,我做得很好。)
编辑。更改语法添加 {Path.parent=current}
并将其添加到作用域中就可以了:
return Scopes::scopeFor(#[ctx.parent.node.from])
与其将其解析为引用列表,不如将其解析为具有父路径的不同 Path 对象,如下所示:
Path:
'path' node=[Node] ({Path.parent=current} '->' node=[Node])* ;
这样可以更轻松地处理各个路径元素。
假设我希望能够声明一堆节点,可能与之前的节点有 links。然后在 link 之后声明通过这些节点的路径。我希望 DSL 看起来像这样:
node A
node B1 -> A
node B2 -> A
node C1 -> B1
node C2 -> B1
path C2 -> B1 -> A
path B2 -> A
这是我想使用的 XText 语法。请注意,我将节点 link 放置在路径的多值特征 nodes
中。
Model:(
nodes += Node
| paths += Path
)*
;
Node:
'node' name=ID ('->' from=[Node])? ;
Path:
'path' nodes+=[Node] ('->' nodes+=[Node])* ;
现在,我需要限制路径中的那些 [Node]
link,以便它们仅遵循声明的那些。我想,我必须通过范围界定来做到这一点——使用类似的东西:
override getScope(EObject ctx, EReference ref){
if(ref == MyDslPackage.Literals.PATH__NODES ){
if(ctx instanceof Path)
return Scopes::scopeFor(/* Node link, previous to the current one */);
}
return super.getScope(ctx,ref)
}
为了转到上一个 link,我需要当前索引的索引,但找不到获取它的方法。有没有办法获得这样的索引?我应该通过直接访问 ctx.nodes
来做吗? (这似乎会导致 linking-resolution-cycle-error,但是,也许,我做得很好。)
编辑。更改语法添加 {Path.parent=current}
并将其添加到作用域中就可以了:
return Scopes::scopeFor(#[ctx.parent.node.from])
与其将其解析为引用列表,不如将其解析为具有父路径的不同 Path 对象,如下所示:
Path:
'path' node=[Node] ({Path.parent=current} '->' node=[Node])* ;
这样可以更轻松地处理各个路径元素。