Основы объектно-ориентированного программирования на языке 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