Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Antlr忽略字符,如~、@、#、$、%、*、(,)、{、}、[,]_Antlr_Antlr3_Antlrworks - Fatal编程技术网

Antlr忽略字符,如~、@、#、$、%、*、(,)、{、}、[,]

Antlr忽略字符,如~、@、#、$、%、*、(,)、{、}、[,],antlr,antlr3,antlrworks,Antlr,Antlr3,Antlrworks,Antlr以某种方式忽略输入字符串中的字符,如~、@、#、$、%、*、(,)、{、}、[,] 我使用输入字符串(如show~~~、show~@#$%等)测试了下面的语法,但是Antlr在eclipse/Antlr works解释器上转义字符。我希望这样的场景引发异常,而不是从中恢复。请一定要让我知道,如果你以前遇到过这种情况,如果是这样,你做了什么来摆脱它 grammar Sample; options {language = Java;} @header {package a.b.c;} @

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 + "'");};
谢谢, 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);}}链接已断开。请你在这篇文章中添加相关信息好吗。