[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/
----------------------------------------------------------------------