[antlr-interest] Re: Summary of ANTLR Issues

lgcraymer lgc at mail1.jpl.nasa.gov
Wed Jul 9 11:05:45 PDT 2003


Actually, immediate invocation of an AST method is something that 
ANTLR 3 probably won't support--we are likely to change the way ASTs 
are constructed to optimize away the problem of excessive AST node 
allocation (creating a node and then never using it).  The idea is 
that ANTLR would construct a list of AST operations (node creation, 
add sibling, make root) and then apply them at the end of a rule.  You 
would have to have "MyMethod" called by the constructor.

--Loring


--- In antlr-interest at yahoogroups.com, Ric Klaren <klaren at c...> wrote:
> Hi,
> 
> On Tue, Jul 08, 2003 at 04:04:06PM -0400, Tiller, Michael (M.M.) 
wrote:
> -----snip---
> tokens {
> 	BLOCK<AST=My_AST>; // imaginary token
> }
> 
> block
> 	:	LCURLY! ( statement )* RCURLY!
> 		// add imaginary BLOCK node on top of statement list
> 		{
>             #block = #([BLOCK, "BLOCK"], #block);
>             // I told ANTLR that a BLOCK had type "MyAST" so
>             // I should be able to do this:
>             #block->MyMethod();
>         }
> 	;
> ----snip----
> 
> There is one issue with the block rule, which cannot be fixed easily 
(would
> require a 2nd pass over the action blocks in a rule). ANTLR has no 
way of
> knowing that you will use the block rules return AST with a custom 
ast
> type. This is why the MyMethod call will fail. The return AST types 
are
> hardcoded to or the default RefAST or the default custom AST for the
> parser. A work around could be (but you probably found it already):
> 
> { RefMyAST b = #([BLOCK, "BLOCK"]); ## = #( b, #block ); 
b->MyMethod(); }
> 
> Under the hood #([BLOCK,"BLOCK"]) seems to generate the right AST 
type, so
> that's good.
> 
> Then there's the issue with the initializeFactory which is a bit 
vague-ish
> and does not make me happy because it is in a piece of the code that 
is a
> horrible hack already. I'm thinking about a different solution 
that's
> cleaner.
> 
> >   You mention above that you think this is a bug if it isn't
> >   supported.
> 
> I was more refering to the ##->MyMethod() in that case (or whatever 
you had
> as example there. Not the rule<AST=MyAST> that's of course not 
supported.)
> Though I was incorrect in that the ##->somemethod would function in 
your
> case. I guess I was still in a (homogeneous) custom AST type thought 
set.
> 
> To summarize. 
> 
> This particular use of ##->somemethod on the return AST of a rule is 
I
> guess something for ANTLR 3, or I have to rearchitect a number of 
things in
> the codegenerator setup (which also forces me to touch java and C# 
modes)
> I'm afraid you have to do with the workaround here for now :(
> 
> The missing factory init I'll fix in the next snapshot.
> 
> Cheers,
> 
> Ric
> --
> 
-----+++++*****************************************************+++++++
++-------
>     ---- Ric Klaren ----- j.klaren at u... ----- +31 53 4893722  ----
> 
-----+++++*****************************************************+++++++
++-------
>   Quidquid latine dictum sit, altum viditur.
>                  (Whatever is said in Latin sounds profound.)


 

Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/ 




More information about the antlr-interest mailing list