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

8 Вправи public static void Register(Operation op) { if (op == null) throw new ArgumentNullException(); if (Symbols.IsReserved(op.Symbol)) throw new ArgumentException("Reserved symbol cannot be used as an operation symbol"); if (op is UnaryOp) { if (Ops1.ContainsKey(op.Symbol)) throw new ArgumentException("Operation is already registered"); else Ops1.Add(op.Symbol, op as UnaryOp); } else if (op is BinaryOp) { if (Ops2.ContainsKey(op.Symbol)) throw new ArgumentException("Operation is already registered"); else Ops2.Add(op.Symbol, op as BinaryOp); } else throw new ArgumentException("Unsupported operation"); } internal static bool TryRead1(IInput input, out IToken result) { if (!input.IsEmpty() && Ops1.ContainsKey(input.Current)) { result = Ops1[input.Current]; return ((Operation)result).TryReadSymbol(input); } else { result = null; return false; } } internal static bool TryRead2(IInput input, out IToken result) { if (!input.IsEmpty() && Ops2.ContainsKey(input.Current)) { result = Ops2[input.Current]; return ((Operation)result).TryReadSymbol(input); } else { result = null; return false; } } } public sealed class GroupExpression : Expression, IToken { 190