在范围界定时获取当前多值特征的索引

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])* ;

这样可以更轻松地处理各个路径元素。