public bool TryParse(PrioritizedString expr, ParameterInfo paramInfo, out Expression parsed)
        {
            var minPriorityInds = expr.Priorities.GetMinIndexes();
            var whereParts      = expr.SplitOnSubset("where", minPriorityInds);

            if (whereParts.Length > 2)
            {
                throw new ParseException("Too many 'where'!");
            }

            if (whereParts.Length == 1)
            {
                parsed = null;
                return(false);
            }

            var mainFunc = whereParts[0];

            if (mainFunc.Input.Last() == ',')
            {
                mainFunc = mainFunc.Substring(0, mainFunc.Input.Length - 1);
            }

            var parameterExpressions = new Dictionary <string, PrioritizedString>();

            foreach (Match match in ParameterRe.Matches(whereParts[1].Input))
            {
                var(paramName, paramExpr) = (match.Groups["paramName"].Value, match.Groups["paramExpr"].Value);
                if (paramInfo.Parameters.ContainsKey(paramName))
                {
                    throw new ParseException($"Parameter {paramName} is defined multiple times");
                }

                paramInfo.Parameters[paramName] = Expression.Parameter(typeof(double), paramName);
                parameterExpressions[paramName] = new PrioritizedString(paramExpr);
            }
            var parameterExprs = parameterExpressions
                                 .ToDictionary(
                nameWithExpr => nameWithExpr.Key,
                nameWithExpr => Combinator.ParseFunctionalExpression(nameWithExpr.Value, paramInfo)
                );
            var mainExpr = Combinator.ParseFunctionalExpression(mainFunc, paramInfo);

            var paramReplacer = new ParameterReplacerVisitor(parameterExprs);

            parsed = paramReplacer.Visit(mainExpr);
            return(true);
        }
        public bool TryParse(
            PrioritizedString expr, ParameterInfo paramInfo, out Expression parsed)
        {
            var minPriorityInds = expr.Priorities.GetMinIndexes();
            var splitBySymbol   = expr.SplitOnSubset(Symbol, minPriorityInds);

            if (splitBySymbol.Length > 1 && splitBySymbol[0].Trim().Input == "")
            {
                splitBySymbol[1] = new PrioritizedString(Symbol).Concat(splitBySymbol[1]);
                splitBySymbol    = splitBySymbol.Skip(1).ToArray();
            }
            if (splitBySymbol.Length == 1)
            {
                parsed = null;
                return(false);
            }
            parsed = ParseToExpression(splitBySymbol, paramInfo);
            return(true);
        }