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

8 Вправи private RawExpression(IEnumerable tokens) { this.tokens.AddRange(tokens); } private void AddToken(IToken tok) { if (tok == null) throw new ArgumentNullException(); if (tok is NumberExpression) { if (!AcceptNum) throw new InvalidOperationException(); AcceptNum = false; AcceptOp = true; AcceptGrp = false; } else if (tok is UnaryOp) { if (!AcceptOp) throw new InvalidOperationException(); AcceptNum = true; AcceptOp = false; AcceptGrp = true; } else if (tok is BinaryOp) { if (!AcceptOp) throw new InvalidOperationException(); AcceptNum = true; AcceptOp = false; AcceptGrp = true; } else if (tok is GroupExpression) { if (!AcceptGrp) throw new InvalidOperationException(); AcceptNum = false; AcceptOp = true; AcceptGrp = false; } tokens.Add(tok); } private IToken GetToken(IInput input) { IToken result; if (GroupExpression.TryRead(input, out result)) return result; else if (NumberExpression.TryRead(input, out result)) return result; else if (tokens.Count == 0 && OperationsRegistry.TryRead1(input, out result)) return result; else if (tokens.Count > 0 && OperationsRegistry.TryRead2(input, out result)) return result; else 192