[antlr-interest] proposed enhancement to ANTLR v3 ST integration
Terence Parr
parrt at cs.usfca.edu
Fri Jan 6 15:24:00 PST 2006
Howdy,
[Added to blog http://www.antlr.org/blog/antlr3/rewrite.tml ]
I've been resisting the temptation to introduce a new symbol to
handle templates. For example, to avoid adding a new special symbol,
I introduced $templates::foo(args) as the template constructor to
build foo, which translates to:
st = templateLib.getInstanceOf("foo");
st.setAttribute("arg1", ...);
...
With other template libs, you'd do $Java::method(...) etc... Now I'm
finding real situations where ST integration can be improved. The
ctor problem is reasonably solved, but setting attributes still
sucks: st.setAttribute("arg1", e1); is repeated many times all over.
A better notation would be $st.arg1 = e1; but that is highly
ambiguous with the $x.y notation. Anyway, after looking at a number
of real examples now, I find the urge to introduce a new symbol to
help the human brain separate rule/scope attribute references from
template syntactic sugar. I propose the following (developed in
collaboration with Jean Bovet and influenced by Hartmut Kocher's
suggestions):
%foo(...) ctor (even shorter than $templates::foo(...))
%(...) anonymous template from string expr
%x.y = z; set template attribute y of x (always set never
get attr) to z
[languages like python without ';' must still use the ';' which the
code generator is free to remove during code gen]
%(expr).y = z; template attribute y of StringTemplate-typed
expr to z
what about other template scopes?
%Java::method(...) scoped constructor
%CPP::method...) ...
Make sense? Objections? hard to tell until you see a real
example ;) I see a lot of
a : ID -> {new StringTemplate($ID.text)} ;
which would be now
a : ID -> {%($ID.text)} ;
or even simpler:
a : ID -> %($ID.text) ;
I see lots of setAttribute stuff like:
a[int foo] : ID
{
StringTemplate x = $templates::foo();
...
x.setAttribute("arg1", $ID.text);
x.setAttribute("arg2", $a.foo);
$st = x;
}
;
Now it would be:
a[int foo] : ID
{
StringTemplate x = %foo();
...
%x.arg1 = $ID.text;
%x.arg2 = $foo;
$st = x;
}
;
So x is just a variable like you expect; to use shortcut access to ST
stuff, you need the %. Note how the $ stuff is now clearly separated
from the % template stuff.
Look ok?
Ter
More information about the antlr-interest
mailing list