2

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

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

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

当我单独测试它时,这很好用。但是,当我在以下规则中使用它时,

model
    : '~model' CLASS_NAME model_block
    ;

但是,CLASS_NAME也开始使用以数字开头的类名。在这种情况下,ANTLR 会选择Car8Car甚至#Car作为有效令牌。我错过了一些愚蠢的东西。任何指针将不胜感激。谢谢。

4

1 回答 1

1

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

Tg

grammar T;

parse : CLASS_NAME EOF;

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

主.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();  
  }
}
于 2013-07-06T20:08:45.647 回答