Traductor e intérprete del lenguaje CL 1.23
|
00001 00026 import org.antlr.runtime.tree.*; 00027 import org.antlr.runtime.Token; 00028 00061 final class CL_AST extends CommonTree { 00062 00069 private TypeTree tipus; 00070 00079 private boolean esReferenciable; 00080 00087 CL_AST(Token t) { 00088 super(t); 00089 tipus = new TypeTree(); 00090 esReferenciable = false; 00091 } 00092 00093 // // El metodo dupNode() no es neceario porque en este 00094 // // compilador no se reescribe el AST: 00095 // public Tree dupNode() { 00096 // return new CL_AST(this); 00097 // } 00098 00102 TypeTree getTypeTree() { 00103 return tipus; 00104 } 00105 00109 void setTypeTree(TypeTree t) { 00110 tipus = t; 00111 } 00112 00118 void setTypeTree(int type) { 00119 tipus = new TypeTree(type); 00120 } 00121 00126 void setTypeError() { 00127 tipus = new TypeTree(TypeCheck.TypeError); 00128 } 00129 00133 boolean getReferenciable() { 00134 return esReferenciable; 00135 } 00136 00141 void setReferenciable(boolean b) { 00142 esReferenciable = b; 00143 } 00144 00152 public CL_AST getChild(int i) { 00153 return (CL_AST) super.getChild(i); 00154 } 00155 00167 private String toNodeString() { 00168 switch (getType()) { 00169 case CLParser.IDENT: 00170 case CLParser.INT_CONST: 00171 case CLParser.STRING_CONST: 00172 return CLParser.tokenNames[getType()].toLowerCase() + "(" + getText() + ")"; 00173 default: 00174 return getText(); 00175 } 00176 } 00177 00188 @Override 00189 public String toString() { 00190 String s = toNodeString(); 00191 if (tipus.isTypeUndefined()) { 00192 return s; 00193 } else { 00194 s = s + " <" + tipus.toStringTree() + ">"; 00195 if (esReferenciable) { 00196 s = s + " [R]"; 00197 } 00198 return s; 00199 } 00200 } 00201 00211 static private void toIndentedTreeString(CL_AST t, String s, StringBuffer sb) { 00212 if (t != null) { 00213 sb.append(t.toString() + "\n"); 00214 if (t.getChildCount() > 0) { 00215 CL_AST child; 00216 String s1; 00217 for (int i = 0; i < t.getChildCount(); i++) { 00218 sb.append(s + " \\__"); 00219 child = (CL_AST) t.getChild(i); 00220 if (i < t.getChildCount() - 1) { 00221 s1 = s + " |"; 00222 } else { 00223 s1 = s + " "; 00224 } 00225 for (int j = 0; j < child.toNodeString().length(); j++) { 00226 s1 = s1 + " "; 00227 } 00228 toIndentedTreeString(child, s1, sb); 00229 } 00230 } 00231 } 00232 } 00233 00238 static String toIndentedTreeString(CL_AST t) { 00239 StringBuffer sb = new StringBuffer(); 00240 String s1 = ""; 00241 for (int j = 0; j < new String("program").length() - 2; j++) { 00242 s1 = s1 + " "; 00243 } 00244 toIndentedTreeString(t, s1, sb); 00245 return sb.toString(); 00246 } 00247 00248 }