[antlr-interest] Rewrite issue
Ivan Bludov
ivan.bludov at gmail.com
Tue Jun 26 09:33:58 PDT 2012
Hi, Guys
I'm playing with rewrite feature of ANTLR. So I have a real SQL
grammar and I'm trying to do something like that.
-------------------------------------------------------------
1)
non_join_query_expression
options {k=1;}
: ( (non_join_query_term -> non_join_query_term)
| (
joined_table ( op = UNION | EXCEPT ) ( ALL | DISTINCT )? (
corresponding_spec )? query_term ->
joined_table $op DISTINCT CORRESPONDING query_term
)
)
(
( op = UNION | EXCEPT ) ( ALL | DISTINCT )? ( corresponding_spec
)? query_term ->
$non_join_query_expression $op DISTINCT CORRESPONDING query_term
)*
;
As an example I try force to set DISTINCT and CORRESPONDING specs in
all cases even they were not noticed.
I have to different behaviors:
a) it's easy to insert CORRESPONDING even it was noticed in a query.
b) But rewriting fails if DISTINCT was not specified ( ALL or nothing
was specified).
Exception in thread "main"
org.antlr.runtime.tree.RewriteEmptyStreamException: token DISTINCT
at org.antlr.runtime.tree.RewriteRuleElementStream._next(RewriteRuleElementStream.java:157)
at org.antlr.runtime.tree.RewriteRuleTokenStream.nextNode(RewriteRuleTokenStream.java:58)
at sql.parser.Sql_parser_Sql_query.non_join_query_expression(Sql_parser_Sql_query.java:17466)
at sql.parser.Sql_parser_Sql_query.query_expression_body(Sql_parser_Sql_query.java:16400)
at sql.parser.Sql_parser_Sql_query.query_expression(Sql_parser_Sql_query.java:15266)
at sql.parser.Sql_parser.query_expression(Sql_parser.java:1468)
at sql.parser.Sql_query_debuger.main(Sql_query_debuger.java:23)
Tell me please how should I force to set DISTINCT spec.
---------------------------------------------------------
2) I use following code to debug
public static void main(String[] args) throws Exception {
System.out.println("begin");
InputStream stream = new FileInputStream(new
File("SQL_samples/test5")); // defaults to ISO-1
ANTLRInputStream inputStream = new ANTLRInputStream(stream);
Sql_lexer lexer = new Sql_lexer(inputStream);
// CommonTokenStream tokenStream = new CommonTokenStream(lexer);
TokenRewriteStream tokenStream = new TokenRewriteStream(lexer);
Sql_parser parser = new Sql_parser(tokenStream);
System.out.println("query_expression");
Sql_parser_Sql_query.query_expression_return result =
parser.query_expression();
System.out.println("parsed");
// pull out the tree and cast it
Tree t = (Tree)result.getTree();
System.out.println(t.toStringTree()); // print out the tree
System.out.println("tree");
System.out.println(tokenStream.toString()); // print out the tree
System.out.println("rewited");
System.out.println("exit");
System.exit(0);
}
I copy this code from some example. But there is something wrong :
System.out.println(t.toStringTree());
prints rewrited query and
System.out.println(tokenStream.toString());
prints input query.
But I consider that it should be vice versa. Could you comment it?
---------------------------------------------------------
3) Could you please say how can I rewrite query to get the folowing:
( op = UNION | EXCEPT ) ( ALL | DISTINCT )? ( corresponding_spec
)? query_term ->
$non_join_query_expression $op DISTINCT CORRESPONDING
"blah-blah-blah" query_term // blah-blah-blah
?
____________
Best regards
Ivan
More information about the antlr-interest
mailing list