[antlr-interest] Token Stream Rewriting

Bart Kiers bkiers at gmail.com
Tue Jun 21 23:36:26 PDT 2011


Fabien, but what is the return type of  this `merge(...)` method? Could you
post the method? Or even better: post a SSCCE <http://sscce.org>that causes
such an exception?

Regards,

Bart.


On Wed, Jun 22, 2011 at 8:30 AM, Fabien Hermenier <hermenierfabien at gmail.com
> wrote:

> In fact, I've badly readed the help. So yet, it is running a String that
> should be tokenized (then translated into tree I suppose) at run time.
>
> Le 22/06/11 00:28, Bart Kiers a écrit :
> > Is your `merge(String, List, String)` method returning
> > a java.util.ArrayList instead of a Tree?
> >
> > Regards,
> >
> > Bart.
> >
> >
> > On Wed, Jun 22, 2011 at 8:04 AM, Fabien Hermenier
> > <hermenierfabien at gmail.com <mailto:hermenierfabien at gmail.com>> wrote:
> >
> >     Hi
> >
> >     I have some troubles with token stream rewriting. Below is the
> >     piece of
> >     ANTLR code. I have a grammar, with an AST as output and Java
> >     as the target. I want to insert a sequence of token into the stream.
> >
> >     I have followed the page
> >
> http://www.antlr.org/wiki/display/~admin/2007/06/28/Token+stream+rewriting+with+rewrite+rules
> >     <
> http://www.antlr.org/wiki/display/%7Eadmin/2007/06/28/Token+stream+rewriting+with+rewrite+rules
> >
> >     and adapted the example that interest me. A piece of the code is
> >     following. Basically, in the alternative of 'explodedSet', I get the
> >     return values of other rules and do some stuff in the merge
> >     method. This
> >     one returns a list of String as explained in the online example.
> >
> >
> >     explodedSet: '{' (setContent (',' setContent)*)? '}' ->
> ^(EXPLODED_SET
> >     setContent+)
> >         | {List l = new LinkedList();}LEFTY
> >     r1=brace_content{l.add($r1.ret);} (','
> >     r2=brace_content{l.add($r2.ret);})* RIGHTY
> >         -> {
> >         merge($LEFTY.text,l,$RIGHTY.text)
> >         };
> >
> >     brace_content returns [List ret]:
> >              st=number ('..' ed=number)? {$ret = new LinkedList(); for
> >     (int
> >     i = $st.val; i <= $ed.val; i++) {$ret.add(i);}}
> >                | NAME {$ret = new LinkedList(); $ret.add($NAME.text);};
> >
> >     The code compiles well but at runtime, I've got this exception:
> >
> >     Caused by: java.lang.ClassCastException: java.util.ArrayList cannot
> be
> >     cast to org.antlr.runtime.tree.Tree
> >         at
> >
> org.antlr.runtime.tree.BaseTreeAdaptor.addChild(BaseTreeAdaptor.java:107)
> >         at Parser.explodedSet(Parser.java:560)
> >
> >     So, the return value of merge does not seems to be converted into
> >     tokens
> >     nor Tree. Does someone has an idea ?
> >
> >
> >     Fabien.
> >
> >     List: http://www.antlr.org/mailman/listinfo/antlr-interest
> >     Unsubscribe:
> >
> http://www.antlr.org/mailman/options/antlr-interest/your-email-address
> >
> >
>
>
> --
> Fabien Hermenier
> Postdoctoral researcher at Flux
> http://sites.google.com/site/hermenierfabien/home
>
>
> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> Unsubscribe:
> http://www.antlr.org/mailman/options/antlr-interest/your-email-address
>


More information about the antlr-interest mailing list