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

            // Read function
            var functionNameBuilder = new NameBuilder();

            for (int fInd = 0; fInd < _functions.Count; fInd++)
            {
                var function = _functions[fInd];

                // Set function name
                functionNameBuilder.Reset(function.Name);

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

                    if (functionNameBuilder.TryRemember(ch))
                    {
                        if (functionNameBuilder.IsFinished && IsBracketNext(formula, i + 1))
                        {
                            var functionNode = new FunctionNode(function, isNegativeLocal);
                            nodes.Add(functionNode);

                            index = i;
                            return(true);
                        }
                    }
                    else
                    {
                        break;
                    }
                }
            }

            return(false);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Read operator
        /// </summary>
        public static bool TryProceedOperator(List <BaseFormulaNode> nodes, ReadOnlySpan <char> formula, ref int index)
        {
            var operatorNameBuilder = new NameBuilder();

            for (int operInd = 0; operInd < _operators.Length; operInd++)
            {
                var operatorName = _operators[operInd];

                // Set operator name
                operatorNameBuilder.Reset(operatorName);

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

                    if (operatorNameBuilder.TryRemember(ch))
                    {
                        if (operatorNameBuilder.IsFinished)
                        {
                            var operatorKey  = GetOperatorKey(operatorName);
                            var operatorNode = new OperatorNode(operatorKey);
                            nodes.Add(operatorNode);

                            index = i;
                            return(true);
                        }
                    }
                    else
                    {
                        break;
                    }
                }
            }

            return(false);
        }