KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > gnu > expr > ExpWalker


1 package gnu.expr;
2 import gnu.text.SourceMessages;
3
4 /** Class for doing a tree-walk over an Expression tree. */
5
6 public class ExpWalker
7   implements gnu.text.SourceLocator
8 {
9   protected SourceMessages messages;
10   Compilation comp;
11
12   /** Get the Compilation associated with this walker. */
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   /** Call the walk method of argument Expression.
30    * Could call Expression's walk directly, but this allows us to
31    * interpose a method call on each Expression. We use it to note the
32    * Expression's line number. Should not need to be overridden;
33    * if you do, you may also want to override walkExps. */

34   public Expression walk(Expression exp)
35   {
36     int line = exp.getLineNumber();
37     if (messages != null && line > 0)
38       {
39     String JavaDoc 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 the Declarations's value was that of our new_value,
98
// and we modified/simplified the latter, update the former as well.
99
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 walkSwitchExp (SwitchExp exp) { return walkExpression(exp); }
109
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   /** If exitValue is set to non-null, the walk stops. */
130   Object JavaDoc 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   /** Call walk on the Expressions in an array.
140    * However, the walk method is inlined for speed.
141    */

142   public Expression[] walkExps (Expression[] exps, int n)
143   {
144     String JavaDoc 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 JavaDoc 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 JavaDoc("internal error: "+message);
195   }
196
197   public Expression noteError (String JavaDoc message)
198   {
199     if (messages != null)
200       messages.error('e', message);
201     return new ErrorExp (message);
202   }
203
204   public final String JavaDoc getFileName() { return messages.getFileName(); }
205   public final int getLineNumber() { return messages.getLineNumber(); }
206   public final int getColumnNumber() { return messages.getColumnNumber(); }
207   public String JavaDoc getPublicId() { return messages.getPublicId(); }
208   public String JavaDoc getSystemId() { return messages.getSystemId(); }
209   /** Normally same as getSystemId. */
210
211   public boolean isStableSourceLocation() { return false; }
212
213   public void setFile(String JavaDoc 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 JavaDoc filename, int line, int column)
218   {
219     messages.setLine(filename, line, column);
220   }
221 }
222
Popular Tags