首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Xtext如何通过实例通过限定名引用变量?

Xtext如何通过实例通过限定名引用变量?
EN

Stack Overflow用户
提问于 2018-11-05 22:14:17
回答 1查看 1.1K关注 0票数 2

我在构建dsl时遇到了这个概念上的问题。我不确定这是我遗漏的一个简单的东西,还是不是xtext预期的特性。希望有人能在这个例子中向我解释。

给定以下最小语法:

代码语言:javascript
运行
复制
Model:
    'ns' name=QualifiedName
    classes+=Class*
    instances+=Instance*
    uses+=Use*
;

Class:
    'class' name=ID '{'
        variables+=Variable*
    '}'
;

Variable:
    'var' variable=PrimaryVariable
;

Instance:
    variable=PrimaryVariable '=' 'new' type=[Class]
;

Use:
    reference=[PrimaryVariable|QualifiedName]
;

PrimaryVariable:
    name=ID
;

QualifiedName:
    ID ('.' ID)*
;

我希望能够编写以下代码,这当然是无效的:

代码语言:javascript
运行
复制
ns com.mine
class Class1 {
    var var1
}
instance1 = new Class1
instance1.var1 // <- error here, can't resolve reference

有了这种语法和默认范围,只有这样才能工作:

代码语言:javascript
运行
复制
ns com.mine
class Class1 {
    var var1
}
instance1 = new Class1
Class1.var1

因此,我的问题是:如何通过实例变量实现通过限定名引用变量的概念?

我认为我无法管理qualifiedNameProvider来实现这一点,因为PrimaryVariable不知道在哪个实例中使用它。

当然,我可以创建一个规则,它使用两个引用(这就是我目前正在做的),一个指向实例变量,然后遍历实例变量的类型来获取变量引用的作用域中的变量,但这似乎是对它的方式的一种黑客攻击,而在嵌套对象的情况下则不是可伸缩的。

这是一个稍微宽泛的问题,我希望在我开始做一些完全适得其反的事情之前,我能得到一些信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-06 13:06:57

下面是范围提供程序的示例

代码语言:javascript
运行
复制
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EReference
import org.eclipse.xtext.EcoreUtil2
import org.eclipse.xtext.naming.QualifiedName
import org.eclipse.xtext.resource.EObjectDescription
import org.eclipse.xtext.scoping.IScope
import org.eclipse.xtext.scoping.impl.SimpleScope
import org.xtext.example.mydsl6.myDsl.Model
import org.xtext.example.mydsl6.myDsl.MyDslPackage

class MyDslScopeProvider extends AbstractMyDslScopeProvider {

   override getScope(EObject context, EReference reference) {
      if (reference === MyDslPackage.Literals.USE__REFERENCE) {
         val model = EcoreUtil2.getContainerOfType(context, Model)
         if (model !== null) {
            val result = newArrayList
            for (i : model.instances) {
               result.add( EObjectDescription.create(
                  QualifiedName.create( i.variable.name ), i.variable ))
               for (v : i.type.variables) {
                  result.add( EObjectDescription.create(
                     QualifiedName.create( i.variable.name, v.variable.name ),
                     v.variable ))
               }
            }
            println(result)
            return new SimpleScope(IScope.NULLSCOPE, result)
         }
      }
      super.getScope(context, reference)
   }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53163003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档