Antlr以某种方式忽略输入字符串中的〜,@,#,$,%,*,(,),{,},[,]等字符。
我用输入字符串测试了下面的语法,例如show ~~~,show~ @#$%等,但是Antlr在eclipse / antlr works解释器中转义了字符。我希望这样的场景抛出异常而不是从它们中恢复。如果你以前遇到过这种情况,请告诉我,如果是这样,你做了什么来摆脱它。
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 + "'");};
谢谢, 阿希什
答案 0 :(得分:1)
请看这里:http://www.antlr3.org/wiki/display/ANTLR3/Custom+Syntax+Error+Recovery
结论之前的最后一段可能就是你所需要的:
ANTLR运行时内的其他恢复机制
您可能需要自定义恢复的另一个方面, 这就是发生不匹配()时会发生的情况。你会看到的 生成的代码,有很多调用match()方法。 检查我们发现的默认实现(在Java运行时) match方法将调用该方法 recoverFromMismatchedToken()反过来会尝试使用 current跟随set stack确定我们不匹配的原因是什么 输入中有一个虚假的标记:X Y Z我们想要的时候 只是X Z,或者一个丢失的标记:X Z当我们想要X Y Z.如果ANTLR可以 使用Follow集确定,通过跳过令牌,它会 看到有效的语法,然后它将使用虚假令牌,报告 额外的令牌,但不会引发RecognitionException。同样,如果 ANTLR可以看到输入中只有一个令牌丢失 流,如果存在,将使语法有效,然后它将 制造这个丢失的令牌,报告错误,但再次不会 提出RecognitionException。
如果您想要与此不同的行为,那么您可以覆盖 match()方法,或者更有可能是recoverFromMismatchedToken() 方法。也许您不希望虚假/丢失错误检测? 或者,正如您将从默认实现中看到的那样,ANTLR将首先出现 看看它是否可以通过忽略一个令牌来解决问题,然后继续查看是否存在 可以通过添加令牌来解决问题。但是,有一些语法 可以使用任何一种方法恢复的错误 - 也许你想要 颠倒这些策略的尝试顺序?