001    /*
002     @license.text@
003     */
004    package biz.hammurapi.antlr;
005    
006    import org.w3c.dom.Document;
007    import org.w3c.dom.Element;
008    
009    import antlr.collections.AST;
010    
011    /**
012     * Serializes AST to DOM
013     * @author Pavel Vlasov
014     */
015    public class AstUtil {
016            /**
017             * Serializes AST, its children and its siblings to DOM.
018             * @param node
019             * @param tokenNames
020             * @param holder
021             */
022            public static void toDom(antlr.collections.AST node, String[] tokenNames, Element holder) {
023                    for (AST ast=node; ast!=null; ast=ast.getNextSibling()) {
024                            holder.appendChild(toDom(ast, tokenNames, holder.getOwnerDocument()));
025                    }
026            }
027            
028            /**
029             * Serializes AST and its children to DOM.
030             * @param node
031             * @param tokenNames
032             * @param owner
033             */
034            public static Element toDom(antlr.collections.AST node, String[] tokenNames, Document owner) {
035                    Element ret=owner.createElement("ast");
036                    ret.setAttribute("type", tokenNames[node.getType()]);
037                    if (node.getText()!=null) {
038                            ret.appendChild(owner.createTextNode(node.getText()));
039                    }
040                    for (AST child=node.getFirstChild(); child!=null; child=child.getNextSibling()) {
041                            ret.appendChild(toDom(child, tokenNames, owner));
042                    }
043                    return ret;
044            }
045            
046            private static String tabs(int t) {
047                    StringBuffer sb=new StringBuffer();
048                    for (int i=0; i<t; i++) {
049                            sb.append("....");                      
050                    }
051                    return sb.toString();
052            }
053            
054            /**
055             * Dumps node and siblings 
056             * @param node
057             * @param tokenNames
058             */
059            public static void dumpAll(antlr.collections.AST node, String[] tokenNames) {
060                    System.out.println("=== AST Dump ===");
061                    while (node!=null) {
062                            dump(node, tokenNames, 0);
063                            node=node.getNextSibling();
064                    }
065            }
066            
067            /**
068             * Dumps this node and its children
069             * @param node
070             */
071            public static void dump(antlr.collections.AST node, String[] tokenNames) {
072                    dump(node, tokenNames, 0);
073            }
074                    
075            private static void dump(antlr.collections.AST node, String[] tokenNames, int tab) {
076                    System.out.print(tabs(tab));
077                    System.out.print(tokenNames[node.getType()]);
078                    if (node.getText()!=null) {
079                            System.out.println(" '"+node.getText()+"'");
080                    }
081                    for (AST child=node.getFirstChild(); child!=null; child=child.getNextSibling()) {
082                            dump(child, tokenNames, tab+1);
083                    }               
084            }
085    }