/// <summary> /// Sorts expression /// </summary> /// <returns></returns> public override Expr Parse(object context) { var constExp = context as ConstantExpr; var ctx = _parser.Context; var t = _tokenIt.Advance(); var lobj = (LObject)constExp.Value; // Validate. if (lobj.Type != LTypes.Number) { throw _tokenIt.BuildSyntaxException("number required when using units : " + t.Token.Text, t); } var lval = ((LNumber)lobj).Value; var result = ctx.Units.ConvertToUnits(lval, t.Token.Text); var lclass = LangTypeHelper.ConvertToLangUnit(result); var finalExp = Exprs.Const(lclass, t); // Move past the plugin. _tokenIt.Advance(); return(finalExp); }
/// <summary> /// Evaluates a math expression of 2 units. /// </summary> /// <param name="node">The AST node the evaluation is a part of.</param> /// <param name="left">The unit on the left</param> /// <param name="right">The unit on the right</param> /// <param name="op">The math operator</param> /// <param name="units"></param> /// <returns></returns> public static LObject CalcUnits(AstNode node, LUnit left, LUnit right, Operator op, Units units) { double baseUnitsValue = 0; if (op == Operator.Multiply) { baseUnitsValue = left.BaseValue * right.BaseValue; } else if (op == Operator.Divide) { baseUnitsValue = left.BaseValue / right.BaseValue; } else if (op == Operator.Add) { baseUnitsValue = left.BaseValue + right.BaseValue; } else if (op == Operator.Subtract) { baseUnitsValue = left.BaseValue - right.BaseValue; } else if (op == Operator.Modulus) { baseUnitsValue = left.BaseValue % right.BaseValue; } var relativeValue = units.ConvertToRelativeValue(baseUnitsValue, left.SubGroup, null); var result = new LUnit(relativeValue); result.BaseValue = baseUnitsValue; result.Group = left.Group; result.SubGroup = left.SubGroup; //result.Value = relativeValue; var lclass = LangTypeHelper.ConvertToLangUnit(result); return(lclass); }