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 }