1 package gnu.expr; 2 import gnu.text.SourceMessages; 3 4 5 6 public class ExpWalker 7 implements gnu.text.SourceLocator 8 { 9 protected SourceMessages messages; 10 Compilation comp; 11 12 13 public Compilation getCompilation () { return comp; } 14 15 public SourceMessages getMessages () { return messages; } 16 17 protected Expression walkExpression (Expression exp) 18 { 19 exp.walkChildren(this); 20 return exp; 21 } 22 23 public void setContext (Compilation comp) 24 { 25 this.comp = comp; 26 messages = comp.getMessages(); 27 } 28 29 34 public Expression walk(Expression exp) 35 { 36 int line = exp.getLineNumber(); 37 if (messages != null && line > 0) 38 { 39 String saveFile = messages.getFileName(); 40 int saveLine = messages.getLineNumber(); 41 int saveColumn = messages.getColumnNumber(); 42 messages.setLine(exp.getFileName(), line, exp.getColumnNumber()); 43 Expression ret = exp.walk(this); 44 messages.setLine(saveFile, saveLine, saveColumn); 45 return ret; 46 } 47 return exp.walk(this); 48 } 49 50 protected Expression walkApplyExp (ApplyExp exp) 51 { 52 return walkExpression(exp); 53 } 54 55 protected Expression walkIfExp (IfExp exp) 56 { 57 return walkExpression(exp); 58 } 59 60 protected final void walkDeclarationType (Declaration decl) 61 { 62 Expression texp1 = decl.getTypeExp(); 63 if (texp1 != null) 64 { 65 Expression texp2 = texp1.walk(this); 66 if (texp2 != texp1) 67 decl.setTypeExp(texp2); 68 } 69 } 70 71 protected final void walkDeclarationTypes (ScopeExp exp) 72 { 73 for (Declaration decl = exp.firstDecl(); decl != null; 74 decl = decl.nextDecl()) 75 { 76 walkDeclarationType(decl); 77 } 78 } 79 80 protected Expression walkScopeExp (ScopeExp exp) 81 { 82 walkDeclarationTypes(exp); 83 return walkExpression(exp); 84 } 85 86 protected Expression walkLetExp (LetExp exp) { return walkScopeExp(exp); } 87 protected Expression walkLambdaExp (LambdaExp exp) { return walkScopeExp(exp); } 88 protected Expression walkClassExp (ClassExp exp) { return walkLambdaExp(exp); } 89 protected Expression walkObjectExp (ObjectExp exp) { return walkClassExp(exp); } 90 protected Expression walkModuleExp (ModuleExp exp) { return walkLambdaExp(exp); } 91 92 protected Expression walkSetExp (SetExp exp) 93 { 94 Declaration decl = exp.binding; 95 boolean updateNeeded = decl != null && decl.value == exp.new_value; 96 Expression ret = walkExpression(exp); 97 if (updateNeeded && exp.isDefining()) 100 { 101 decl.value = exp.new_value; 102 if (exp.new_value instanceof LambdaExp) 103 ((LambdaExp) exp.new_value).nameDecl = decl; 104 } 105 return ret; 106 } 107 108 protected Expression walkTryExp (TryExp exp) { return walkExpression(exp); } 110 protected Expression walkBeginExp (BeginExp exp) { return walkExpression(exp); } 111 protected Expression walkQuoteExp (QuoteExp exp) { return walkExpression(exp); } 112 protected Expression walkReferenceExp (ReferenceExp exp) 113 { return walkExpression(exp); } 114 protected Expression walkThisExp (ThisExp exp) { return walkReferenceExp(exp); } 115 protected Expression walkSynchronizedExp (SynchronizedExp exp) 116 { return walkExpression(exp); } 117 118 protected Expression walkBlockExp(BlockExp exp) { return walkExpression(exp); } 119 protected Expression walkExitExp(ExitExp exp) { return walkExpression(exp); } 120 protected Expression walkFluidLetExp(FluidLetExp exp) 121 { 122 return walkLetExp(exp); 123 } 124 protected Expression walkLangExp (LangExp exp) 125 { return walkExpression(exp); } 126 127 protected LambdaExp currentLambda = null; 128 129 130 Object exitValue = null; 131 132 public final LambdaExp getCurrentLambda() { return currentLambda; } 133 134 public Expression[] walkExps (Expression[] exps) 135 { 136 return walkExps(exps, exps.length); 137 } 138 139 142 public Expression[] walkExps (Expression[] exps, int n) 143 { 144 String saveFile; 145 int saveLine; 146 int saveColumn; 147 if (messages != null) 148 { 149 saveFile = messages.getFileName(); 150 saveLine = messages.getLineNumber(); 151 saveColumn = messages.getColumnNumber(); 152 } 153 else 154 { 155 saveFile = null; 156 saveLine = 0; 157 saveColumn = 0; 158 } 159 boolean mustRestore = false; 160 for (int i = 0; i < n && exitValue == null; i++) 161 { 162 Expression exp = exps[i]; 163 int line = exp.getLineNumber(); 164 if (messages != null && line > 0) 165 { 166 messages.setLine(exp.getFileName(), line, exp.getColumnNumber()); 167 mustRestore = true; 168 } 169 else if (mustRestore) 170 { 171 messages.setLine(saveFile, saveLine, saveColumn); 172 mustRestore = false; 173 } 174 exps[i] = walk(exp); 175 } 176 if (mustRestore) 177 messages.setLine(saveFile, saveLine, saveColumn); 178 return exps; 179 } 180 181 public void walkDefaultArgs (LambdaExp exp) 182 { 183 if (exp.defaultArgs != null) 184 exp.defaultArgs = walkExps(exp.defaultArgs); 185 } 186 187 public void error(char kind, String message) 188 { 189 if (kind == 'w' && comp.getBooleanOption("warn-as-error", false)) 190 kind = 'e'; 191 if (messages != null) 192 messages.error(kind, message); 193 else 194 new Error ("internal error: "+message); 195 } 196 197 public Expression noteError (String message) 198 { 199 if (messages != null) 200 messages.error('e', message); 201 return new ErrorExp (message); 202 } 203 204 public final String getFileName() { return messages.getFileName(); } 205 public final int getLineNumber() { return messages.getLineNumber(); } 206 public final int getColumnNumber() { return messages.getColumnNumber(); } 207 public String getPublicId() { return messages.getPublicId(); } 208 public String getSystemId() { return messages.getSystemId(); } 209 210 211 public boolean isStableSourceLocation() { return false; } 212 213 public void setFile(String filename) { messages.setFile(filename); } 214 public void setLine(int line) { messages.setLine(line); } 215 public void setColumn(int column) { messages.setColumn(column); } 216 217 public void setLine(String filename, int line, int column) 218 { 219 messages.setLine(filename, line, column); 220 } 221 } 222 | Popular Tags |