Antlr忽略字符,如~、@、#、$、%、*、(,)、{、}、[,]
Antlr以某种方式忽略输入字符串中的字符,如~、@、#、$、%、*、(,)、{、}、[,] 我使用输入字符串(如show~~~、show~@#$%等)测试了下面的语法,但是Antlr在eclipse/Antlr works解释器上转义字符。我希望这样的场景引发异常,而不是从中恢复。请一定要让我知道,如果你以前遇到过这种情况,如果是这样,你做了什么来摆脱它Antlr忽略字符,如~、@、#、$、%、*、(,)、{、}、[,],antlr,antlr3,antlrworks,Antlr,Antlr3,Antlrworks,Antlr以某种方式忽略输入字符串中的字符,如~、@、#、$、%、*、(,)、{、}、[,] 我使用输入字符串(如show~~~、show~@#$%等)测试了下面的语法,但是Antlr在eclipse/Antlr works解释器上转义字符。我希望这样的场景引发异常,而不是从中恢复。请一定要让我知道,如果你以前遇到过这种情况,如果是这样,你做了什么来摆脱它 grammar Sample; options {language = Java;} @header {package a.b.c;} @
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 + "'");};
谢谢,
Ashish看这里:
结论前的最后一段可能是您需要的:
ANTLR运行时中的其他恢复机制
您可能需要自定义恢复的另一个方面,
这就是发生失配()时发生的情况。你会看到
生成了大量调用match()方法的代码。
检查我们发现的默认实现(在Java运行时中)
match方法将调用该方法
RecoverFromMismatchdToken(),然后将尝试使用
当前跟踪集合堆栈以确定不匹配的原因是否为
输入中有一个伪标记:当我们需要时,X Y Z
只有X Z,或者缺少一个标记:X Z,当我们想要X Y Z时。如果ANTLR可以的话
使用Follow集合确定,通过跳过令牌,它将
查看有效语法,然后它将使用伪令牌,报告
额外令牌,但不会引发识别异常。同样,如果
ANTLR可以看到输入中正好缺少一个令牌
流,如果存在,将使语法有效,那么它将
制造此缺少的令牌,报告错误,但不会再次报告
引发识别异常
如果您想要与此不同的行为,则可以重写
match()方法,或者更可能是RecoverFromMissmatchedToken()方法
方法。也许您不希望出现虚假/缺失的错误检测?
或者,正如您将从默认实现中看到的,ANTLR将首先
看看它是否可以通过忽略令牌来修复问题,然后继续看看它是否可以
可以通过添加令牌来修复问题。但是,有一些语法
可以使用任何一种方法恢复的错误-也许您希望
颠倒这些策略的尝试顺序
我通过添加此代码解决了问题@lexer::members{public void recover(RecognitionException re){System.out.println(“lexer memeber recover”);throw new RuntimeException(re);}}链接已断开。请你在这篇文章中添加相关信息好吗。