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

8 Вправи messages.Add( ErrorReason.MissingSymbol, "Missing {0}" ); messages.Add( ErrorReason.UnexpectedToken, "Unexpected token" ); messages.Add( ErrorReason.EmptyParentheses, "Empty parentheses" ); } public ErrorReason Reason { get { return reason; } } public int Where { get { return Math.Max(where, 0); } } public ExpressionSyntaxError(ErrorReason reason, int where, params object[] args) : base(string.Format(messages[reason], args)) { this.reason = reason; this.where = where; } } public static class Symbols { public const char Space = ’ ’; public const char Tab = ’\t’; public const char OpenBrace = ’(’; public const char CloseBrace = ’)’; public static bool IsWhite(char c) { return (c == Tab || c == Space); } public static bool IsReserved(char c) { return (IsWhite(c) || c == OpenBrace || c == CloseBrace || char.IsDigit(c)); } } internal interface IToken { } public abstract class Operation : IToken { public abstract char Symbol { get; } public abstract long Eval(params long[] args); internal bool TryReadSymbol(IInput input) { 186