#ifndef LEX_DEF
 #define LEX_DEF


//------------------- LEXICAL ANALYZER Module -------------------//
//						  v 03 . 04 .  2007						 //
//																 //
//								MT								 //
//---------------------------------------------------------------//



//---------------------- Incudes 
#include "stdio.h"
#include "ctype.h"
#include "strings.h"
#include "../ui/onerror.hpp"
//====================== Includes


//---------------------- Defines

//====================== Defines


enum lxType {	
			lx_err,

			lx_robotdata,
			lx_assign,
			lx_spacer,			
			lx_int_const,		
			lx_str_const,		
			lx_var,		
			lx_label,			
			lx_func,		
			lx_keyword 
};


enum lxStatus {	
		H,	// begin state
		N,	// int analysis
		I,	// id analysis
		K,	// lx_keyword analysis
		A,	// assigment analysis
		S,	// string processing
		X	// placebo :)
};


enum lxCorrect { 
		ok,
		ok_all,
		not_ok_all 
};


class Lexeme {
public:
	char *s;
	int line;

	lxType id;	
	lxCorrect sign;	

	Lexeme *next;
	
	Lexeme () {	sign = not_ok_all;	s = NULL;	next = NULL; id = lx_err;	};
	~Lexeme() {	if (s != NULL)	delete[] s;	if (next != NULL)	delete next;	};
};


class CLexic {
	FILE *fp;
	char c, c_prev, is_prev, for_prev;
	CError Error;

	int current_line;
	lxStatus stat;
	Lexeme *begin;
		
		char GetChar();
		void GetPrevChar();
	
		void Make_Ok(Lexeme *a, char *s, int is_only_char = 0);

		lxStatus GetStatus(char c);
		bool IsStatusTrue(lxStatus t, char c);
		void NIKS(lxStatus t, Lexeme *a);
		Lexeme* GetNextLexem();

public:
		CLexic (char *s);
		~CLexic () { if (begin != NULL) delete begin; };

		bool MakeAnalysis();
		void Print(Lexeme *l);
		Lexeme *GetBeginLexeme();
};


#endif

