[antlr-interest] found more bugs in ANTLRv3.g + howto add separator when parallel iterating 2 lists in stringtemplate

Terence Parr parrt at cs.usfca.edu
Mon Jul 7 12:50:54 PDT 2008


On Jul 7, 2008, at 2:44 AM, Jens Boeykens wrote:

> I think I found 2 more bugs in ANTLRv3.g http://www.antlr.org/grammar/ANTLR
>
> Rule altlist:
>
> altList
> @init {
>     // must create root manually as it's used by invoked rules in  
> real antlr tool.
>     // leave here to demonstrate use of {...} in rewrite rule
>     // it's really BLOCK[firstToken,"BLOCK"]; set line/col to  
> previous ( or : token.
>     CommonTree blkRoot =  
> (CommonTree)adaptor.create(BLOCK,input.LT(-1),"BLOCK");
> }
>     :   a1=alternative rewrite ( '|' a2=alternative rewrite )*
>         -> ^( {blkRoot} (alternative rewrite)+ EOB["EOB"] )
>     ;
>
> I removed the question mark after rewrite in the tree rewrite  
> subrule. This caused problems with parallel iteration of lists.  
> (Only the first rewrite appeared in the tree).

Ah!  Correct.  Thanks.  Updated in the depot.

> Also see my post on the stringtemplate mailing list.
>
> Rule block:
>
> block
>     :   lp='('
>         ( (opts=optionsSpec)? ':' )?
>         a1=alternative rewrite ( '|' a2=alternative rewrite )*
>         rp=')'
>         -> ^( BLOCK[$lp,"BLOCK"] optionsSpec? (alternative rewrite)+  
> EOB[$rp,"EOB"] )
>     ;

Fixed.

> I added "rewrite" to the tree rewrite subrule. Otherwise rewrite was  
> missing in the tree. Also changed block in ANTLRv3Tree.g
>
> block
>     :   ^( BLOCK optOptionsSpec (a+=alternative r+=rewrite)+ EOB )
>         -> block(blok={$BLOCK}, optionsSpec={$optOptionsSpec.st},  
> alternative={$a}, rewrite={$r},
>         eob={$EOB})
>     ;

Fixed.

> I now have a problem iterating parallel through 2 lists (alternative  
> and rewrite) in my stringtemplate:
>
> block(blok, optionsSpec, alternative, rewrite, eob) ::= <<
> <alternative,rewrite: {alt,rw | <alt> <rw> }>
> >>
>
> This should regenerate a rule like  r: a -> int | b -> char;
> My output however is:  r: a -> int b -> char;
> Thus no separator.
>
> If I use template (added a '|'):
>
> block(blok, optionsSpec, alternative, rewrite, eob) ::= <<
> <alternative,rewrite: {alt,rw | <alt> <rw> | }>
> >>
>
> I have one '|' too many in my output:
> r: a -> int | b -> char |;

Use <...; separator="|">

Ter


More information about the antlr-interest mailing list