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());
}
這很奇怪,因爲我使用4.3:-S 此外,索引是錯誤的。他們應該是0..3和18..21。根據我的理解,DEF令牌有三個字符,並且源間隔應該給出令牌的開始和結束。 – 2014-10-05 23:27:06
@JeffreyGuenther是的,那*是*奇怪的......不知道索引是否應該指向字符或標記(如果是後者,這也是有意義的,在這種情況下,輸出是預期的)。如果我是你,我會在ANTLR4問題跟蹤器中提出這個問題:https://github.com/antlr/antlr4/issues – 2014-10-06 08:24:52