作为 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 的语法?