0

作为 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 '$.'错误class

我尝试了各种变体(使用=>、有/无terminal声明、启用回溯等等),但我得到的只是no viable alternative at input ....

所以我的问题是:我应该如何为这种语言编写语法,以便 Antlr 进行某种形式的错误恢复?还是我做错了什么?

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

4

1 回答 1

1

这里似乎发生的是,在您的示例输入的第 2 行中,根据您的语法缺少两个标记:解析器需要 a (symbols+=MATHSYMBOL WS)+but get $.。Antlr 会很高兴地尝试使用不同的策略进行恢复,一些在本地工作,另一些在每个解析器规则的基础上工作。Antlr 不会插入两个恢复令牌来完成规则statement,但它会从那里退出。在声明之后,WS预计会有强制性的,但它认为$.它会再次纾困。这就是为什么它似乎根本没有恢复。好吧,所有这些或多或少都是有根据的猜测。

不过,有帮助的是一个小的语法重构,你不会使语法像现在那样严格。一些可选标记将帮助解析器恢复:

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

statement:
    DOLLAR_C WS (symbols+=MATHSYMBOL WS?)* DOLLAR_DOT;
于 2015-09-29T19:34:36.287 回答