我正在寻找一种可能性来引用错误函数中语法更深一点的元素。
我的语法片段看起来像这样:
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
答案 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转换为具体类,然后使用它。