Antlr忽略〜,@,#,$,%,*,(,),{,},[,]等字符

时间:2012-11-19 22:04:13

标签: antlr antlr3 antlrworks

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 + "'");};

谢谢, 阿希什

1 个答案:

答案 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将首先出现   看看它是否可以通过忽略一个令牌来解决问题,然后继续查看是否存在   可以通过添加令牌来解决问题。但是,有一些语法   可以使用任何一种方法恢复的错误 - 也许你想要   颠倒这些策略的尝试顺序?