如何在xtext语法中实现导入

时间:2018-06-14 15:57:49

标签: java eclipse import dsl xtext

我希望能够创建包含块的库,将库导入单独的文件,然后在blockUse语句中使用库中的块。

我创建了以下语法:

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals

generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"

Program:
    (imports+=Import)*
    (libraries+=Library)*
    (customBlocks+= Block)*
    (blockUses+= BlockUse)*
;

Import:
    'import' importedNamespace=QualifiedNameWithWildcard
;

QualifiedNameWithWildcard:
    QualifiedName '.*'?
;

QualifiedName:
    ID ('.' ID)*
;

Library:
    'Library' name=QualifiedName
        (blocks+=Block)+
    'EndLibrary'
;

Block:
    'block' name=ID
;

BlockUse:
    'show' block=[Block|QualifiedName]
;

我的最终目标是我可以创建两个文件,一个使用库,另一个使用该库中的块,如下所示:

文件1:

Library lib1
    block block1
    block block2
EndLibrary

文件2:

import lib1.*
show block1

我认为我的大部分困惑来自importedNamespace背后的含义并使用cross references

这些是我已经尝试过的一些例子:

http://www.eclipse.org/Xtext/documentation/102_domainmodelwalkthrough.html#add-imports http://blog2.vorburger.ch/2013/05/xtext-dsl-with-epackage-namespace.html https://blogs.itemis.com/en/in-five-minutes-to-transitive-imports-within-a-dsl-with-xtext

1 个答案:

答案 0 :(得分:0)

导入的命名空间不应该是引用。因此你要么改变这个

Import:
     'import' importedNamespace=QualifiedNameWithWildcard
;

或者您需要调整命名空间解析器的计算,例如在org.eclipse.xtext.scoping.impl.ImportedNamespaceAwareLocalScopeProvider.getImportedNamespace(EObject)中,使用nodemodel检索那里的导入文本。

确保项目具有Xtext Builder和Xtext自然并且自动构建已启用,并且您执行了干净的构建。

enter image description here