내 DSL에서 상호 참조를 얻으려고합니다. 다음은 문법의 버전을 박탈 (표준 예를 들어, DSL의 수정 된 버전)입니다 : 나는 표준 name = ID
패턴을 사용하지 않는 때문에사용자 지정 터미널 규칙을 사용하는 Xtext 상호 참조
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])?
;
, 내가 만드는 방법에 대한 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());
}
}
, 나는 내 자신의 범위 제공자 구현해야한다는 수집 :
public class MyDslScopeProvider extends AbstractDeclarativeScopeProvider {
IScope scope_Release_parent(Release release, EReference ref) {
Releases releases = (Releases) release.eContainer();
return Scopes.scopeFor(releases.getReleases());
}
}
를 I했습니다 생성 된 편집기를 실행하는 경우 I는 다음과 같습니다 파일을 생성
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;
}
}
: LSO는 런타임 모듈이 바인딩
release 1.2.3
release 1.2.2 extends 1.2.3
문제는 (1) 에디터가 자동으로 완성되지 것입니다 (2) 편집기가 오류 메시지 Couldn't resolve reference to Release '1.2.3'
을 표시합니다.
무엇이 누락 되었습니까?
좋아, 그래서 범위 제공자를 제거하면 자동 완성 작품을 만들지 만, 여전히 참조를 해결하기 위해 실패합니다. – JesperE