ISemantic HandleSingleMathOp(OperatorBasedExpression x, ISemantic l, ISemantic r, MathOp2 m, bool UnorderedCheck = true) { if (l == null || r == null) { return(null); } var pl = l as PrimitiveValue; var pr = r as PrimitiveValue; //TODO: imaginary/complex parts if (pl != null && pr != null) { if (UnorderedCheck && (pl.IsNaN || pr.IsNaN)) { return(PrimitiveValue.CreateNaNValue(x, pl.IsNaN ? pl.BaseTypeToken : pr.BaseTypeToken)); } return(m(pl, pr, x)); } throw new NotImplementedException("Operator overloading not implemented yet."); }
bool EnsureIntegralType(IExpression x,PrimitiveValue v) { if (!DTokens.BasicTypes_Integral[v.BaseTypeToken]){ EvalError(x,"Literal must be of integral type",new[]{(ISemantic)v}); return false; } return true; }
static PrimitiveValue mult(PrimitiveValue a, PrimitiveValue b, OperatorBasedExpression x) { decimal v = 0; decimal im=0; switch (x.OperatorToken) { case DTokens.Pow: v = (decimal)Math.Pow((double)a.Value, (double)b.Value); v = (decimal)Math.Pow((double)a.ImaginaryPart, (double)b.ImaginaryPart); break; case DTokens.Times: v= a.Value * b.Value; im=a.ImaginaryPart * b.ImaginaryPart; break; case DTokens.Div: if ((a.Value!=0 && b.Value == 0) || (a.ImaginaryPart!=0 && b.ImaginaryPart==0)) throw new DivideByZeroException(); if(b.Value!=0) v= a.Value / b.Value; if(b.ImaginaryPart!=0) im=a.ImaginaryPart / b.ImaginaryPart; break; case DTokens.Mod: if ((a.Value!=0 && b.Value == 0) || (a.ImaginaryPart!=0 && b.ImaginaryPart==0)) throw new DivideByZeroException(); if(b.Value!=0) v= a.Value % b.Value; if(b.ImaginaryPart!=0) im=a.ImaginaryPart % b.ImaginaryPart; break; default: return null; //EvalError(x, "Invalid token for multiplication expression (*,/,% only)"); } return new PrimitiveValue(a.BaseTypeToken, v, x, im); }