package parser.visitor; import java.util.ArrayList; import parser.ast.AccumulationSymbol; import parser.ast.Expression; import parser.ast.ExpressionAccumulation; import parser.ast.ExpressionBinaryOp; import parser.ast.ExpressionLabel; import parser.ast.ExpressionTemporal; import parser.ast.ExpressionUnaryOp; import prism.PrismLangException; public class ReplaceAccumulationExpression extends ASTTraverseModify { private ExpressionAccumulation accexp; private ArrayList initLabels; private ArrayList runLabels; private ArrayList goalLabels; private int accLength; public ReplaceAccumulationExpression(ExpressionAccumulation accexp, ArrayList initLabels, ArrayList runLabels, ArrayList goalLabels, int accLength) { super(); this.accexp = accexp; this.initLabels = initLabels; this.runLabels = runLabels; this.goalLabels = goalLabels; this.accLength = accLength; } public Object visit(ExpressionAccumulation expr) throws PrismLangException { if (expr == accexp) { AccumulationSymbol sym = expr.getSymbol(); if (sym.isMinus()) { throw(new PrismLangException("Accumulation with past is not supported.")); } // This expression is of the form OR{0..(l-1)}(init_i AND (run_i UNTIL goal_i)) // Build all the subexpressions... ArrayList clauses = new ArrayList<>(); Expression result = null; for(int i=0; i