怎么修? Xtext语法在错误的输入上停止使用“输入处没有可行的替代方法......”进行解析

时间:2015-09-29 15:53:50

标签: antlr xtext error-recovery

作为一个Xtext和Antlr的新手,我正在努力为我想要解析的(非JVM相关)语言的一个非常简单的子集获取容错的Xtext语法。

这种迷你语言的文档可能如下所示:

$c wff |- $.
$c class $.
$c set $.

$c$.个关键字围绕的一系列语句,其中包含一个或多个可能不包含$的单词。并且所有内容都由强制空格分隔。

我能想到的最好的是以下语法:

grammar mm.ecxt.MMLanguage

import "http://www.eclipse.org/emf/2002/Ecore" as ecore

generate mmLanguage "urn:marnix:mm.exct/MMLanguage"

MMDatabase:
    WS? (statements+=statement WS)* statements+=statement WS?;

statement:
    DOLLAR_C WS (symbols+=MATHSYMBOL WS)+ DOLLAR_DOT;

terminal DOLLAR_C: '$c';
terminal DOLLAR_DOT: '$.';
terminal MATHSYMBOL: 
      ('!'..'#'|'%'..'~')+; /* everything except '$' */

terminal WS : (' '|'\t'|'\r'|'\n')+;

terminal WORD: ('!'..'~')+;

在有效输入上,这个语法工作正常。但是,对于无效输入,例如

$c class $.
$c $.
$c set $.
$c x$u $.

只有一个错误(no viable alternative at input '$.'),之后看起来只是解析停止:不再检测到错误,模型只包含错误之前的正确语句(这里只有{{1声明)。

我尝试了各种变体(使用class,有/无=>声明,启用回溯等等)但我得到的只是terminal

所以我的问题是:我应该如何编写这种语言的语法,以便Antlr进行某种形式的错误恢复?或者还有其他一些我做错了吗?

来自,例如http://zarnekow.blogspot.de/2012/11/xtext-corner-7-parser-error-recovery.html我预计这会开箱即用。或者这是因为我没有使用基于Xbase的类似Java / C的语法?

1 个答案:

答案 0 :(得分:1)

这里似乎发生的是,在您的示例输入的第2行中,根据您的语法丢失了两个令牌:解析器需要(symbols+=MATHSYMBOL WS)+但得到$.。 Antlr很乐意尝试使用不同的策略进行恢复,有些是在本地工作,有些则是在每个解析器规则的基础上工作。 Antlr不会插入两个恢复令牌来完成规则statement,但它会从那里拯救出来。在声明之后,预计会有一个强制性的WS,但它会看到$.,因此它会再次纾困。这就是为什么它似乎根本无法恢复的原因。 所有这些或多或少是一种有根据的猜测。

虽然是一个小的语法重构,但是你没有使语法像现在这样严格。一些可选的标记将帮助解析器恢复:

MMDatabase:
    WS? (statements+=statement WS?)*;

statement:
    DOLLAR_C WS (symbols+=MATHSYMBOL WS?)* DOLLAR_DOT;