public IEnumerator <Token> Scan(TextReader reader)
        {
            while (reader.Peek() != -1)
            {
                if (Char.IsWhiteSpace((char)reader.Peek()))
                {
                    reader.Read();
                }
                else if (Char.IsDigit((char)reader.Peek()))
                {
                    yield return(Token.FromDouble(ScanReal(reader)));
                }
                else
                {
                    char c = (char)reader.Read();
                    switch (c)
                    {
                    case '+': yield return(Token.FromKind(Kind.Plus)); break;

                    case '-': yield return(Token.FromKind(Kind.Minus)); break;

                    case '*': yield return(Token.FromKind(Kind.Multiply)); break;

                    case '/': yield return(Token.FromKind(Kind.Divide)); break;

                    case '(': yield return(Token.FromKind(Kind.LeftParenthesis)); break;

                    case ')': yield return(Token.FromKind(Kind.RightParenthesis)); break;

                    default:
                        throw new ApplicationException("Illegal character: '" + c + "'");
                    }
                }
            }
            yield return(Token.FromKind(Kind.EoF));
        }