/// <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 (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); } return(NumberParser.Parse(source, ref pos)); }
/// <summary> /// Метод преобразует строку, переданную в конструктор, /// в дерево операндов и возвращает указатель на корневой /// элемент. /// </summary> /// <returns>корневой элемент дерева операндов</returns> /// <see cref="Parser(string)"/> public IExpression Parse() { int pos = 0; ParserImpl.SkipSpaces(_source, ref pos); if (!ExprParser.IsApplicable(_source, pos)) { throw new ParserException("Not a valid expression"); } IExpression result = ExprParser.Parse(_source, ref pos); ParserImpl.SkipSpaces(_source, ref pos); if (pos != _source.Length) { throw new ParserException("Unexpected symbol at the end of expression after " + pos); } return(result); }