#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 {
	CError Error;

	char c;
	FILE *fp;

	int current_line;
	lxStatus stat;
	Lexeme *begin;
		
		char GetChar(bool back = false);
					
		void Make_Ok(Lexeme *a, char *s, int is_only_char = 0);
		void Assignment(Lexeme *a);
		void Spacer(Lexeme *a);

		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

