当前位置: 首页 > 知识库问答 >
问题:

使用自定义终端规则的Xtext交叉引用

宰父夕
2023-03-14

我正在努力让交叉引用在我的DSL中工作。下面是语法的精简版本(标准示例DSL的修改版本):

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals

generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"

Releases:
    releases+=Release*
;

terminal VERSION    : ('0'..'9')+'.'('0'..'9')+('.'('0'..'9'|'x')+)?;

Release:
    'release' version = VERSION ('extends' parent = [Release|VERSION])?
    ;

因为我没有使用标准的name=ID模式,所以我跟随这篇关于如何创建自己的IQualifiedNameProvider的博客文章:

public class MyDslQNP extends DefaultDeclarativeQualifiedNameProvider {
    QualifiedName qualifiedName(Release e) {
        Package p = (Package) e.eContainer();
        return QualifiedName.create(p.getName(), e.getVersion());
    }
}

从另一个答案来看,我认为我应该实现自己的范围提供程序:

public class MyDslScopeProvider extends AbstractDeclarativeScopeProvider {
    IScope scope_Release_parent(Release release, EReference ref) {
        Releases releases = (Releases) release.eContainer();
        return Scopes.scopeFor(releases.getReleases());
    }
}

我还在运行时模块中绑定了这些:

public class MyDslRuntimeModule extends
        org.xtext.example.mydsl.AbstractMyDslRuntimeModule {
    @Override
    public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
        return MyDslQNP.class;
    }

    @Override
    public Class<? extends IScopeProvider> bindIScopeProvider() {
        return MyDslScopeProvider.class;
    }

}

运行生成的编辑器时,我创建了一个如下所示的文件:

release 1.2.3
release 1.2.2 extends 1.2.3

问题是(1)编辑器不会在扩展子句上自动完成,(2)编辑器显示错误消息无法解析对版本1.2.3的引用。

我错过了什么?

共有2个答案

解晟睿
2023-03-14

望远镜。scopeFor是一个静态方法,因此不使用已配置的IQualifiedNameProvider。您需要使用作用域显式地传递它。scopeFor(Iterable、Function、IScope)

但在您的情况下,根本不需要在作用域提供程序中进行特殊处理,因为具有限定名称提供程序的本地元素会自动放在作用域中。

萧宏远
2023-03-14

您的QualifiedNameProvider似乎创建了虚假的限定名称,例如,1.2.2版的名称将包含两个段[release][1.2.2],查找将在其中搜索[release][1][2][2]。

请尝试创建一个适当的限定名称,如:

QualifiedName qualifiedName(Release e) {
    Package p = (Package) e.eContainer();
    QualifiedName release = getConverter().toQualifiedName(e.getVersion());
    return QualifiedName.create(pack.getName()).append(releaseSuffix);        
}
 类似资料:
  • 我尝试在Xtext中定义浮点类型,但是我在生成ariti事实时收到错误消息: 我的浮动终端如下: 我的浮点是复制一个能够被Java接受的浮点:1.1、1、0.1

  • 我想调用另一个文件中声明的变量。文件的包含是使用交叉引用完成的。同时也宣告了世界的召唤。这是语法: 声明是规则。 从文档中我了解到我必须在中做些什么,但我不知道具体是什么 编辑

  • 我不明白关键字的区别("-

  • 我目前正在帮助op Xtext制作一个新的DSL。我希望能够在语法中定义规则,使用操作某些值并引用当前对象。然而,我无法获得正确的语法来让它工作。 我从Xtext表达式示例中获取了一些代码,并对其进行了修改,以便能够对卡片值进行交叉引用。我如何使用this关键字?我从其他一些SO问题中了解到,我可以使用自己的范围提供程序来实现这一点,但不知道从哪里开始。 看到一些代码: //MyDSL. xtex

  • 我试图用一个简单的例子来描述这个问题。比方说,我有一个语法,看起来像这样: 这种语言的一个简单例子是: 我有一个自定义作用域提供程序,用于的属性: 到目前为止一切都很好,我的问题是: 我也有一个格式化程序,我无法为引用的s添加规则: 如您所见,我已经为和规则以及规则设置了格式。然而,规则的格式仅应用于实例化的地方(例如:声明)。当我运行此格式器(CtrlShiftF)时,我得到以下格式: 然而,我