GenericSimplification.java
package dev.civl.sarl.simplify.simplification;
import dev.civl.sarl.IF.expr.SymbolicExpression;
import dev.civl.sarl.IF.expr.SymbolicExpression.SymbolicOperator;
import dev.civl.sarl.IF.object.SymbolicObject;
import dev.civl.sarl.IF.object.SymbolicObject.SymbolicObjectKind;
import dev.civl.sarl.IF.type.SymbolicType;
import dev.civl.sarl.preuniverse.IF.PreUniverse;
public class GenericSimplification extends Simplification {
/**
* <p>
* This method simplifies an expression in a generic way that should work
* correctly on any symbolic expression: it simplifies the type and the
* arguments of the expression, and then rebuilds the expression using
* method
* {@link PreUniverse#make(SymbolicOperator, SymbolicType, SymbolicObject[])}
* .
* </p>
*
* <p>
* This method does <strong>not</strong> look in the table of cached
* simplification results for <code>expression</code>. However, the
* recursive calls to the arguments may look in the cache.
* </p>
*
* <p>
* You will probably want to use this method in your implementation of
* {@link #simplifyExpressionWork(SymbolicExpression)}.
* </p>
*
* @param expression
* any non-<code>null</code> symbolic expression
* @return a simplified version of that expression
*/
@Override
protected SymbolicExpression apply(SymbolicExpression expression) {
if (expression.isNull())
return expression;
SymbolicOperator operator = expression.operator();
if (operator == SymbolicOperator.CONCRETE) {
SymbolicObject object = (SymbolicObject) expression.argument(0);
SymbolicObjectKind kind = object.symbolicObjectKind();
switch (kind) {
case BOOLEAN :
case INT :
case NUMBER :
case STRING :
return expression;
default :
}
}
SymbolicType type = expression.type();
SymbolicType simplifiedType = (SymbolicType) simplify(type);
int numArgs = expression.numArguments();
SymbolicObject[] simplifiedArgs = null;
if (type == simplifiedType) {
for (int i = 0; i < numArgs; i++) {
SymbolicObject arg = expression.argument(i);
SymbolicObject simplifiedArg = simplify(arg);
assert simplifiedArg != null;
if (simplifiedArg != arg) {
simplifiedArgs = new SymbolicObject[numArgs];
for (int j = 0; j < i; j++)
simplifiedArgs[j] = expression.argument(j);
simplifiedArgs[i] = simplifiedArg;
for (int j = i + 1; j < numArgs; j++)
simplifiedArgs[j] = simplify(expression.argument(j));
break;
}
}
} else {
simplifiedArgs = new SymbolicObject[numArgs];
for (int i = 0; i < numArgs; i++)
simplifiedArgs[i] = simplify(expression.argument(i));
}
if (simplifiedArgs == null)
return expression;
return universe.make(operator, simplifiedType, simplifiedArgs);
}
}