From 5c8439c0e6a7111667373c9bc448fed6254c0edc Mon Sep 17 00:00:00 2001 From: Dave Parker Date: Wed, 17 Jun 2015 20:41:22 +0000 Subject: [PATCH] Convert ExpressionQuant from interface to abstract class and push some shared code in ExpressionProb/Reward/SS into it. git-svn-id: https://www.prismmodelchecker.org/svn/prism/prism/trunk@10031 bbc10eb1-c90d-0410-af57-cb519fbb1720 --- prism/src/parser/ast/ExpressionProb.java | 108 +++++++-------------- prism/src/parser/ast/ExpressionQuant.java | 107 ++++++++++++++++++-- prism/src/parser/ast/ExpressionReward.java | 101 +++++++------------ prism/src/parser/ast/ExpressionSS.java | 92 ++++++------------ 4 files changed, 196 insertions(+), 212 deletions(-) diff --git a/prism/src/parser/ast/ExpressionProb.java b/prism/src/parser/ast/ExpressionProb.java index b3f9782a..203148e5 100644 --- a/prism/src/parser/ast/ExpressionProb.java +++ b/prism/src/parser/ast/ExpressionProb.java @@ -33,75 +33,39 @@ import prism.OpRelOpBound; import prism.PrismException; import prism.PrismLangException; -public class ExpressionProb extends Expression implements ExpressionQuant +public class ExpressionProb extends ExpressionQuant { - RelOp relOp = null; - Expression prob = null; - Expression expression = null; - // Note: this "old-style" filter is just for display purposes - // The parser creates an (invisible) new-style filter around this expression - Filter filter = null; - // Constructors public ExpressionProb() { } - public ExpressionProb(Expression e, String r, Expression p) + public ExpressionProb(Expression expression, String relOpString, Expression p) { - expression = e; - relOp = RelOp.parseSymbol(r); - prob = p; + setExpression(expression); + setRelOp(relOpString); + setBound(p); } // Set methods - public void setRelOp(RelOp relOp) - { - this.relOp = relOp; - } - - public void setRelOp(String r) - { - relOp = RelOp.parseSymbol(r); - } - + /** + * Set the probability bound. Equivalent to {@code setBound(p)}. + */ public void setProb(Expression p) { - prob = p; - } - - public void setExpression(Expression e) - { - expression = e; - } - - public void setFilter(Filter f) - { - filter = f; + setBound(p); } // Get methods - public RelOp getRelOp() - { - return relOp; - } - + /** + * Get the probability bound. Equivalent to {@code getBound()}. + */ public Expression getProb() { - return prob; - } - - public Expression getExpression() - { - return expression; - } - - public Filter getFilter() - { - return filter; + return getBound(); } /** @@ -110,25 +74,21 @@ public class ExpressionProb extends Expression implements ExpressionQuant public String getTypeOfPOperator() { String s = ""; - s += "P" + relOp; - s += (prob == null) ? "?" : "p"; + s += "P" + getRelOp(); + s += (getBound() == null) ? "?" : "p"; return s; } - /** - * Get info about the operator and bound. - * Does some checks, e.g., throws an exception if probability is out of range. - * @param constantValues Values for constants in order to evaluate any bound - */ + @Override public OpRelOpBound getRelopBoundInfo(Values constantValues) throws PrismException { - if (prob != null) { - double bound = prob.evaluateDouble(constantValues); - if (bound < 0 || bound > 1) - throw new PrismException("Invalid probability bound " + bound + " in P operator"); - return new OpRelOpBound("P", relOp, bound); + if (getBound() != null) { + double boundVal = getBound().evaluateDouble(constantValues); + if (boundVal < 0 || boundVal > 1) + throw new PrismException("Invalid probability bound " + boundVal + " in P operator"); + return new OpRelOpBound("P", getRelOp(), boundVal); } else { - return new OpRelOpBound("P", relOp, null); + return new OpRelOpBound("P", getRelOp(), null); } } @@ -162,11 +122,11 @@ public class ExpressionProb extends Expression implements ExpressionQuant */ public String getResultName() { - if (prob != null) + if (getBound() != null) return "Result"; - else if (relOp == RelOp.MIN) + else if (getRelOp() == RelOp.MIN) return "Minimum probability"; - else if (relOp == RelOp.MAX) + else if (getRelOp() == RelOp.MAX) return "Maximum probability"; else return "Probability"; @@ -195,11 +155,11 @@ public class ExpressionProb extends Expression implements ExpressionQuant { String s = ""; - s += "P" + relOp; - s += (prob == null) ? "?" : prob.toString(); - s += " [ " + expression; - if (filter != null) - s += " " + filter; + s += "P" + getRelOp(); + s += (getBound() == null) ? "?" : getBound().toString(); + s += " [ " + getExpression(); + if (getFilter() != null) + s += " " + getFilter(); s += " ]"; return s; @@ -211,10 +171,10 @@ public class ExpressionProb extends Expression implements ExpressionQuant public Expression deepCopy() { ExpressionProb expr = new ExpressionProb(); - expr.setExpression(expression == null ? null : expression.deepCopy()); - expr.setRelOp(relOp); - expr.setProb(prob == null ? null : prob.deepCopy()); - expr.setFilter(filter == null ? null : (Filter)filter.deepCopy()); + expr.setExpression(getExpression() == null ? null : getExpression().deepCopy()); + expr.setRelOp(getRelOp()); + expr.setBound(getBound() == null ? null : getBound().deepCopy()); + expr.setFilter(getFilter() == null ? null : (Filter)getFilter().deepCopy()); expr.setType(type); expr.setPosition(this); return expr; diff --git a/prism/src/parser/ast/ExpressionQuant.java b/prism/src/parser/ast/ExpressionQuant.java index 7b7364ae..a32edca2 100644 --- a/prism/src/parser/ast/ExpressionQuant.java +++ b/prism/src/parser/ast/ExpressionQuant.java @@ -31,14 +31,109 @@ import prism.OpRelOpBound; import prism.PrismException; /** - * Interface containing (some) common features of "quantitative" operators (P,R,S), - * i.e., classes ExpressionProb, ExpressionReward, ExpressionSS + * Abstract class for representing "quantitative" operators (P,R,S), + * i.e., a superclass of ExpressionProb, ExpressionReward, ExpressionSS. */ -public interface ExpressionQuant +public abstract class ExpressionQuant extends Expression { - public RelOp getRelOp(); - public Expression getExpression(); - public OpRelOpBound getRelopBoundInfo(Values constantValues) throws PrismException; + /** The attached relational operator (e.g. "<" in "P<0.1"). */ + protected RelOp relOp = null; + /** The attached (probability/reward) bound, as an expression (e.g. "p" in "P=". + */ + public void setRelOp(String relOpString) + { + relOp = RelOp.parseSymbol(relOpString); + } + + /** + * Set the attached bound, as an expression (e.g. "p" in "P 1) - throw new PrismException("Invalid probability bound " + bound + " in P operator"); - return new OpRelOpBound("S", relOp, bound); + if (getBound() != null) { + double boundValue = getBound().evaluateDouble(constantValues); + if (boundValue < 0 || boundValue > 1) + throw new PrismException("Invalid probability bound " + boundValue + " in P operator"); + return new OpRelOpBound("S", getRelOp(), boundValue); } else { - return new OpRelOpBound("S", relOp, null); + return new OpRelOpBound("S", getRelOp(), null); } } @@ -151,7 +115,7 @@ public class ExpressionSS extends Expression implements ExpressionQuant */ public String getResultName() { - return (prob == null) ? "Probability" : "Result"; + return (getBound() == null) ? "Probability" : "Result"; } @Override @@ -177,10 +141,10 @@ public class ExpressionSS extends Expression implements ExpressionQuant { String s = ""; - s += "S" + relOp; - s += (prob==null) ? "?" : prob.toString(); - s += " [ " + expression; - if (filter != null) s += " "+filter; + s += "S" + getRelOp(); + s += (getBound()==null) ? "?" : getBound().toString(); + s += " [ " + getExpression(); + if (getFilter() != null) s += " "+getFilter(); s += " ]"; return s; @@ -192,10 +156,10 @@ public class ExpressionSS extends Expression implements ExpressionQuant public Expression deepCopy() { ExpressionSS expr = new ExpressionSS(); - expr.setExpression(expression == null ? null : expression.deepCopy()); - expr.setRelOp(relOp); - expr.setProb(prob == null ? null : prob.deepCopy()); - expr.setFilter(filter == null ? null : (Filter)filter.deepCopy()); + expr.setExpression(getExpression() == null ? null : getExpression().deepCopy()); + expr.setRelOp(getRelOp()); + expr.setBound(getBound() == null ? null : getBound().deepCopy()); + expr.setFilter(getFilter() == null ? null : (Filter)getFilter().deepCopy()); expr.setType(type); expr.setPosition(this); return expr;