#ifndef lexanBenchH
#define lexanBenchH

#include "lexan.h"
//---------------------------------------------------------------------------
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <list>
#include <string>
#include <stdexcept>
//---------------------------------------------------------------------------
#define LEX_B_NULL		0
#define LEX_B_ERROR		1
#define LEX_B_INPUT		1000	//	keyword
#define LEX_B_OUTPUT	1001	//	keyword
#define LEX_MIN_FUNC	4
#define LEX_B_DFF		4		//	keyword - translates to RTL register
#define LEX_MIN_SYMFUNC	5
#define LEX_B_AND		5		//  keyword - translates to SymFunc
#define LEX_B_OR		6		//kw
#define LEX_B_NAND		7		//kw
#define LEX_B_NOR		8		//kw
#define LEX_B_XOR		9		//kw
#define LEX_B_XNOR		10		//kw
#define LEX_B_NOT		11		//kw
#define LEX_B_BUFF		12		//kw
#define LEX_MAX_FUNC	12
#define LEX_B_ANY_FUNC	1002	// pseudo symbol for error reporting
//#define LEX_B_WRITE    13
//#define LEX_B_LBR      14
//#define LEX_B_RBR      15
#define LEX_B_INTEGER  16
#define LEX_B_REAL     17
//#define LEX_B_PLUS     18
//#define LEX_B_MULT     19
//#define LEX_B_COLON    20
#define LEX_B_ASSIGN   21
//#define LEX_B_DIV      22
#define LEX_B_LPA      23
#define LEX_B_RPA      24
//#define LEX_B_ELSE     25
//#define LEX_B_THEN     26
//#define LEX_B_DOT      27

#define LEX_B_IDENT    28

//#define LEX_B_SEMICOLON 29
#define LEX_B_COMMA    30
//#define LEX_B_TYPEINT  31
//#define LEX_B_TYPEREAL 32
//#define LEX_B_DO       33

#define MODE_STANDARD 0  // bench,...

class LexanBench: public Lexan {
    int mode;
    void kw_init();
public:
    LexanBench() {}
    void init  (std::istream&, const std::string&, int=MODE_STANDARD);
    int NextToken();
    static bool isFunc (int);
};

#endif
