[antlr-interest] "explosion" rewrite

Jim Idle jimi at temporal-wave.com
Fri May 1 13:50:47 PDT 2009


Steve Ebersole wrote:
> Is there a syntax to "explode" a subrule result (sorry don't know a
> better term).
>
> I have a rule:
>
> sortSpecification
>     : sortKey collationSpecification? orderingSpecification?
>         -> ^( SORT_SPEC sortKey collationSpecification?
> orderingSpecification? )
>     ;
>
> The result of the sortKey subrule could be a Tree of type VECTOR_EXPR
> (its a "row value constructor" for those familiar with SQL). 
>
> In terms of eventual output, this rule translates as "(sort_key1,
> sort_key2) asc" where "sort_key1, sort_key2)" is the VECTOR_EXPR.  
>
> Instead what I need to have happen is "sort_key1 asc, sort_key2 asc".
>
> I started down the path of trying an @after in the sortSpecification and
> calling out to some java code to mutate the tree manually.  But I'd
> prefer to keep this in the grammar if at all possible.
>
>
>   
I would need to see your sortKey rule but you can do things like this:

x : a+=something x? y? ->^(NODE $a $x? $y)+

That will probably get you on track. Also, you could reorder the tree 
and more easily pick up the order:

-> ^( SORT_SPEC collationSpecification?
orderingSpecification? sortKey)

Assuming the first two optional sequences have a root node. Then you could assume that the elements in sortKey have whatever you have established in the ordering.

If what you are trying to do is parse a SQL statement you could try inputting this into my online SQL parser and looking at the tree output:

http://www.temporal-wave.com

Jim


More information about the antlr-interest mailing list