Ejemplo n.º 1
0
        /// <summary>
        /// Read variable
        /// </summary>
        public static bool TryProceedSimpleVariable(List <BaseFormulaNode> nodes, ReadOnlySpan <char> formula, ref int index)
        {
            // Read unary minus
            var localIndex = UnaryMinusReader.ReadUnaryMinus(nodes, formula, index, out var isNegativeLocal);

            var numberBuilder = new IndexWatcher();

            for (int i = localIndex; i < formula.Length; i++)
            {
                var ch         = formula[i];
                var isLastChar = i + 1 == formula.Length;

                if (ch.IsSimpleVariable())
                {
                    numberBuilder.Remember(i);

                    if (isLastChar && TryAddSimpleVariable(nodes, formula, numberBuilder, isNegativeLocal))
                    {
                        index = i;
                        return(true);
                    }
                }
                else if (TryAddSimpleVariable(nodes, formula, numberBuilder, isNegativeLocal))
                {
                    index = i - 1;
                    return(true);
                }
                else
                {
                    break;
                }
            }

            return(false);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Read word
        /// </summary>
        public static bool TryProceedWord(List <BaseFormulaNode> nodes, ReadOnlySpan <char> formula, ref int index)
        {
            // Read unary minus
            var localIndex = UnaryMinusReader.ReadUnaryMinus(nodes, formula, index, out _);

            // Check out of range
            if (localIndex >= formula.Length)
            {
                return(false);
            }

            // Read word
            if (!_quotes.Contains(formula[localIndex]))
            {
                return(false);
            }

            // Skip start char
            localIndex++;

            var variableBuilder = new IndexWatcher();

            for (int i = localIndex; i < formula.Length; i++)
            {
                var ch = formula[i];

                if (_quotes.Contains(ch))
                {
                    var wordSpan = formula.Slice(variableBuilder.StartIndex.GetValueOrDefault(), variableBuilder.Length);
                    var word     = wordSpan.ToString();

                    var varNode = new WordNode(word);
                    nodes.Add(varNode);

                    index = i;
                    return(true);
                }

                variableBuilder.Remember(i);
            }

            return(false);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Read variable
        /// </summary>
        public static bool TryProceedBorderedVariable(List <BaseFormulaNode> nodes, ReadOnlySpan <char> formula, ref int index)
        {
            // Read unary minus
            var localIndex = UnaryMinusReader.ReadUnaryMinus(nodes, formula, index, out var isNegativeLocal);

            // Check out of range
            if (localIndex >= formula.Length)
            {
                return(false);
            }

            // Read variable
            if (formula[localIndex] != START_CHAR)
            {
                return(false);
            }

            // Skip start char
            localIndex++;

            var variableBuilder = new IndexWatcher();

            for (int i = localIndex; i < formula.Length; i++)
            {
                var ch = formula[i];

                if (ch == END_CHAR)
                {
                    var variableSpan = formula.Slice(variableBuilder.StartIndex.GetValueOrDefault(), variableBuilder.Length);
                    var variableName = variableSpan.ToString();
                    AddFormulaNode(nodes, variableName, isNegativeLocal);

                    index = i;
                    return(true);
                }

                variableBuilder.Remember(i);
            }

            return(false);
        }
Ejemplo n.º 4
0
        private static bool TryAddSimpleVariable(List <BaseFormulaNode> nodes, ReadOnlySpan <char> formula, IndexWatcher nodeBuilder, bool isNegative)
        {
            if (nodeBuilder.InProcess)
            {
                var variableSpan = formula.Slice(nodeBuilder.StartIndex.GetValueOrDefault(), nodeBuilder.Length);
                var variableName = variableSpan.ToString();
                AddFormulaNode(nodes, variableName, isNegative);

                return(true);
            }

            return(false);
        }
Ejemplo n.º 5
0
        private static bool TryAddNumber(List <BaseFormulaNode> nodes, ReadOnlySpan <char> formula, IndexWatcher nodeBuilder, bool isNegative)
        {
            if (nodeBuilder.InProcess)
            {
                var valueSpan = formula.Slice(nodeBuilder.StartIndex.GetValueOrDefault(), nodeBuilder.Length);
                var value     = GetDouble(valueSpan);

                if (isNegative)
                {
                    value *= -1;
                }

                var valNode = new NumberNode(value);
                nodes.Add(valNode);

                return(true);
            }

            return(false);
        }