/// <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 = FactorParser.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 (!TermParser.IsApplicable(source, pos)) { throw new ParserException("Invalid term at " + pos); } IExpression right = TermParser.Parse(source, ref pos); switch (op) { case '*': return(new MultiplyOperation(left, right)); case '/': return(new DivideOperation(left, right)); } throw new InvalidOperationException("Invalid parser state"); } return(left); }
/// <summary> /// Метод проверяет применим ли символ <term> к текущей позиции /// </summary> /// <param name="source">строка с исходным математическим выражением</param> /// <param name="pos">текущая позиция</param> /// <returns>истина, если применим, ложь -- в обратном случае</returns> public static bool IsApplicable(string source, int pos) { return(FactorParser.IsApplicable(source, pos)); }