[antlr-interest] On trees and JavaBeans, part 2: tree creation

Scott Stanchfield scott at javadude.com
Mon Apr 18 18:54:50 PDT 2005


Payload/carrier won't do IMHO. Too many carriers... Having a generic I/F ala
Swing's TreeModel is really the right way to go, as it can work on any data
structure. (I chatted with him a few weeks ago about it and he explained it
to me)

I understand the concern about loops, but it depends on what the data in the
loops does and on semantic preds. Also, I'm thinking about an alternative
kind of walker, a "bean walker" as well, in addition to the normal tree
walker.

Later,
-- Scott 

> -----Original Message-----
> From: Loring Craymer [mailto:Loring.G.Craymer at jpl.nasa.gov] 
> Sent: Monday, April 18, 2005 5:16 PM
> To: Scott Stanchfield; antlr-interest at antlr.org
> Subject: Re: [antlr-interest] On trees and JavaBeans, part 2: 
> tree creation
> 
> Scott--
> 
> I believe that Ter has adopted the Payload/Carrier model for 
> ANTLR 3--Carriers should implement an interface that contains 
> navigation support (including token ids makes sense, but text 
> belongs in the Payload), but all attribute data is in the 
> Payloads.  If you look in the archives, you can find my posts 
> and those of others involved in the discussion.  The 
> separation of navigation from data goes a long way towards 
> removing the awkwardnesses that you are trying to solve.
> 
> The Carrier interface should be simple enough to wrap most 
> compatible navigation classes, and the base Payload interface 
> would just define
> getText() and maybe getLine() and getColumn().  Carriers get 
> created with a Payload and a type and are homogeneous (but a 
> tree parser pass can be used to convert from one Carrier 
> class to another); Payloads are carried along through 
> transformations and are rarely replaced in tree walks.
> 
> Tree grammars cannot walk "any" data structure--the data 
> structure needs to be either a digraph with no loops, or a 
> digraph in which the navigation methods prevent looping.  
> Modal navigation (methods determine which field to 
> dereference from a mode variable) is possible, but the core 
> restriction is "no loops".
> 
> --Loring
> 
> 
> At 05:21 AM 4/18/2005, Scott Stanchfield wrote:
> >(Please read the "part 1, interfaces, first)
> >
> >[I forgot in part 1 to mention how we get "token" values: 
> the ast model 
> >would define
> >     int getTokenIdFor(Object node);
> >     String getTextFor(Object node);
> >  that would return the parts of a token for any given node. 
> It could 
> >just return a Token, but that would require the model to 
> create Token 
> >objects for each real object, which may not be necessary.]
> >
> >
> >Once we can use any data structure for tree parsing, for 
> tree creation, 
> >it would be useful to be able to create *any* data 
> structure. Factories 
> >are the right approach here, and are pretty close to being 
> exactly what we need.
> >
> >First, ASTFactory must be an interface. Then, abstract away 
> "AST" from 
> >the methods. For example:
> >
> >   void addChild(Object parent, Object child)
> >   Object create(int type)
> >   Object create(int type, String text)
> >   Object create(int type, String text, String className)
> >   ...
> >
> >Poof.
> >
> >Using the existing ANTLR tree support and only a slight bit of 
> >abstraction, we can now:
> >* create any data structure
> >* walk any data structure
> >
> >ANTLR becomes the ultimate tool for everything ;)  [Not really of 
> >course, but tree parsers become much easier to use and 
> therefore more 
> >useful, and parsing to build data structures becomes easy as well]
> >
> >
> >Next to JavaBeans, making it all even more powerful...
> >
> >
> >With a little syntactic sugar, we can have the grammar explicitly 
> >specify which properties of a bean to set or read.
> >
> >
> >The trouble with what I've said so far is that things are 
> positional. 
> >The only way to determine what to parse or build is by the order of 
> >adds or the index when asking for a child.
> >
> >
> >What if we used labels that were javabean property names and had a 
> >"bean mode"? (Note: this would work for any language that we 
> can create 
> >"get" and "set" methods for, not just java!)
> >
> >
> >   options {
> >     beanMode = true;
> >   }
> >
> >   person creates Person
> >     : name:IDENT phone:phoneNumber address:address
> >     ;
> >
> >   address creates Address
> >     : street:IDENT city:IDENT COMMA! state:IDENT zip:INTEGER
> >     ;
> >
> >
> >While this needs a little syntactic help, the idea is that 
> the "creates"
> >clause states what kind of object to create, and the labels specify 
> >which properties to assign in the bean being created.
> >If the property is a token, we just set the token. If it's a 
> string, we 
> >just set the token text. We'd probably want some special cases for a 
> >few other data types as well. Primitive conversions are 
> simple string conversions.
> >
> >Poof - no action code required to create a data structure 
> based on set 
> >methods and no-arg constructors!
> >(We don't really need the "!" in the above example; we could 
> ignore any 
> >term without a label)
> >
> >We'd also need "add" support as well as get/set. (Note here 
> we *need* 
> >the parens for the * closure...)
> >
> >
> >   person creates Person
> >     : name:IDENT ...
> >       ( child:child )*
> >     ;
> >
> >Assuming there's an addChild method, it would be called each time 
> >through the loop. If there were only a setChild, it would be 
> >overwritten each time through the loop. We could add some 
> sugar here to ensure an add:
> >
> >   person creates Person
> >     : name:IDENT ...
> >       ( add:child:child )*
> >     ;
> >
> >(ewww)
> >
> >But I don't think that's necessary.
> >
> >
> >This of course assumes that subrules all contribute to the rule's 
> >object being built. To build other objects, a separate 
> top-level rule 
> >must be defined. (This is the way my XML parsing support 
> works, and it 
> >seems peachy so far).
> >
> >
> >[For "bean walking", this is an entirely new ballgame, and I haven't 
> >finished thinking through it. Current tree parsers are positional. 
> >Instead, the new type of tree parser could check properties 
> instead of "next child".
> >I need to chew on this a bit more to get a good example before I 
> >propose it...]
> >
> >
> >
> >Thoughts?
> >-- Scott
> 
> 






More information about the antlr-interest mailing list