
#ifndef _JL_SCANNER_H_
#define _JL_SCANNER_H_

#include <fstream.h>
#include "jlstring.h"

#define SCANNER_MAX_TOKENS 100

#define TK_NONE		0
#define TK_EOF		1
#define TK_STRING	2
#define TK_FLOAT	3

class Scanner {

	private:
		istream		*_input;
		int			_close_input_when_done;

		JLString	*_tokens;			// array of tokens recognized
		int			*_token_IDs;		// tokens' identifying ID #
		JLString	_symbols;			// string of single character symbols
		int			_symbol_base_ID;	// ID of first symbol in string
		int			_max_tokens;		// size of array
		int			_num_tokens;		// number of tokens in array

		JLString	_token;				// the current token read
		int			_token_ID;			// the current token's ID
		int			_linenumber;		// line number

		char		_c;
		int			_putback;
		int			_eol, _eof;
		int			_verbose;			// display every token found

	public:
		Scanner();
		Scanner(istream&, int m = SCANNER_MAX_TOKENS);
		Scanner(const JLString&, int m = SCANNER_MAX_TOKENS);
		~Scanner();

		JLString& GetToken() { return _token; }
		int GetID() const { return _token_ID; }
		int GetLineNumber() const { return _linenumber; }
		int GetEOF() const { return _eof; }

		void AddToken(const JLString&, int ID);
		void SetSymbols(const JLString&, int base_ID);

		int IsWhiteSpace();
		void SkipWhiteSpace();

		Scanner& GetNextToken();

		void SetVerbose(int v)
			{ _verbose = v; cerr << "Scanner::_verbose: " << _verbose << endl; }
};

#endif
