Основы объектно-ориентированного программирования на языке C# book | Page 194

8 Вправи Expression arg = BuildExpressionTree(); return new UnaryExpression((UnaryOp)tok, arg); } else if (tok is Expression && tokens.Count == 1) return (Expression) tok; else throw new Exception("Unknown error"); } } public override long Eval() { throw new NotImplementedException(); } public static new Expression Parse(IInput input, char? stop) { RawExpression e = new RawExpression(); while (!input.IsEmpty()) { while (!input.IsEmpty() && Symbols.IsWhite(input.Current)) { input.MoveNext(); } if (!input.IsEmpty()) { if (input.Current == stop) { input.MoveNext(); return e.BuildExpressionTree(); } else { e.ReadToken(input); } } } if (stop == null) return e.BuildExpressionTree(); else throw new ExpressionSyntaxError( ExpressionSyntaxError.ErrorReason.MissingSymbol, input.Position, new string((char)stop, 1) ); } } public abstract long Eval(); public static long Eval(string input) { return Eval((StringInput)input); } public static long Eval(IInput input) { return Parse(input).Eval(); 194