dsl - Xtext如何通过实例通过限定名称引用变量?

标签 dsl instance-variables xtext xtend

我在构建 dsl 时遇到了这个概念的问题。我不确定这是否是我遗漏的一个简单的东西,或者不是 xtext 的预期功能。希望有人可以在这个例子的上下文中向我解释它。

给出以下最小语法:

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)*
;

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

ns com.mine
class Class1 {
    var var1
}
instance1 = new Class1
instance1.var1 // <- error here, can't resolve reference

使用此语法和默认范围,只有这个有效:

ns com.mine
class Class1 {
    var var1
}
instance1 = new Class1
Class1.var1

所以我的问题是:我将如何实现通过实例变量按限定名称引用变量的概念?

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

我当然可以创建一个规则,它使用两个引用(这就是我当前正在做的事情),一个引用到实例变量,然后遍历实例变量的类型以获取变量引用范围内的变量,但这看起来像对嵌套对象的情况进行了修改,但不具有可扩展性。

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

最佳答案

这是范围提供者的示例

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)
   }
}

关于dsl - Xtext如何通过实例通过限定名称引用变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53163003/

相关文章:

Scala DSL : How to add words that do "nothing"?

visual-studio - 使用Microsoft Visual Studio开发文本特定领域语言(DSL)

javascript - 在大多数 OOP 语言中,实例方法中的 "i"是否首先引用本地,然后引用全局,但从不引用实例变量或类变量?

python - 一个实例属性引用另一个实例属性,并在类实例化后进行更新

objective-c - @interface 中的实例变量; header 与实现

eclipse - XText 没有提供哪些 ANTLR 功能?

java - grails 中的 log4j : how to log into file?

java - Xtext 2.9 范围提供者

parsing - Xtext和ANTLR之间有什么关系?

java - 从另一个 Eclipse View 监听 XText 编辑器中的 EObject 更改