我有一个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)* ;
答案 0 :(得分:0)
如果要通过简单名称引用元素,则必须绑定
SimpleNameProvider
为IQualifiedNameProvider
public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
return SimpleNameProvider.class;
}
分别
override bindIQualifiedNameProvider() {
SimpleNameProvider
}