Основы объектно-ориентированного программирования на языке C# book | Page 194
8 Вправи
Expression arg = BuildExpressionTree();
return new UnaryExpression((UnaryOp)tok, arg);
}
else if (tok is Expression && tokens.Count == 1)
return (Expression) tok;
else
throw new Exception("Unknown error");
}
}
public override long Eval()
{
throw new NotImplementedException();
}
public static new Expression Parse(IInput input, char? stop)
{
RawExpression e = new RawExpression();
while (!input.IsEmpty())
{
while (!input.IsEmpty()
&& Symbols.IsWhite(input.Current))
{
input.MoveNext();
}
if (!input.IsEmpty())
{
if (input.Current == stop)
{
input.MoveNext();
return e.BuildExpressionTree();
}
else
{
e.ReadToken(input);
}
}
}
if (stop == null)
return e.BuildExpressionTree();
else
throw new ExpressionSyntaxError(
ExpressionSyntaxError.ErrorReason.MissingSymbol,
input.Position,
new string((char)stop, 1)
);
}
}
public abstract long Eval();
public static long Eval(string input)
{
return Eval((StringInput)input);
}
public static long Eval(IInput input)
{
return Parse(input).Eval();
194