微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xtext中“无法解析引用”的不同情况,特别解决,但是属性引用呢?

如何解决Xtext中“无法解析引用”的不同情况,特别解决,但是属性引用呢?

我有以下 Xtext 语法部分:

AssignmentStatement: (variable=[SymbolicVariable] | array=ArrayVariable) ':=' value=Expression;
ArrayVariable: varName=[SymbolicVariable] '[' index=Expression ']';
SymbolicVariable: name=ID;

一个测试,其中 id1 和 id2 是 SymbolicVariable,而且 SymbolicVariable 可以是 Expression 的一部分:

id1 := 0 < id2 [ 0 ]

在测试中,id1 和 id2 之前没有定义,因为我是通过语法生成输入作为测试并且不关心语义。我想为它们动态创建对象以摆脱:

错误:无法解析对 SymbolicVariable 'id1' 的引用。

错误:无法解析对 SymbolicVariable 'id2' 的引用。

同时验证。

根据帖子 XText cross-reference to an non-DSL resource 中的想法,我能够创建 ScopeProvider impl 和 Scope impl:

class MyScope extends AbstractPoSTScopeProvider {
    
    override getScope(EObject context,EReference reference) {
        val res = context.eResource
        var uri = res.URI       
        val rs = res.resourceSet
        val scope = super.getScope(context,reference)
        if (context instanceof ArrayVariableImpl) new ScopeWrapper(scope,res) else scope
    }
}

class ScopeWrapper implements IScope {
    
    IScope scope;
    Resource resource;
    
    protected new(IScope w,Resource res) {
        scope = w
        resource = res
    }
    override getSingleElement(Qualifiedname name) {
        println("[scope]getSingleElement " + name.toString())
        val r = scope.getSingleElement(name)
        if (r === null) {
            val fac = PoSTPackage.eINSTANCE.getPoSTFactory()
            var s = fac.createSymbolicVariable()
            s.name = name.toString()
            println("[!!!!! ] creation")
            Main.isChanged = true //to rerun in cause of modification 
            val ret = new MyDescr(s,name) //just a wrap
            resource.contents += s
            ret
        } else
        r
    }
    
}

这次注入后,出现了id2,我可以用它生成一个代码,但我仍然得到

错误:无法解析对 SymbolicVariable 'id1' 的引用。

并且我在调试期间没有在任何地方看到 id1。

似乎,对于属性,我们需要一些其他魔法。 我应该遵循哪种模式?

解决方法

在测试中,id1 和 id2 之前没有定义,因为我是通过语法生成输入作为测试并且不关心语义。

如果您正在生成文本模型 id1 := 0 < id2 [ 0 ],我不确定为什么您不能将其生成为 id1; id2; id1 := 0 < id2 [ 0 ],这可能会解决问题。

如果您真的想“动态创建 id1 和 id2”,我认为您需要自定义 IScopeProvider 实现,以便在计算引用 AssignmentStatement.variableArrayVariable.varName 的范围时,如果父实现返回一个空作用域,那么您只需在内存中创建一个 SymbolicVariable 并在返回的作用域中提供它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?