private static Term[] GetTerms([CanBeNull] string Str) { if (Str is null) { return(null); } if (Str.Length == 0) { return(Array.Empty <Term>()); } var pos = 0; var len = Str.Length; var result = new List <Term>(); while (pos < len) { var c = Str[pos]; if (char.IsLetter(c) || c == '∫') { Term value = new StringTerm(GetNameString(Str, ref pos)); if (pos < len) { switch (Str[pos]) { case '(': { var block_str = Str.GetBracketText(ref pos) ?? throw new InvalidOperationException("Получена пустая ссылка на блок выражения"); var block = new BlockTerm("(", block_str, ")"); value = new FunctionTerm((StringTerm)value, block); } break; case '[': { var block_str = Str.GetBracketText(ref pos, "[", "]") ?? throw new InvalidOperationException("Получена пустая ссылка на блок выражения"); var block = new BlockTerm("[", block_str, "]"); value = new FunctionTerm((StringTerm)value, block); } break; case '{': { var block_str = Str.GetBracketText(ref pos, "{", "}") ?? throw new InvalidOperationException("Получена пустая ссылка на блок выражения"); var block = new BlockTerm("{", block_str, "}"); value = new FunctionTerm((StringTerm)value, block); } break; } } if (pos < len && Str[pos] == '{') { value = new FunctionalTerm ( (FunctionTerm)value, new BlockTerm("{", Str.GetBracketText(ref pos, "{", "}") ?? throw new InvalidOperationException("Получена пустая ссылка на блок выражения"), "}") ); } result.Add(value); } else if (char.IsDigit(c)) { result.Add(new NumberTerm(GetNumberString(Str, ref pos) ?? throw new InvalidOperationException("Получена пустая ссылка на строку числового значения"))); } else { switch (c) { case '(': { var block_str = Str.GetBracketText(ref pos) ?? throw new InvalidOperationException("Получена пустая ссылка на блок выражения"); var block = new BlockTerm("(", block_str, ")"); result.Add(block); } break; case '[': { var block_str = Str.GetBracketText(ref pos, "[", "]") ?? throw new InvalidOperationException("Получена пустая ссылка на блок выражения"); var block = new BlockTerm("[", block_str, "]"); result.Add(block); } break; case '{': { var block_str = Str.GetBracketText(ref pos, "{", "}") ?? throw new InvalidOperationException("Получена пустая ссылка на блок выражения"); var block = new BlockTerm("{", block_str, "}"); result.Add(block); } break; default: result.Add(new CharTerm(Str[pos++])); break; } } } return(result.ToArray()); }
/// <summary>Новый функциональный элемент выражения</summary> /// <param name="StrTerm">Строковый элемент выражения</param> /// <param name="Block">Блок выражения</param> public FunctionTerm([NotNull] StringTerm StrTerm, [NotNull] BlockTerm Block) : this(StrTerm.Name, Block) { }