2

Antlr 以某种方式忽略了输入字符串中的字符,例如 ~,@,#,$,%,*,(,),{,},[,]。

我使用输入字符串(例如 show~~~、show ~@#$% 等)测试了以下语法,但 Antlr 转义了 eclipse/antlr 工作解释器上的字符。我希望这样的场景抛出异常而不是从中恢复。请让我知道您是否曾经遇到过这种情况,如果遇到过,您做了什么来摆脱它。

grammar Sample; 
options {language = Java;} @header {package a.b.c;} @lexer::header {package a.b.c;} 
prog: stat+ ; stat: expr ; expr: paramValueChildStructure ; 
paramValueChildStructure: ALPHANUMERIC;
ALPHANUMERIC: ('a'..'z' |'A'..'Z' | '0'..'9')+ ;

我尝试使用以下选项来摆脱上述问题,但这在我生成的 lexer.java 中给出了无法访问的代码编译时间问题

OTHER      : . {throw new RuntimeException("unknown char: '" + $text + "'");};

谢谢,阿希什

4

1 回答 1

1

看这里:http ://www.antlr3.org/wiki/display/ANTLR3/Custom+Syntax+Error+Recovery

结论前的最后一段可能是您需要的:

ANTLR 运行时中的其他恢复机制

您可能需要自定义恢复的另一个方面,这就是发生 mismatch() 时发生的情况。您将在生成的代码中看到对 match() 方法的大量调用。检查默认实现(在 Java 运行时),我们发现 match 方法将调用方法 recoverFromMismatchedToken() ,这反过来会尝试使用当前的 Follow 集合堆栈来确定我们不匹配的原因是否是存在虚假令牌在输入中:当我们只想要 XZ 时为 XYZ,或者当我们想要 XY Z 时缺少令牌:XZ虚假令牌,报告额外的令牌,但不会引发 RecognitionException。相似地,

如果您想要与此不同的行为,则可以覆盖 match() 方法,或者更有可能覆盖 recoverFromMismatchedToken() 方法。也许您不想要虚假/缺失错误检测?或者,正如您将在默认实现中看到的那样,ANTLR 将首先查看它是否可以通过忽略令牌来修复问题,然后继续查看它是否可以通过添加令牌来修复问题。但是,使用这两种方法都可以恢复一些语法错误——也许您想颠倒这些策略的尝试顺序?

于 2013-03-27T16:30:13.410 回答