package de.gaalop.gapp.importing; import de.gaalop.dfg.Addition; import de.gaalop.dfg.BaseVector; import de.gaalop.dfg.Division; import de.gaalop.dfg.Equality; import de.gaalop.dfg.Exponentiation; import de.gaalop.dfg.Expression; import de.gaalop.dfg.ExpressionVisitor; import de.gaalop.dfg.FloatConstant; import de.gaalop.dfg.FunctionArgument; import de.gaalop.dfg.Inequality; import de.gaalop.dfg.InnerProduct; import de.gaalop.dfg.LogicalAnd; import de.gaalop.dfg.LogicalNegation; import de.gaalop.dfg.LogicalOr; import de.gaalop.dfg.MacroCall; import de.gaalop.dfg.MathFunctionCall; import de.gaalop.dfg.Multiplication; import de.gaalop.dfg.MultivectorComponent; import de.gaalop.dfg.Negation; import de.gaalop.dfg.OuterProduct; import de.gaalop.dfg.Relation; import de.gaalop.dfg.Reverse; import de.gaalop.dfg.Subtraction; import de.gaalop.dfg.Variable; import de.gaalop.gapp.importing.parallelObjects.Product; import de.gaalop.gapp.importing.parallelObjects.ParallelObject; /** * Implements a ExpressionVisitor that finds the direct factors of a given expression * @author Christian Steinmetz */ public class FactorsGetter implements ExpressionVisitor { private Product factors = new Product(); private FactorsGetter() { //Make usage of static getFactors method mandatory } /** * Returns the direct factors of a given expression * @param expression The expression * @return The direct factors */ public static Product getFactors(Expression expresssion) { FactorsGetter getter = new FactorsGetter(); expresssion.accept(getter); return getter.factors; } /** * Calls the ExpressionCollector which creates a ParallelObject * @param expression The expression applied on the ExpressionCollector * @return The ParallelObject representation of the expression */ private ParallelObject callExpressionCollector(Expression expression) { ExpressionCollector collector = new ExpressionCollector(); expression.accept(collector); return collector.getResultValue(); } @Override public void visit(Subtraction node) { factors.getFactors().add(callExpressionCollector(node)); } @Override public void visit(Addition node) { factors.getFactors().add(callExpressionCollector(node)); } @Override public void visit(Division node) { factors.getFactors().add(callExpressionCollector(node)); } @Override public void visit(Multiplication node) { node.getLeft().accept(this); node.getRight().accept(this); } @Override public void visit(MathFunctionCall node) { factors.getFactors().add(callExpressionCollector(node)); } @Override public void visit(MultivectorComponent node) { factors.getFactors().add(callExpressionCollector(node)); } @Override public void visit(Exponentiation node) { factors.getFactors().add(callExpressionCollector(node)); } @Override public void visit(FloatConstant node) { factors.getFactors().add(callExpressionCollector(node)); } @Override public void visit(Negation node) { factors.getFactors().add(callExpressionCollector(node)); } @Override public void visit(Variable node) { factors.getFactors().add(callExpressionCollector(node)); } // ============================ Logical methods ============================ @Override public void visit(LogicalOr node) { factors.getFactors().add(callExpressionCollector(node)); } @Override public void visit(LogicalAnd node) { factors.getFactors().add(callExpressionCollector(node)); } @Override public void visit(LogicalNegation node) { factors.getFactors().add(callExpressionCollector(node)); } @Override public void visit(Equality node) { factors.getFactors().add(callExpressionCollector(node)); } @Override public void visit(Inequality node) { factors.getFactors().add(callExpressionCollector(node)); } @Override public void visit(Relation relation) { factors.getFactors().add(callExpressionCollector(relation)); } // ========================= Illegal visit methods ========================= @Override public void visit(InnerProduct node) { throw new IllegalStateException("InnerProducts should have been removed by TBA."); } @Override public void visit(OuterProduct node) { throw new IllegalStateException("OuterProducts should have been removed by TBA."); } @Override public void visit(BaseVector node) { throw new IllegalStateException("BaseVectors should have been removed by TBA."); } @Override public void visit(Reverse node) { throw new IllegalStateException("Reverses should have been removed by TBA."); } @Override public void visit(FunctionArgument node) { throw new IllegalStateException("FunctionArguments should have been removed by CLUCalc Parser."); } @Override public void visit(MacroCall node) { throw new IllegalStateException("FunctionArguments should have been removed by CLUCalc Parser."); } }