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)); }