[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