(Xtext) 如何通过 importURI 更改导入资源的范围?
(Xtext) How to change the scoping of imported resources via importURI?
我有一个允许显式导入资源的 DSL(通过 importURI
属性)。一切正常,除了我想直接通过 ID(而不是完全限定名称)引用导入的元素这一事实。
我没有使用 importedNamespace
,因为我已将 GlobalScope 限制为仅明确导入的内容,并且对于每个资源,我需要所有元素(如 ModelName。 *).
所以,现在我可以像这样引用导入的元素:
ModelName.OuterElement.InnerElement
但我想要这样的东西:
OuterElement 或 InnerElement.
当然,一般的上下文更复杂,也有点不同,但我试图围绕这个问题简化所有内容。所以,请参考以下语法:
Model:
name=ID ':'
(include+=Include)?
(outerElems+=OuterElement ';')*
(uses+=Use ';')*;
Include:
'import' importURI=STRING ;
OuterElement:
'def' name=ID
'(' (innerElements+=InnerElement (',' innerElements+=InnerElement)* )? ')' ;
InnerElement:
name=ID;
Element:
OuterElement | InnerElement;
Use:
'use' use =[Element|FQN];
FQN:
ID('.'ID)* ;
如果你想通过简单名称引用元素,你必须绑定
SimpleNameProvider
作为IQualifiedNameProvider
public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
return SimpleNameProvider.class;
}
分别
override bindIQualifiedNameProvider() {
SimpleNameProvider
}
我有一个允许显式导入资源的 DSL(通过 importURI
属性)。一切正常,除了我想直接通过 ID(而不是完全限定名称)引用导入的元素这一事实。
我没有使用 importedNamespace
,因为我已将 GlobalScope 限制为仅明确导入的内容,并且对于每个资源,我需要所有元素(如 ModelName。 *).
所以,现在我可以像这样引用导入的元素: ModelName.OuterElement.InnerElement 但我想要这样的东西: OuterElement 或 InnerElement.
当然,一般的上下文更复杂,也有点不同,但我试图围绕这个问题简化所有内容。所以,请参考以下语法:
Model:
name=ID ':'
(include+=Include)?
(outerElems+=OuterElement ';')*
(uses+=Use ';')*;
Include:
'import' importURI=STRING ;
OuterElement:
'def' name=ID
'(' (innerElements+=InnerElement (',' innerElements+=InnerElement)* )? ')' ;
InnerElement:
name=ID;
Element:
OuterElement | InnerElement;
Use:
'use' use =[Element|FQN];
FQN:
ID('.'ID)* ;
如果你想通过简单名称引用元素,你必须绑定
SimpleNameProvider
作为IQualifiedNameProvider
public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
return SimpleNameProvider.class;
}
分别
override bindIQualifiedNameProvider() {
SimpleNameProvider
}