如何引用错误方法的底层元素

How to refer to an underlying element for the error method

我正在寻找一种可能性来引用错误函数中语法更深一点的元素。
我的语法片段看起来像这样:

Declaration:
    name = ID "=" decCon=DecContent
;

    DecContent:
        singleContent=VarContent (op+=OPERATOR nextCon+=VarContent)*
    ;

        VarContent:
            (unOP=("+"|"-"))? num = NUMBER
            | string = STRING
            | (unOP=("+"|"-"))? reference = [Declaration]
            | arrayContent = ArrayLiteral
            | embraced = "(" embrCon=DecContent ")"
        ;

现在我希望错误方法不引用 "decCon" (eINSTANCE.declaration_decCon),而是引用规则 "VarContent".[=17 中的 "string" =] 我该如何处理?
我是否必须为此实现自定义范围?

问候 Krzmbrzl

我假设您在验证中实施了检查方法 class。好的,而不是实现一个方法

@Check
def checkDeclaration(Declaration d) {
    //...
}

你应该实现一个方法

@Check
def checkVarContent(VarContent v) {
    //...
}

向上迭代 (el.eContainer() ...) 直到在声明级别执行检查。然后你可以将错误标记分配给你想要的元素。

编辑: 因为 Xtext 语法描述了 EMF 元模型,所以 Xtext 从您的语法生成一个常规的 EMF 元模型,并且使用的 AST 是该模型的一个实例。在这种情况下,例如,VarContent、声明...是从 Eobject 派生的模型 classes。从 EMF 概念来看,元模型也有一个包含层次结构。方法 EObject EObject.getEContainer() returns 模型元素的父元素。通过一些模型知识,可以将返回的 Eobject 转换为具体的 class 然后使用它。