001    /**
002     * Borrowed from Terence Parr
003     */
004    
005    package org.mesopotamia.util;
006    
007    import antlr.CommonToken;
008    import antlr.Token;
009    import antlr.collections.AST;
010    
011    public class GrammarAST extends biz.hammurapi.antlr.AST {
012        Token token = null;
013        GrammarAST enclosingBlock = null;
014        String enclosingRule = null;
015    
016        public GrammarAST getEnclosingBlock() {
017            return enclosingBlock;
018        }
019    
020        public void initialize(int i, String s) {
021            token = new CommonToken(i,s);
022        }
023    
024        public void initialize(AST ast) {
025            // Nothing to do
026        }
027    
028        public void initialize(Token token) {
029            this.token = token;
030        }
031    
032        public String getText() {
033            if ( token!=null ) {
034                return token.getText();
035            }
036            return "";
037        }
038    
039        public void setType(int type) {
040            token.setType(type);
041        }
042    
043        public int getType() {
044            if ( token!=null ) {
045                return token.getType();
046            }
047            return -1;
048        }
049    
050        public int getLine() {
051            if ( token!=null ) {
052                return token.getLine();
053            }
054            return 0;
055        }
056    
057        public void setEnclosingBlock(GrammarAST enclosingBlock) {
058            this.enclosingBlock = enclosingBlock;
059        }
060    
061        public void setEnclosingRule(String rule) {
062            this.enclosingRule = rule;
063        }
064    
065        public String getEnclosingRule() {
066            return enclosingRule;
067        }
068    
069        public GrammarAST getLastChild() {
070            if ( this.getType()!=ANTLRTokenTypes.ALT ) {
071                return null;
072            }
073            // the last child of any ALT is EOB node pointing at enclosing block
074            GrammarAST[] kids = getChildrenAsArray();
075            return kids[getNumberOfChildren()-1];
076        }
077    
078        public GrammarAST getLastSibling() {
079            GrammarAST t = this;
080            GrammarAST last = null;
081            while ( t!=null ) {
082                last = t;
083                t = (GrammarAST)t.getNextSibling();
084            }
085            return last;
086        }
087    
088        public GrammarAST[] getChildrenAsArray() {
089            AST t = getFirstChild();
090            GrammarAST[] array = new GrammarAST[getNumberOfChildren()];
091            int i = 0;
092            while ( t!=null ) {
093                array[i] = (GrammarAST)t;
094                t = t.getNextSibling();
095                i++;
096            }
097            return array;
098        }
099    }