[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Help with Java coding utility



Hi Emmanuele,

I fully agree with Othman's suggestions.  I just wanted to add a little something...

I know that this hasn't been advertized very well in the documentation (all my fault;-), but the generated parser class has a public "ignoredTokens" field that keeps record of all ignored tokens.  This means that all comments & blanks are not lost at parse time.  This is important for your project,
as you will need these tokens to write back your modified classes.

Here's how it works:

Assume you have the following input program:

---- BEGIN ----
/* an empty class */
class Empty{}
---- END ----


Here's the resulting token stream:
Ign: [/* an empty class */]
     [\n]
AST: [class]
Ign: [ ]
AST: [class]
Ign: [ ]
AST: [Empty]
AST: [{]
AST: [}]
AST: [EOF]

When an Ignored Token is matched, it is added into a Linked list.  This linked list is then associated with the next "following" AST "leaf" through the Parser.ignoredTokens map.

So, for example, if you are on token node [class] in the AST, you can write the following:

LinkedList list = (LinkedList) Parser.ignoredTokens.getIn(classnode);
for(Iterator i = list.iterator(); i.hasNext(); )
{
  System.out.println(i.next());
}

This will print:
/* an empty class */
        <- newline ;-)

If you do Parser.ignoredTokens.getIn(somenode) for a token that isn't preceeded by ignored tokens, then you get "null".

I hope this helps!

Etienne

Othman Alaoui wrote:
> 
> Hi Emmanuele,
> 
> on the top of my head, this seems doable as an AST transformation:
> - build your AST
> - iterate on the list of (public?) fields of each class node:
>     - for each field, create a method node in a bottom-up fashion that
> contains the corresponding simple statement (AAssignStatement or something
> like that). Do this for both the setter and the getter.
>     - add the 2 methods to the list of methods embedded in the class node by
> using the appropriate setter of the class node
> - pretty-print the transformed AST (preferably with your own pretty-printer,
> if you want the original formatting of your source file: this actually may
> not be that obvious...)
> 
> Hope it helps!
> Othman
> 
> ----- Original Message -----
> From: "Etienne M. Gagnon" <egagnon@j-meg.com>
> To: "sablecc-list" <sablecc-list@sable.mcgill.ca>; "Emmanuele Sordini"
> <vega@ulisse.it>
> Sent: Saturday, May 20, 2000 9:54 AM
> Subject: Fw: Help with Java coding utility
> 
> > Date: Sat, 20 May 2000 15:45:06 +0100
> > From: Emmanuele Sordini <vega@ulisse.it>
> > To: SableCC Mailing List <sablecc-list@sable.mcgill.ca>
> > Subject: Help with Java coding utility
> >
> > To all SableCC members
> > I'm quite new to SableCC (in fact, I downloaded it only a few days ago).
> > I was searching for a parser/lexer written in Java, I looked through
> > some alternatives and I found this to be probably the best. Therefore,
> > I would like to congratulate Etienne Gagnon on his outstanding work.
> >
> > I'm also seeking help, because I would like to carry out a project of
> > mine, and I thought a parser like SableCC would be of some help with
> > this: I hereby give a short description.
> >
> > When coding in Java, except for trivial cases I'm used to declare class
> > attributes (fields) as private or protected, and then to provide access
> > to them via getter/setter methods. Adding a getter/setter pair can
> > be quite a bore if the class is not very simple. Therefore, here's
> > what I would like to carry out with SableCC:
> >
> > 1) For all classes in a Java file (apart from inner classes), no matter
> >    if they are public or not, I would like my parser to generate a
> >    getter/setter method pair, and to put them at the end of the class
> >    declaration, just before the closing brace. As a result of this
> >    automated operation, the rest of the file should not be altered:
> >    comments, indentation should remain exactly in place.
> > 3) The name of the setter/getter for the attribute "someField" should
> >    be: "setSomeField" and "getSomeField"; that is, the "get" or "set"
> >    words plus the field's name with the first letter turned to
> >    upper case.
> > 3) Here's an example of what the whole thing should look like:
> >
> > public class Foo
> > {
> >   protected A firstAttribute;
> >   protectd B secondAttribute;
> >
> >   // constructors and methods
> >
> >   // Automatically-generated section
> >   public A getFirstAttribute()
> >   {
> >     return firstAttribute;
> >   }
> >
> >   public void setFirstAttribute(A a)
> >   {
> >     firstAttribute = a;
> >   }
> >   // End of section
> > }
> >
> > I started dabbling with the Java 1.1 example bundled with the
> > SableCC distribution. So far, by subclassing the DepthFirstAdapter
> > class I've only come up with something that stores into a list
> > every (type, fieldName) pair for each attribute. Now I'm in trouble
> > because I would like to write the code generator and make it
> > insert the getter/setter section in every class **without**
> > modifying its content in **any** way, comments included.
> >
> > I apologize for this long post. I hope to have stirred the fellow
> > members' curiosity. I will be deeply grateful for every hints/
> > pointers/suggestions that could help me achieve this goal.
> >
> > Thanks in advance,
> > Emmanuele Sordini
> >

-- 
----------------------------------------------------------------------
Etienne M. Gagnon, M.Sc.                     e-mail: egagnon@j-meg.com
Author of SableCC:                 http://www.sable.mcgill.ca/sablecc/
----------------------------------------------------------------------