我正在努力让交叉引用在我的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
的引用。
我错过了什么?
望远镜。scopeFor是一个静态方法,因此不使用已配置的IQualifiedNameProvider。您需要使用作用域显式地传递它。scopeFor(Iterable、Function、IScope)
但在您的情况下,根本不需要在作用域提供程序中进行特殊处理,因为具有限定名称提供程序的本地元素会自动放在作用域中。
您的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)时,我得到以下格式: 然而,我