예제 #1
0
        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());
        }
예제 #2
0
 /// <summary>Новый функциональный элемент выражения</summary>
 /// <param name="StrTerm">Строковый элемент выражения</param>
 /// <param name="Block">Блок выражения</param>
 public FunctionTerm([NotNull] StringTerm StrTerm, [NotNull] BlockTerm Block) : this(StrTerm.Name, Block)
 {
 }