package org.overture.interpreter.utilities.expression; import java.util.List; import java.util.Vector; import org.overture.ast.analysis.AnalysisException; import org.overture.ast.analysis.AnswerAdaptor; import org.overture.ast.expressions.AApplyExp; import org.overture.ast.expressions.ACaseAlternative; import org.overture.ast.expressions.ACasesExp; import org.overture.ast.expressions.AElseIfExp; import org.overture.ast.expressions.AIfExp; import org.overture.ast.expressions.PExp; import org.overture.ast.expressions.SBinaryExp; import org.overture.ast.node.INode; import org.overture.interpreter.assistant.IInterpreterAssistantFactory; /*************************************** * This method collects and returns the subexpressions in a expression. * * @author gkanos ****************************************/ public class SubExpressionsLocator extends AnswerAdaptor<List<PExp>> { protected IInterpreterAssistantFactory af; public SubExpressionsLocator(IInterpreterAssistantFactory af) { this.af = af; } @Override public List<PExp> caseAApplyExp(AApplyExp exp) throws AnalysisException { List<PExp> subs = new Vector<PExp>(); subs.addAll(exp.getRoot().apply(THIS)); subs.add(exp); return subs; } @Override public List<PExp> defaultSBinaryExp(SBinaryExp exp) throws AnalysisException { List<PExp> subs = exp.getLeft().apply(THIS); subs.addAll(exp.getRight().apply(THIS)); subs.add(exp); return subs; } @Override public List<PExp> caseACaseAlternative(ACaseAlternative exp) throws AnalysisException { return exp.getResult().apply(THIS); } @Override public List<PExp> caseACasesExp(ACasesExp exp) throws AnalysisException { List<PExp> subs = exp.getExpression().apply(THIS); for (ACaseAlternative c : exp.getCases()) { subs.addAll(c.apply(THIS)); } if (exp.getOthers() != null) { subs.addAll(exp.getOthers().apply(THIS)); } subs.add(exp); return subs; } @Override public List<PExp> caseAElseIfExp(AElseIfExp exp) throws AnalysisException { List<PExp> subs = exp.getElseIf().apply(THIS); subs.addAll(exp.getThen().apply(THIS)); subs.add(exp); return subs; } @Override public List<PExp> caseAIfExp(AIfExp exp) throws AnalysisException { List<PExp> subs = exp.getTest().apply(THIS); subs.addAll(exp.getThen().apply(THIS)); for (AElseIfExp elif : exp.getElseList()) { subs.addAll(elif.apply(THIS)); } if (exp.getElse() != null) { subs.addAll(exp.getElse().apply(THIS)); } subs.add(exp); return subs; } @Override public List<PExp> defaultPExp(PExp exp) throws AnalysisException { List<PExp> subs = new Vector<PExp>(); subs.add(exp); return subs; } @Override public List<PExp> createNewReturnValue(INode node) throws AnalysisException { // TODO Auto-generated method stub return null; } @Override public List<PExp> createNewReturnValue(Object node) throws AnalysisException { // TODO Auto-generated method stub return null; } }