//============================================================================
// Name        : practica2.cpp
// Author      : gerardooscarjt@gmail.com
// Version     :
// Copyright   : Your copyright notice
// Description : Práctica 2
//============================================================================

//#include 
#include 
#include 
#include 
#include "Queue.h"

using namespace std;

char getNextChar() {
    return getc(stdin);
}

bool isDigit(char c) {
	return c>47 && c<58;
}

bool isLetter(char c) {
	return (c>96 && c<123) || (c>64 && c<91);
}

bool isOperator(char c) {
	return c == '+' || c == '=' || c == '-' || c == '/' || c == '\\' || c == '*' || c == '%';
}

bool isPuntuation(char c) {
	return c == '(' || c == ')' || c == '\n';
}

bool isBlank(char c) {
	return c == ' ';
}

bool getNextToken() {
	int number = 0;
	string identifier;
	int state = 1;
	char c;
	while (true) {
		c = getNextChar();
		if (c != -1) {
			switch (state) {
			case 1:
				if (isDigit(c)) {
					number = c-48;
					state = 2;
				} else if (isLetter(c)) {
					// identifier = letra;
					state = 3;
					identifier.clear();
					identifier.push_back(c);
				} else if (isBlank(c)) {
					// No hace nada :)
				} else if (isOperator(c)) {
					// Ya veremos que hace...
					state = 4;
					identifier.clear();
					identifier.push_back(c);

				} else if (isPuntuation(c)) {
					if (c == '(') printf("Token puntuacion: p_open\n");
					if (c == ')') printf("Token puntuacion: p_close\n");
					if (c == '\n') printf("Token puntuacion: eol\n");
				} else {
					// Lanzar error, caracter inesperado, esperaba dígito, letra, operador, puntuación o blanco.
					printf("Error: caracter inesperado, esperaba dígito, letra, operador, puntuación o blanco");
				}

				break;



			case 2:
				if (isDigit(c)) {
					number *=10;
					number += (c-48);
				} else {
					ungetc((int)c, stdin);
					printf("Token numero: %d\n", number);
					return true;
				}
				break;
			case 3:
				if (isLetter(c) || isDigit(c)) {
					identifier.push_back(c);
				} else {
					ungetc((int)c, stdin);
					printf("Token identificador: %s\n", identifier.data());
					return true;
				}
				break;
			case 4:
				if (isOperator(c)) {
					identifier.push_back(c);

				} else {
					ungetc((int)c, stdin);
					// comprobar en una lista si el operador existe
					printf("Token operador: %s\n", identifier.data());
					return true;
				}
			}
		} else {
			printf("Token puntuacion: eof\n");
			return false;
		}
	}
}


int main(int argc, char *argv[]){
/*	for (int i=0; i <  argc; i++)
		printf("%s \n", argv[i]);
*/

	char valor;


	do {
		valor = getNextToken();
		//printf("ascii %d\n", valor);
	} while (valor);



	return 0;
}