[antlr-interest] Concatenation in Tree Rewriting
Kay Röpke
kroepke at classdump.org
Tue Aug 12 08:34:55 PDT 2008
On Aug 12, 2008, at 2:57 PM, Louis Rose wrote:
> Hi all,
>
> I was wondering if there's a more elegant way to write the
> intentions of the following grammar rule:
>
> adjective
> : ADJECTIVE_PREFIX? NAME -> {new CommonTree(new
> CommonToken(ADJECTIVE, ($ADJECTIVE_PREFIX.text == null ?
> $NAME.text : $prefix.text + $NAME.text)))}
> ;
>
> The ADJECTIVE token type is an imaginary token, and has been defined
> in the tokens {} block.
Not directly, I think.
To avoid having the action in the rewrite rule, you could build up the
prefix-name combination in a separate string.
grammar Imag;
options { output=AST; }
tokens { IMAG; }
PREFIX: 'foo::';
NAME: 'name';
rule
@init {
String name = new String();
}
: (PREFIX {name = $PREFIX.text;})? NAME {name += $NAME.text;} ->
^(IMAG[name])
;
Or even:
rule
: PREFIX? NAME -> ^(IMAG[($PREFIX.text == null ? "" : $PREFIX.text) +
$NAME.text])
;
Which I'm surprised is working :P The first ?: is to work around
having null turn to "null" when toString is called on it.
I would exactly do it, because it looks really ugly, but it works. I
prefer the first version.
cheers,
-k
--
Kay Röpke
http://classdump.org/
More information about the antlr-interest
mailing list