为什么这个// ID通过但是// DEF失败了?

时间:2014-10-03 06:00:50

标签: xpath antlr4

我正在使用测试套件中提供的语法试验XPath,并且遇到了路径//ID被识别的问题,但找不到//DEF。抛出IllegalArgumentException。 “索引2处的DEF不是有效的令牌名称”为什么//ID匹配,但//DEF不匹配?

String exprGrammar = "grammar Expr;\n" +
"prog:   func+ ;\n" +
"func:  DEF ID '(' arg (',' arg)* ')' body ;\n" +
"body:  '{' stat+ '}' ;\n" +
"arg :  ID ;\n" +
"stat:   expr ';'                 # printExpr\n" +
"    |   ID '=' expr ';'          # assign\n" +
"    |   'return' expr ';'        # ret\n" +
"    |   ';'                      # blank\n" +
"    ;\n" +
"expr:   expr ('*'|'/') expr      # MulDiv\n" +
"    |   expr ('+'|'-') expr      # AddSub\n" +
"    |   primary                  # prim\n" +
"    ;\n" +
"primary" +
"    :   INT                      # int\n" +
"    |   ID                       # id\n" +
"    |   '(' expr ')'             # parens\n" +
"    ;" +
"\n" +
"MUL :   '*' ; // assigns token name to '*' used above in grammar\n" +
"DIV :   '/' ;\n" +
"ADD :   '+' ;\n" +
"SUB :   '-' ;\n" +
"RETURN : 'return' ;\n" +
"DEF:  'def';\n" +
"ID  :   [a-zA-Z]+ ;      // match identifiers\n" +
"INT :   [0-9]+ ;         // match integers\n" +
 "NEWLINE:'\\r'? '\\n' -> skip;     // return newlines to parser (is end-statement signal)\n" +
 "WS  :   [ \\t]+ -> skip ; // toss out whitespace\n";

        String SAMPLE_PROGRAM =
                "def f(x,y) { x = 3+4; y; ; }\n" +
                "def g(x) { return 1+2*x; }\n";

        Grammar g2 = new Grammar(exprGrammar);

        LexerInterpreter g2LexerInterpreter = g2.createLexerInterpreter(new ANTLRInputStream(SAMPLE_PROGRAM));
        CommonTokenStream tokens = new CommonTokenStream(g2LexerInterpreter);
        ParserInterpreter parser = g2.createParserInterpreter(tokens);
        parser.setBuildParseTree(true);
        ParseTree tree = parser.parse(g2.rules.get("prog").index);

         String xpath = "//DEF";
        for (ParseTree t : XPath.findAll(tree, xpath, parser) ) {
            System.out.println(t.getSourceInterval());
        }

1 个答案:

答案 0 :(得分:0)

当我运行您的代码时,会打印以下内容:

0..0
18..18

换句话说:

enter image description here

这个XPath树模式匹配都是新的,所以我的猜测是你偶然发现了一个已修复的bug。我正在使用ANTLR版本4.2.2