如何引用错误方法的底层元素
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 然后使用它。
我正在寻找一种可能性来引用错误函数中语法更深一点的元素。
我的语法片段看起来像这样:
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 然后使用它。