/// <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); }
/// <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); }