public bool TryParse(PrioritizedString expr, ParameterInfo paramInfo, out Expression parsed) { expr = expr.Trim(); var exprStr = expr.Input; if (!Brackets.AreMatching(exprStr.First(), exprStr.Last())) { parsed = null; return(false); } var exprWithoutBrackets = expr.Substring(1, expr.Input.Length - 2); parsed = Combinator.ParseFunctionalExpression(exprWithoutBrackets, paramInfo); return(true); }
public bool TryParse(PrioritizedString expr, ParameterInfo paramInfo, out Expression parsed) { expr = expr.Trim(); bool isUnaryPlus; if (expr.Input.StartsWith("+")) { isUnaryPlus = true; } else if (expr.Input.StartsWith("-")) { isUnaryPlus = false; } else { parsed = default; return(false); } var arg = expr.Substring(1, expr.Length - 1).Trim(); if (arg.Length == 0) { throw new ParseException("Found plus sign without argument"); } if (arg.Input[0] == '-' || arg.Input[0] == '+') { throw new ParseException("Unary minus/plus cannot be followed by unary minus/plus"); } parsed = isUnaryPlus ? Combinator.Parse(arg, paramInfo, Order) : Expression.Negate(Combinator.Parse(arg, paramInfo, Order)); return(true); }