[antlr-interest] another way to preserve token order in ASTs
Terence Parr
parrt at cs.usfca.edu
Sat Jul 31 16:05:59 PDT 2004
Have you seen the article:
http://www.antlr.org/article/preserving.token.order/
preserving.token.order.tml
called "Preserving Original Token Sequence In ASTs"?
It has a pretty slick way of dealing with this issue :)
Ter
On Jul 31, 2004, at 3:50 PM, thrutchy wrote:
> I just coded up a very simple way to preserve token order in the AST's
> - put in a dummy node where the root would have gone. What you do is
> override the AST addChild method (used while making a root) to put the
> child at the front with a null node behind it, instead of just adding
> it in at the end (roots don't have any children initially). You can
> do this to any of the BaseAST classes, but I did it to
> CommonASTWithHiddenTokens:
>
> import antlr.collections.AST;
>
> public class CommonAST2WithHiddenTokens extends
> CommonASTWithHiddenTokens {
> protected AST left = null;
> public void addChild(AST node) {
> AST rootMarker = new CommonAST(); // Token.INVALID_TYPE
> rootMarker.setNextSibling(this.down);
> if (node != null) {
> this.down = (BaseAST)node;
> while (node.getNextSibling() != null) {
> node = node.getNextSibling();
> }
> node.setNextSibling((BaseAST)rootMarker);
> } else {
> this.down = (BaseAST)rootMarker;
> }
> }
> }
>
>
> Then my AST print routines looked like this:
>
> public static void printHiddenBefore(AST a) {
> if (a==null) return;
> AST leftChild = a.getFirstChild();
> if (leftChild!=null &&
> leftChild.getType()!=Token.INVALID_TYPE) {
> a = leftChild;
> }
> java.util.List before = new ArrayList();
> for (
> CommonHiddenStreamToken t =
> ((CommonAST2WithHiddenTokens)a).getHiddenBefore() ;
> t!=null ;
> t = t.getHiddenBefore() )
> {
> before.add(t.getText());
> }
> for (int i=before.size()-1;i>=0;--i) {
> System.out.print(before.get(i));
> }
> }
>
> public static AST printAST(AST a) {
> while (a!=null) {
> if (a.getType()==Token.INVALID_TYPE) {
> a = a.getNextSibling();
> return a;
> }
> AST leftChild = a.getFirstChild();
> AST rightChild = printAST(leftChild);
> String s = a.toString();
> if (s!=null) System.out.print(s);
> for (
> CommonHiddenStreamToken t =
> ((CommonAST2WithHiddenTokens)a).getHiddenAfter() ;
> t!=null ;
> t = t.getHiddenAfter() )
> {
> System.out.print(t.getText());
> }
> printAST(rightChild);
> a = a.getNextSibling();
> }
> return null;
> }
>
> I toyed around with a few other ideas (add a "left" AST pointer, add a
> dummy root node for the children to the left of the root), but those
> required changing one line the ASTFactory class (or extending it and
> overriding stuff). For those interested, it was line 361 in the
> makeASTRoot method. It would have been nice to have this:
>
> currentAST.child = root.getFirstChild();
>
> instead of:
>
> currentAST.child = currentAST.root;
>
> I don't believe this would have broken compatability, but it would
> have allowed something very different to be done in AST addChild
> method.
>
> Eric
>
>
>
>
>
> Yahoo! Groups Links
>
>
>
>
>
>
--
CS Professor & Grad Director, University of San Francisco
Creator, ANTLR Parser Generator, http://www.antlr.org
Cofounder, http://www.jguru.com
Cofounder, http://www.knowspam.net enjoy email again!
Cofounder, http://www.peerscope.com pure link sharing
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/antlr-interest/
<*> To unsubscribe from this group, send an email to:
antlr-interest-unsubscribe at yahoogroups.com
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/
More information about the antlr-interest
mailing list