Error handling Xtext:按无序组自定义错误消息

Error handling Xtext:按无序组自定义错误消息,error-handling,message,xtext,unordered,Error Handling,Message,Xtext,Unordered,我定义了一个无序的组,它的工作原理与我预期的一样。我唯一想更改的是错误msg,它出现在无序组的一个元素尚未建模时。有没有简单的方法来解决这个问题?我已经尝试过定制检查,但在那里我得到了一个意想不到的行为 遵循无序组的规则和错误消息: Element: (name=ConfigurationName) & (description=Description)? & (tool=Tool) & (model=Model) & (i

我定义了一个无序的组,它的工作原理与我预期的一样。我唯一想更改的是错误msg,它出现在无序组的一个元素尚未建模时。有没有简单的方法来解决这个问题?我已经尝试过定制检查,但在那里我得到了一个意想不到的行为

遵循无序组的规则和错误消息:

Element:
    (name=ConfigurationName) &
    (description=Description)? &
    (tool=Tool) &
    (model=Model) &
    (interfaces=Interfaces)? &
    (paramaters=Parameters)? &
    (paramfile=ParamFile)?
;

rule ruleElement failed predicate: {getUnorderedGroupHelper().canLeave(grammarAccess.getElementAccess().getUnorderedGroup())}?

我想将此错误消息更改为类似的内容:“配置中需要以下元素:…..”

Xtext有一个名为SyntaxErrorMessageProvider的服务,用于重写解析器错误消息。您必须在解析器级别上定义消息(因此将不会使用EMF模型),但是可以获取原始错误消息和上下文,遍历它并提供您自己的错误消息

要注册它,请打开
«YourLanguage»RuntimeModule
类,并添加以下方法:

public Class<? extends ISyntaxErrorMessageProvider> bindISyntaxErrorMessageProvider() {
    return «YourLanguage»SyntaxErrorMessageProvider.class;
}

public类I工作自动验证自定义,I创建
公共类MyDSLanguageSyntaxErrorMessageProvider扩展了SyntaxErrorMessageProvider{
}

我在MyDslRuntimeModule中注册它: 公共类bindISyntaxErrorMessageProvider(){ 返回MyDSLanguageSyntaxErrorMessageProvider.class;}


但我的问题是,此自定义使用的是哪个包。我使用org.xtext.example.mydsl.validation包创建java类。我还使用xtend类进行此自定义。我在internet上找不到足够的源:(

您可以使用Java编写这个自定义SyntaxErrorMessageProvider类,但要绑定它,您可以在运行时模块类中绑定。您也可以使用任何包来声明这个类,但在您拥有运行时类的同一个包中声明这个类到目前为止是有意义的

Thx,但我不知道如何传递新的错误消息:/There is没有关于如何访问此解析器消息的文档。更改语法可能更容易。确实没有可用的文档。但是,请查找语法元素。我以前创建的示例(如果有帮助):好的,非常感谢。你为什么要使用MissmatchedTokenException?这里是关于不同异常的概述吗?我想,对于我的情况,它不起作用?我不确定你在示例中做了什么。我必须使用IParserErrorContext来修改错误消息吗?MissmatchedTokenException代表了一种情况,当在分析流中发现一个不正确的令牌。异常包含预期的和找到的令牌。在我们的示例中,有时使用常量文本而不是标识符,这会得到一些低级的、不可解析的错误消息。我只是确定了我们要覆盖消息并返回它的简单示例。但是没有可用的概述文档,您需要从代码中推断什么样的异常类型代表您的问题(例如,在一个小示例中由调试器)。