// Tokenizerr.cc  P. Conrad, CISC220 06J
// A class that tokenizes input



#include <iostream>
using std::istream;
using std::ostream;

#include <string>
using std::string;

#include <cctype> // for isalpha, isdigit

#include "Tokenizer.h"

void Tokenizer_C::tokenize()
{
  char c;

  in.get(c);

  while (!in.eof())
    {
      process(c);
      in.get(c);
    }
  
}

void Tokenizer_C::process(char c)
{
  out << "I found character '" << c 
       << "' at line " << line 
       << " char " << pos << endl;


  switch(state)
    {
    case S0_START:
      {
	if (c == ' ' || c == '\n')
	  {
	    state = S0_START;
	  }
	else if (isalpha(c))
	  {
	    token += c;
	    state = S1_VARIABLE;
	  }
	else if (isdigit(c))
	  {
	    token += c;
	    state = S2_INT;
	  }
	else if (c == '+' || c == '=' || c=='*')
	  {
	    token += c;
	    state = S5_OPERATOR;
	  }
	else
	  {
	    out << "Illegal character " 
		<< c 
		<< " at line: " << line << " char: " << pos << endl;
	  }
	break;
      }
    case S1_VARIABLE:
      {
	

	break;
      }
    case S2_INT:
      {
	if (isdigit(c))
	  {
	    token += c;
	    state = S2_INT;	   
	  }
	if (c==".")
	  {
	    token += c;
	    state = S3;
	  }
	else
	  {
	    out << "Found integer " << token 
		<< " at line: " << line << " char: " << pos << endl;
            state = S0_START;
            process(c);
	    return;
	  }
	break;
      }
    case S3:
      {

	break;
      }
    case S4_DOUBLE:
      {

	break;
      }
    case S5_OPERATOR:
      {

	break;
      }
    default:
      {
	std::cerr << "Illegal state " << state << endl;
	exit(1);
      }


    } 
  

  
  if (c=='\n')
    {
      pos = 1;
      line++;
    }
  else
    {
      pos++;
    }

}







