【问题标题】:Cross reference to multiple names in the same grammar rule在同一语法规则中交叉引用多个名称
【发布时间】:2015-06-24 17:10:21
【问题描述】:

在我的 DSL 中,我有两个不同的规则可用于定义实体:

第一种方式是通过一个预设的单词后跟实体的名称:

Actor Bob

Actor Alice

第二种方法是在两个实体之间创建关系:

Bob -> Alice

这和写作是一样的

Actor Bob -> Actor Alice

现在我有一个关于这些实体的交叉引用的问题。创建对 Actor 的交叉引用很容易,因为我只是引用了规则

Actor: 
'Actor' name = ID

但是当我在同一规则中有两个 ID 时会发生什么?我将如何进行交叉引用

Arrow:
'Actor'? name+=ID '->' 'Actor'? name+=ID

既然同一条规则中有多个名称?

谢谢!

【问题讨论】:

    标签: eclipse-plugin grammar xtext


    【解决方案1】:

    要更改元素的索引方式,您必须调整 org.eclipse.xtext.resource.impl.DefaultResourceDescriptionStrategy.createEObjectDescriptions(EObject, IAcceptor<IEObjectDescription>) 并将所有名称下的元素添加到索引中。

    如果您也想为本地定义执行此操作,则必须进行调整 org.eclipse.xtext.scoping.impl.ImportedNamespaceAwareLocalScopeProvider.internalGetAllDescriptions(Resource)

    【讨论】:

    • 您介意提供一些最小的示例吗?我是 Xtext 的新手,我在理解你的意思是我应该适应这些方法时遇到了一些困难。为什么要更改元素的索引方式?
    • 我不知道演员是如何从参考的角度定义的(相同的文件或其他文件),或者您是否手动将可见演员的列表放在一起)。如果不是来自同一个文件,它们来自 xtext 索引。因此您必须调整索引。如果它们来自同一个文件,但您不手动收集它们,则必须调整 ImportedNamespaceAwareLocalScopeProvider。如果您手动收集它们,您可以简单地调整范围方法。
    • 所以我仍然不确定如何在我的情况下覆盖应用方法。我检查了if (from instanceof Arrow),因为我的名字在箭头规则中。我投了(Arrow) from,然后在for循环中调用l.getNames()来添加限定名。我收到两个错误:The method transform(Iterable<F>, Function<? super F,? extends T>) in the type Iterables is not applicable for the arguments (Iterable<EObject>, new Function<EObject,List<IEObjectDescription>>(){})The method create(String, EObject) in the type EObjectDescription is not applicable for the arguments (QualifiedName, EObject)
    • 这是我的语法,有点小化了:pastebin.com/uDwZBtCG 这就是我想要做的:可能非常不正确)pastebin.com/ksKHJ28i
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多