/// <summary> /// Метод выполянет разбор исходной строки, начиная с указанной позиции /// и заканчивая концом выражения /// </summary> /// <param name="source">строка с исходным математическим выражением</param> /// <param name="pos">текущая позиция (изменяется)</param> /// <returns>экземпляр Expression</returns> /// <exception cref="ParserException" /> /// <exception cref="InvalidOperationException" /> public static IExpression Parse(string source, ref int pos) { IExpression left = TermParser.Parse(source, ref pos); ParserImpl.SkipSpaces(source, ref pos); if (pos == source.Length) { return(left); } if (source[pos] == '+' || source[pos] == '-') { char op = source[pos]; pos++; ParserImpl.SkipSpaces(source, ref pos); if (!ExprParser.IsApplicable(source, pos)) { throw new ParserException("Invalid expression at " + pos); } IExpression right = ExprParser.Parse(source, ref pos); switch (op) { case '+': return(new AddOperation(left, right)); case '-': return(new SubtractOperation(left, right)); } throw new InvalidOperationException("Invalid parser state"); } return(left); }
/// <summary> /// Метод выполянет разбор исходной строки, начиная с указанной позиции /// и заканчивая концом выражения /// </summary> /// <param name="source">строка с исходным математическим выражением</param> /// <param name="pos">текущая позиция (изменяется)</param> /// <returns>экземпляр Expression</returns> /// <exception cref="ParserException" /> public static IExpression Parse(string source, ref int pos) { if (pos + 1 < source.Length && source[pos] == 'p' && source[pos + 1] == 'i') { pos += 2; return(new NumberExpr(3.141)); } if (source[pos] == 'e') { pos++; return(new NumberExpr(2.718)); } if (source[pos] == '(') { pos++; ParserImpl.SkipSpaces(source, ref pos); if (!ExprParser.IsApplicable(source, pos)) { throw new ParserException("Invalid expression at " + pos); } IExpression expr = ExprParser.Parse(source, ref pos); ParserImpl.SkipSpaces(source, ref pos); if (pos == source.Length || source[pos] != ')') { throw new ParserException("Expected ) at " + pos); } pos++; return(expr); } if (pos < source.Length - 3 && source[pos] == 's' && source[pos + 1] == 'i' && source[pos + 2] == 'n' && source[pos + 3] == '(') { pos += 4; ParserImpl.SkipSpaces(source, ref pos); if (!ExprParser.IsApplicable(source, pos)) { throw new ParserException("Invalid expression at " + pos); } IExpression expr = ExprParser.Parse(source, ref pos); ParserImpl.SkipSpaces(source, ref pos); if (source[pos] != ')') { throw new ParserException("Invalid expression at " + pos); } pos++; return(new SinFunction(expr)); } if (pos < source.Length - 3 && source[pos] == 'c' && source[pos + 1] == 'o' && source[pos + 2] == 's' && source[pos + 3] == '(') { pos += 4; ParserImpl.SkipSpaces(source, ref pos); if (!ExprParser.IsApplicable(source, pos)) { throw new ParserException("Invalid expression at " + pos); } IExpression expr = ExprParser.Parse(source, ref pos); ParserImpl.SkipSpaces(source, ref pos); if (source[pos] != ')') { throw new ParserException("Invalid expression at " + pos); } pos++; return(new CosFunction(expr)); } if (NumberParser.IsApplicable(source, pos)) { return(NumberParser.Parse(source, ref pos)); } return(VariableParser.Parse(source, ref pos)); }