【问题标题】:How to implement imports within an xtext grammar如何在 xtext 语法中实现导入
【发布时间】:2018-06-14 15:57:48
【问题描述】:

我希望能够创建包含块的库,将库导入到单独的文件中,然后在 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

【问题讨论】:

    标签: java eclipse import dsl xtext


    【解决方案1】:

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

    Import:
         'import' importedNamespace=QualifiedNameWithWildcard
    ;
    

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

    确保项目具有 Xtext Builder 并且 Xtext Nature 和 Build Automatically 已启用,并且您进行了干净的构建。

    【讨论】:

    • 好的,我进行了更改,但导入仍未解决。还有其他想法吗?
    • 对我来说效果很好。你确定你已经自动构建了吗?
    • 是的,我已经自动构建,运行工作流,生成工件,然后将 mydsl 项目作为 Eclipse 应用程序运行。我可以在同一个文件中使用在库中创建的块,但我不能将这些块导入另一个文件
    • 或者我除了语法还有什么需要看的吗?
    • 不,您能否将语法更新到您现在拥有的状态。并确保不要忘记重新生成并重新启动运行时 eclipse
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2018-09-16
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多