/// <remarks>Compare <see cref="InterpretNumbers"/>. </remarks>
        private IEnumerable <IFormulaToken> CompleteNumbers(IEnumerable <IFormulaToken> tokens)
        {
            var numberTokens      = new List <IFormulaToken>();
            var decimalSeparators = 0;

            foreach (var token in tokens.WithContext().Select(context => context[1]))
            {
                // append digit
                if (token is FormulaNodeNumber)
                {
                    numberTokens.Add(token);
                    continue;
                }

                // append decimal separator
                if (token is FormulaTokenDecimalSeparator)
                {
                    if (decimalSeparators == 0)
                    {
                        numberTokens.Add(token);
                        decimalSeparators++;
                        continue;
                    }
                    decimalSeparators++;
                }

                // create common token of value
                if (numberTokens.Count != 0)
                {
                    IFormulaToken commonToken;
                    if (numberTokens.Count == 1)
                    {
                        if (decimalSeparators != 0)
                        {
                            yield break;
                        }
                        commonToken = numberTokens[0];
                    }
                    else
                    {
                        commonToken = FormulaTreeFactory.CreateNumberNode(default(double));
                        SetOrigin(commonToken, GetOrigin(numberTokens));
                    }
                    yield return(commonToken);

                    if (decimalSeparators > 1)
                    {
                        yield break;
                    }
                    numberTokens.Clear();
                    decimalSeparators = 0;
                }

                // yield any non-number token
                yield return(token);
            }
        }
 private IFormulaOperator InterpretMinusToken(IFormulaToken previousToken, FormulaNodeSubtract minusToken)
 {
     // change from subtract to negative sign token
     if (previousToken == null || previousToken is IFormulaOperator || previousToken is FormulaTokenParameterSeparator)
     {
         var negativeSignToken = FormulaTreeFactory.CreateNegativeSignNode(null);
         SetOrigin(negativeSignToken, minusToken);
         return(negativeSignToken);
     }
     return(minusToken);
 }
 private IFormulaTree ConvertVariableNode(XmlFormulaTree node)
 {
     if (node.VariableValue != null)
     {
         UserVariable variable;
         if (_localVariables.TryGetValue(node.VariableValue, out variable))
         {
             return(FormulaTreeFactory.CreateLocalVariableNode(variable));
         }
         if (_globalVariables.TryGetValue(node.VariableValue, out variable))
         {
             return(FormulaTreeFactory.CreateGlobalVariableNode(variable));
         }
     }
     Debug.Assert(false, "Invalid project");
     return(null);
 }
        public IFormulaTree Convert(XmlFormulaTree formula)
        {
            if (formula == null)
            {
                return(null);
            }

            if (formula.VariableType == "NUMBER")
            {
                return(FormulaTreeFactory.CreateNumberNode(double.Parse(formula.VariableValue, CultureInfo.InvariantCulture)));
            }
            if (formula.VariableType == "OPERATOR")
            {
                return(ConvertOperatorNode(formula));
            }
            if (formula.VariableType == "FUNCTION")
            {
                return(ConvertFunctionNode(formula));
            }
            if (formula.VariableType == "SENSOR")
            {
                return(ConvertSensorOrPropertiesNode(formula));
            }
            if (formula.VariableType == "USER_VARIABLE")
            {
                return(ConvertVariableNode(formula));
            }
            if (formula.VariableType == "BRACKET")
            {
                return(ConvertParenthesesNode(formula));
            }

            if (String.IsNullOrEmpty(formula.VariableType))
            {
                return(null);
            }
            Debugger.Break();
            throw new NotImplementedException();
        }
 public static FormulaNodeGreaterEqual CreateGreaterEqualToken()
 {
     return(FormulaTreeFactory.CreateGreaterEqualNode(null, null));
 }
 public static FormulaNodeLess CreateLessToken()
 {
     return(FormulaTreeFactory.CreateLessNode(null, null));
 }
 public static FormulaNodePower CreateCaretToken()
 {
     return(FormulaTreeFactory.CreatePowerNode(null, null));
 }
 public static FormulaNodeMultiply CreateMultiplyToken()
 {
     return(FormulaTreeFactory.CreateMultiplyNode(null, null));
 }
 public static FormulaNodeGlobalVariable CreateGlobalVariableToken(GlobalVariable variable)
 {
     return(FormulaTreeFactory.CreateGlobalVariableNode(variable));
 }
 public static FormulaNodeSize CreateSizeToken()
 {
     return(FormulaTreeFactory.CreateSizeNode());
 }
 public static FormulaNodeRandom CreateRandomToken()
 {
     return(FormulaTreeFactory.CreateRandomNode(null, null));
 }
 public static FormulaNodeAbs CreateAbsToken()
 {
     return(FormulaTreeFactory.CreateAbsNode(null));
 }
 public static FormulaNodeSqrt CreateSqrtToken()
 {
     return(FormulaTreeFactory.CreateSqrtNode(null));
 }
 public static FormulaNodeArctan CreateArctanToken()
 {
     return(FormulaTreeFactory.CreateArctanNode(null));
 }
 public static FormulaNodePi CreatePiToken()
 {
     return(FormulaTreeFactory.CreatePiNode());
 }
 public static FormulaNodeFalse CreateFalseToken()
 {
     return(FormulaTreeFactory.CreateFalseNode());
 }
 public static FormulaNodeRotation CreateRotationToken()
 {
     return(FormulaTreeFactory.CreateRotationNode());
 }
 public static FormulaNodeTrue CreateTrueToken()
 {
     return(FormulaTreeFactory.CreateTrueNode());
 }
 public static FormulaNodeTransparency CreateTransparencyToken()
 {
     return(FormulaTreeFactory.CreateTransparencyNode());
 }
 public static FormulaNodeAccelerationZ CreateAccelerationZToken()
 {
     return(FormulaTreeFactory.CreateAccelerationZNode());
 }
 public static FormulaNodeSubtract CreateMinusToken()
 {
     return(FormulaTreeFactory.CreateSubtractNode(null, null));
 }
 public static FormulaNodeCompass CreateCompassToken()
 {
     return(FormulaTreeFactory.CreateCompassNode());
 }
 public static FormulaNodeDivide CreateDivideToken()
 {
     return(FormulaTreeFactory.CreateDivideNode(null, null));
 }
 public static FormulaNodeInclinationX CreateInclinationXToken()
 {
     return(FormulaTreeFactory.CreateInclinationXNode());
 }
 public static FormulaNodeNotEquals CreateNotEqualsToken()
 {
     return(FormulaTreeFactory.CreateNotEqualsNode(null, null));
 }
 public static FormulaNodeBrightness CreateBrightnessToken()
 {
     return(FormulaTreeFactory.CreateBrightnessNode());
 }
 public static FormulaNodeNumber CreateDigitToken(int value)
 {
     return(FormulaTreeFactory.CreateNumberNode(value));
 }
 public static FormulaNodeLayer CreateLayerToken()
 {
     return(FormulaTreeFactory.CreateLayerNode());
 }
 public static FormulaNodeAnd CreateAndToken()
 {
     return(FormulaTreeFactory.CreateAndNode(null, null));
 }
 public static FormulaNodePositionY CreatePositionYToken()
 {
     return(FormulaTreeFactory.CreatePositionYNode());
 }