Antlr语法无法预测的行为

时间:2013-07-06 18:55:50

标签: regex antlr3

我今天开始尝试使用ANTLR3。在我使用的表达中似乎存在差异。

我希望我的班级名字以大写字母开头,然后是大写字母和数字。例如,Car有效,8Car无效。

CLASS_NAME : ('A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9')*;

当我单独测试时,这可以正常工作。但是,当我在以下规则中使用它时,

model
    : '~model' CLASS_NAME model_block
    ;

然而,CLASS_NAME开始从数字开始获取类名。在这种情况下,ANTLR选择Car8Car甚至#Car作为有效令牌。我错过了一些愚蠢的话。任何指针将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

CLASS_NAME8Car#Car不匹配。您可能正在使用ANTLRWorks的解释器(或Eclipse插件,它使用相同的解释器),这是在您不知道的UI选项卡上打印错误,并在令牌中显示不正确的字符。改为使用ANTLRWorks的调试器,或者自己编写一个小测试类:

T.G

grammar T;

parse : CLASS_NAME EOF;

CLASS_NAME : ('A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9')*;

Main.java

import org.antlr.runtime.*;

public class Main {

  public static void main(String[] args) throws Exception {

    TLexer lexer = new TLexer(new ANTLRStringStream("8Car"));
    TParser parser = new TParser(new CommonTokenStream(lexer));
    parser.parse();  
  }
}