如何引用错误方法的基础元素

时间:2015-05-19 15:05:59

标签: xtext xtend

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

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

现在我希望错误mehtod不要引用“decCon”(eINSTANCE.declaration_decCon),而是在规则“VarContent”中使用“string”。
我该如何管理呢? 我是否必须为此实现自定义范围?

问候Krzmbrzl

1 个答案:

答案 0 :(得分:1)

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

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

你应该实现一个方法

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

向上迭代(el.eContainer()...),直到您处于声明级别以执行检查。然后,您可以将错误标记分配给所需的元素。

编辑: 因为Xtext语法描述了一个EMF元模型,所以Xtext从你的语法生成一个常规的EMF元模型,而一个工作的AST就是这个模型的一个实例。在这种情况下,例如,VarContent,Declaration,...是源自Eobject的模型类。从EMF概念来看,元模型也具有包含层次结构。方法EObject EObject.getEContainer()返回模型元素的父元素。通过一些模型知识,可以将返回的Eobject转换为具体类,然后使用它。