示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }