gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:20:33 25 4
gpt4 key购买 nike

我正在尝试让交叉引用在我的 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 模式,所以我遵循了 this blog post关于如何创建我自己的 IQualifiedNameProvider:

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

从关于 SO 的另一个答案中,我了解到我应该实现自己的范围提供程序:

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

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

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) 编辑器不会自动完成 'extends' 子句,并且 (2) 编辑器显示错误消息 Couldn't resolve reference to Release '1.2.3'.

我错过了什么?

最佳答案

您的 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 交叉引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10316112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com