2012-11-19 45 views
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 + "'");}; 

感谢, 阿希什

+1

我决定添加此代码的问题。 @lexer :: members { \t \t public void recover(RecognitionException re){ \t \t \t \t System.out。println(“lexer memeber recover”); \t \t \t \t throw new RuntimeException(re); \t \t} } – user1836974

回答

1

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

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

其他恢复机制内ANTLR运行时

没有恢复,您可能需要定制, 的一个其它方面,那就是当不匹配()时会发生什么。您将在 生成的代码中看到有很多调用match()方法。 检查的默认实现(在Java运行时),我们发现 的比赛方法调用的方法 recoverFromMismatchedToken(),这反过来会尝试使用 当前按照设置堆栈来确定,如果我们不匹配的原因是 是有一个在输入一个虚假令牌:XYZ当我们想 只是XZ或者丢失的令牌:XZ当我们想XY Z.如果ANTLR可以 确定,使用跟踪组,通过跳过一个道理,它会 看有效的语法,那么它将消耗虚假标记,报告额外的标记,但不会引发RecognitionException。同样,如果 ANTLR可以看到输入的 流中只有一个令牌丢失,如果存在,会使语法有效,那么它会制造这个缺少的令牌,报告错误,但不会再提起 RecognitionException。

如果您想要与此不同的行为,那么您可以覆盖match()方法的 方法,或者更可能的方式为recoverFromMismatchedToken() 方法。也许你不想要虚假/缺少错误检测? 或者,你会从默认的实现看,ANTLR将首先 看它是否可以忽略令牌解决的事情,然后去,看看它是否 可以通过添加令牌解决的事情。不过,也有可以使用两种方法来恢复一些语法错误 - 也许你想 逆转,这些战略试验的顺序?

+0

链接已死亡。您能否将相关信息添加到帖子中。 – bolov