当前位置: 首页 > 知识库问答 >
问题:

Xtext,多文件交叉引用

贝镜
2023-03-14

我想调用另一个文件中声明的变量。文件的包含是使用交叉引用完成的。同时也宣告了世界的召唤。这是语法:

Script:
includes+=(Include)* assignments+=(Assignment)* g=GetLog?  clock=Clock? tests+=Test*
;

Assignment:
    Config |Cosem ;

Include:
    'INCLUDE' includedScript=[Script|STRING];

Cosem:
name=ID '=' 'COSEM' '(' classid=INT ',' version=INT ','  obis=STRING ')' ;

AttributeRef:
     name=[Cosem] "." attributeRef =IDValue

;

声明是Cosem规则。

从文档中我了解到我必须在IResourceDescription中做些什么,但我不知道具体是什么

编辑

public class MyDslQNP extends DefaultDeclarativeQualifiedNameProvider {

    QualifiedName qualifiedName(Script script) {
        return QualifiedName.create(script.eResource().getURI().trimFileExtension().lastSegment(), script.eResource().getURI().fileExtension());
    }

}

共有1个答案

东方飞捷
2023-03-14

你要找的叫做"作用域"xtext.它是在YourDslScopeProvider中实现的

这可能看起来像

class MyDslScopeProvider extends AbstractMyDslScopeProvider {

    override getScope(EObject context, EReference reference) {
        if (reference === MyDslPackage.Literals.ATTRIBUTE_REF__NAME) {
            // we are scoping the AttributeRef.name cross reference
            val script = EcoreUtil2.getContainerOfType(context, Script)
            if (script !== null) {
                val allImportedCosems = script.includes.map[includedScript.assignments.filter(Cosem)].flatten
                // put the imported cosems into scope
                return Scopes.scopeFor(allImportedCosems)
            }
        }
        super.getScope(context, reference)
    }

}
 类似资料:
  • 我目前正在帮助op Xtext制作一个新的DSL。我希望能够在语法中定义规则,使用操作某些值并引用当前对象。然而,我无法获得正确的语法来让它工作。 我从Xtext表达式示例中获取了一些代码,并对其进行了修改,以便能够对卡片值进行交叉引用。我如何使用this关键字?我从其他一些SO问题中了解到,我可以使用自己的范围提供程序来实现这一点,但不知道从哪里开始。 看到一些代码: //MyDSL. xtex

  • 我正在努力让交叉引用在我的DSL中工作。下面是语法的精简版本(标准示例DSL的修改版本): 因为我没有使用标准的模式,所以我跟随这篇关于如何创建自己的的博客文章: 从另一个答案来看,我认为我应该实现自己的范围提供程序: 我还在运行时模块中绑定了这些: 运行生成的编辑器时,我创建了一个如下所示的文件: 问题是(1)编辑器不会在扩展子句上自动完成,(2)编辑器显示错误消息的引用。 我错过了什么?

  • 问题内容: 假设我有一个数据库,其中包含人员,杂货店和您可以在商店中购买的商品,如下所示: 我还有一个表格可以跟踪哪些商店销售什么: 我还有一张桌子上有购物清单 我的问题是,给定一个人或他们的ID,找出他们可以去的商店的最佳方法是什么,以便他们将所有物品都列入清单。MySQL中是否有针对这些类型的计算的模式? 我的尝试(非常丑陋和凌乱)是这样的: 谢谢你的时间! 使用数据编辑SQL 问题答案: 如

  • 问题内容: 是否有 markdown 语法等效于: 问题答案: Take me to pookie 应该是正确的markdown语法,以跳转到名为pookie的锚点。 要插入该名称的锚点,请使用HTML: Markdown似乎不介意将锚点放在哪里。标头中有用的地方。例如: 效果很好。(我在这里进行了演示,但是SO的渲染器去除了锚点。) 注意自我结束标记和对 本文的早期版本建议使用,对XHTML使用

  • 我尝试为配置文件编写Xtext BNF(已知扩展名为) 例如,我想成功地解析 我的问题是匹配属性值(在“=”右边)。 如果属性与终端匹配(例如),则我当前的语法有效。 我不知道如何概括语法以匹配任何文本(例如)。 我当然需要引入一个新的终端属性:name=ID (':' | '=') value=TEXT ';'?; 问题是:我应该如何定义这个终端? 我试过了 >

  • 在构建Spring boot项目时,我遇到了一个循环依赖(交叉引用)问题,依赖趋势如下: 处理器类通过构造函数注入自动连线条件类; 条件类通过构造函数注入自动连线CacheManager; CAHCEManager类通过setter注入自动连线RuleSet类; 规则集类通过构造函数注入再次自动连线处理器。 虽然我可以努力从RuleSet类中移除处理器的依赖关系,但我想知道是否有一种方法可以保留当