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