ExpressionVisitor.java
package edu.udel.cis.vsl.sarl.reason.common;
import edu.udel.cis.vsl.sarl.IF.expr.SymbolicExpression;
import edu.udel.cis.vsl.sarl.IF.object.SymbolicObject;
import edu.udel.cis.vsl.sarl.IF.object.SymbolicObject.SymbolicObjectKind;
import edu.udel.cis.vsl.sarl.preuniverse.IF.PreUniverse;
/**
* This class visits all child expressions of the given expression in a
* Depth-first order. For each visited expression e,
* {@link StatelessSimplificationAction} will be performed before and after e's
* children being visited.
*
* @author ziqing
*
*/
abstract class ExpressionVisitor {
/**
* A reference to a {@link PreUniverse}.
*/
protected PreUniverse universe;
ExpressionVisitor(PreUniverse universe) {
this.universe = universe;
}
/**
* Visit the expression in a Depth-first order and performing
* {@link StatelessSimplificationAction}s on them.
*
* @param expr
* @param action
* @return
*/
abstract SymbolicExpression visitExpression(SymbolicExpression expr);
protected SymbolicExpression visitExpressionChildren(
SymbolicExpression expr) {
boolean changed = false;
int numArgs = expr.numArguments();
SymbolicObject newArgs[] = new SymbolicObject[numArgs];
for (int i = 0; i < numArgs; i++) {
SymbolicObject arg = expr.argument(i);
if (arg.symbolicObjectKind() == SymbolicObjectKind.EXPRESSION) {
newArgs[i] = visitExpression((SymbolicExpression) arg);
if (newArgs[i] != arg)
changed = true;
} else
newArgs[i] = arg;
}
if (changed)
return universe.make(expr.operator(), expr.type(), newArgs);
else
return expr;
}
}