diff --git a/prism/src/parser/type/Type.java b/prism/src/parser/type/Type.java index 53158ba3..bf5227fe 100644 --- a/prism/src/parser/type/Type.java +++ b/prism/src/parser/type/Type.java @@ -26,6 +26,7 @@ package parser.type; +import param.BigRational; import prism.PrismLangException; public abstract class Type @@ -64,7 +65,21 @@ public abstract class Type // Play safe: assume error unless explicitly overridden. throw new PrismLangException("Cannot cast a value to type " + getTypeString()); } - + + /** + * Cast a BigRational value to the Java data type (Boolean, Integer, Double, ...) + * corresponding to this type. + *
+ * For boolean and integer, this throws an exception if the value can not be + * precisely represented by the Java data type; for double, loss of precision + * is expected and does not raise an exception. + */ + public Object castFromBigRational(BigRational value) throws PrismLangException + { + // Play safe: assume error unless explicitly overridden. + throw new PrismLangException("Cannot cast rational number to type " + getTypeString()); + } + @Override public String toString() { diff --git a/prism/src/parser/type/TypeBool.java b/prism/src/parser/type/TypeBool.java index 1b6aa4fd..5c307b6d 100644 --- a/prism/src/parser/type/TypeBool.java +++ b/prism/src/parser/type/TypeBool.java @@ -26,6 +26,7 @@ package parser.type; +import param.BigRational; import prism.PrismLangException; public class TypeBool extends Type @@ -77,4 +78,11 @@ public class TypeBool extends Type else throw new PrismLangException("Can't convert " + value.getClass() + " to type " + getTypeString()); } + + @Override + public Object castFromBigRational(BigRational value) throws PrismLangException + { + return value.toBoolean(); + } + } diff --git a/prism/src/parser/type/TypeDouble.java b/prism/src/parser/type/TypeDouble.java index 9c775cda..0238d551 100644 --- a/prism/src/parser/type/TypeDouble.java +++ b/prism/src/parser/type/TypeDouble.java @@ -82,4 +82,11 @@ public class TypeDouble extends Type else throw new PrismLangException("Can't convert " + value.getClass() + " to type " + getTypeString()); } + + @Override + public Object castFromBigRational(BigRational value) throws PrismLangException + { + return value.doubleValue(); + } + } diff --git a/prism/src/parser/type/TypeInt.java b/prism/src/parser/type/TypeInt.java index 14b47ea7..02548ca3 100644 --- a/prism/src/parser/type/TypeInt.java +++ b/prism/src/parser/type/TypeInt.java @@ -26,6 +26,7 @@ package parser.type; +import param.BigRational; import prism.PrismLangException; public class TypeInt extends Type @@ -77,4 +78,11 @@ public class TypeInt extends Type else throw new PrismLangException("Can't convert " + value.getClass() + " to type " + getTypeString()); } + + @Override + public Object castFromBigRational(BigRational value) throws PrismLangException + { + return value.toInt(); + } + }