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