2014-10-03 35 views
2

我正在使用測試套件中提供的語法來試驗XPath,並且遇到了路徑//ID被識別的問題,但未找到//DEF。引發IllegalArgumentException。 「索引2處的DEF不是有效的標記名稱」爲什麼//ID匹配,但是//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()); 
     } 

回答

0

當我運行代碼,下面會打印:

0..0 
18..18 

換句話說:

enter image description here

此XPath樹模式匹配是都很新,所以我的猜測是你已經偶然發現了一個有b的bug een固定。我正在使用ANTLR版本4.2.2

+0

這很奇怪,因爲我使用4.3:-S 此外,索引是錯誤的。他們應該是0..3和18..21。根據我的理解,DEF令牌有三個字符,並且源間隔應該給出令牌的開始和結束。 – 2014-10-05 23:27:06

+0

@JeffreyGuenther是的,那*是*奇怪的......不知道索引是否應該指向字符或標記(如果是後者,這也是有意義的,在這種情況下,輸出是預期的)。如果我是你,我會在ANTLR4問題跟蹤器中提出這個問題:https://github.com/antlr/antlr4/issues – 2014-10-06 08:24:52