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