void morse::AndThings()
{
	if(Serial.available())
	{	
		while(Serial.available())
		{
			_fromSerial = _fromSerial + (char)(Serial.read());    
		}

		_Wordstring = _fromSerial;
		Serial.print("You wrote: ");
		Serial.println(_fromSerial);
		_fromSerial = "";

	}	

	CheckLetters(_Wordstring);
}
Token &
	TokenFactory::
	DoSymbol(unsigned char ch)
{
	// Get the position of the start of the symbol
	std::streampos
		pos = m_sCur->tellg();
	pos -= 1;
	// State of symbol determination
	E_STATE
		state = ES__NONE;
	// Current symbol type
	TokenType::E_TYPE
		type = TokenType::TT_SYMBOL;
	do
	{
		switch (state)
		{
			case ES__NONE: // ES_NONE
				switch (ch)
				{
					case 'A':
						if (CheckLetters("rray")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TG_Array;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'B':
						if (CheckLetters("oolean")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TG_Boolean;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'D':
						if (CheckLetters("ate")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TG_Date;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'E':
						state = ES_E; // ES_E
						break;
					case 'F':
						if (CheckLetters("unction")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TG_Function;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'M':
						if (CheckLetters("ath")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TG_Math;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'N':
						if (CheckLetters("umber")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TG_Number;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'O':
						if (CheckLetters("bject")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TG_Object;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'R':
						state = ES_R; // ES_R
						break;
					case 'S':
						state = ES_S; // ES_S
						break;
					case 'T':
						if (CheckLetters("ypeError")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TG_TypeError;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'U':
						if (CheckLetters("RIError")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TG_URIError;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'a':
						if (CheckLetters("bstract")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_abstract;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'b':
						state = ES_b; // ES_b
						break;
					case 'c':
						state = ES_c; // ES_c
						break;
					case 'd':
						state = ES_d; // ES_d
						break;
					case 'e':
						state = ES_e; // ES_e
						break;
					case 'f':
						state = ES_f; // ES_f
						break;
					case 'g':
						if (CheckLetters("oto")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_goto;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'i':
						state = ES_i; // ES_i
						break;
					case 'l':
						if (CheckLetters("ong")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_long;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'n':
						state = ES_n; // ES_n
						break;
					case 'p':
						state = ES_p; // ES_p
						break;
					case 'r':
						if (CheckLetters("eturn")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_return;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 's':
						state = ES_s; // ES_s
						break;
					case 't':
						state = ES_t; // ES_t
						break;
					case 'u':
						if (CheckLetters("ndefined")) // Can only be this or unknown
						{
							// "undefined" is not a keyword but
							// is often used as one, we'll treat it
							// as one but warn them of the problems
							state = ES__DONE; // Mark as done
							type = TokenType::TK_undefined;
							Message::Send(Message::USED_UNDEFINED);
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'v':
						state = ES_v; // ES_v
						break;
					case 'w':
						state = ES_w; // ES_w
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_E: // ES_E
				switch (ch)
				{
					case 'r':
						if (CheckLetters("ror")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TG_Error;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'v':
						if (CheckLetters("alError")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TG_EvalError;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_R: // ES_R
				switch (ch)
				{
					case 'a':
						if (CheckLetters("ngeError")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TG_RangeError;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'e':
						state = ES_Re; // ES_Re
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_Re: // ES_Re
				switch (ch)
				{
					case 'f':
						if (CheckLetters("erenceError")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TG_ReferenceError;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'g':
						if (CheckLetters("Exp")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TG_RegExp;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_S: // ES_S
				switch (ch)
				{
					case 't':
						if (CheckLetters("ring")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TG_String;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'y':
						if (CheckLetters("ntaxError")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TG_SyntaxError;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_b: // ES_b
				switch (ch)
				{
					case 'o':
						if (CheckLetters("olean")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_boolean;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'r':
						if (CheckLetters("eak")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_break;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'y':
						if (CheckLetters("te")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_byte;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_c: // ES_c
				switch (ch)
				{
					case 'a':
						state = ES_ca; // ES_ca
						break;
					case 'h':
						if (CheckLetters("ar")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_char;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'l':
						if (CheckLetters("ass")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_class;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'o':
						if (CheckLetters("n")) // All possible symbols have these symbols
						{
							state = ES_con; // ES_con
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_ca: // ES_ca
				switch (ch)
				{
					case 's':
						if (CheckLetters("e")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_case;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 't':
						if (CheckLetters("ch")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_catch;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_con: // ES_con
				switch (ch)
				{
					case 's':
						if (CheckLetters("t")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_const;
							// SOME browsers implement this (at least FF)
							// but others don't (at least IE)
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 't':
						if (CheckLetters("inue")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_continue;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_d: // ES_d
				switch (ch)
				{
					case 'e':
						state = ES_de; // ES_de
						break;
					case 'o':
						state = ES_do; // ES_do
						type = TokenType::TK_do;
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_de: // ES_de
				switch (ch)
				{
					case 'b':
						if (CheckLetters("ugger")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_debugger;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'f':
						if (CheckLetters("ault")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_default;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'l':
						if (CheckLetters("ete")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_delete;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_do: // ES_do
				switch (ch)
				{
					case 'u':
						if (CheckLetters("ble")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_double;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_e: // ES_e
				switch (ch)
				{
					case 'l':
						if (CheckLetters("se")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_else;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'n':
						if (CheckLetters("um")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_enum;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'v':
						if (CheckLetters("al")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_eval;
							// Bad Bad Bad
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'x':
						state = ES_ex; // ES_ex
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_ex: // ES_ex
				switch (ch)
				{
					case 'p':
						if (CheckLetters("ort")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_export;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 't':
						if (CheckLetters("ends")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_extends;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_f: // ES_f
				switch (ch)
				{
					case 'a':
						if (CheckLetters("lse")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_false;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'i':
						if (CheckLetters("nal")) // All possible symbols have these symbols
						{
							state = ES_final; // ES_final
							type = TokenType::TR_final;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'l':
						if (CheckLetters("oat")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_float;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'o':
						if (CheckLetters("r")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_for;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'u':
						if (CheckLetters("nction")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_function;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_final: // ES_final
				switch (ch)
				{
					case 'l':
						if (CheckLetters("y")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_finally;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_i: // ES_i
				switch (ch)
				{
					case 'f':
						state = ES__DONE; // Mark as done
						type = TokenType::TK_if;
						break;
					case 'm':
						if (CheckLetters("p")) // All possible symbols have these symbols
						{
							state = ES_imp; // ES_imp
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'n':
						state = ES_in; // ES_in
						type = TokenType::TK_in;
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_imp: // ES_imp
				switch (ch)
				{
					case 'l':
						if (CheckLetters("ements")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_implements;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'o':
						if (CheckLetters("rt")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_import;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_in: // ES_in
				switch (ch)
				{
					case 's':
						if (CheckLetters("tanceof")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_instanceof;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 't':
						state = ES_int; // ES_int
						type = TokenType::TR_int;
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_int: // ES_int
				switch (ch)
				{
					case 'e':
						if (CheckLetters("rface")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_interface;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_n: // ES_n
				switch (ch)
				{
					case 'a':
						if (CheckLetters("tive")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_native;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'e':
						if (CheckLetters("w")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_new;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'u':
						if (CheckLetters("ll")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_null;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_p: // ES_p
				switch (ch)
				{
					case 'a':
						if (CheckLetters("ckage")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_package;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'r':
						state = ES_pr; // ES_pr
						break;
					case 'u':
						if (CheckLetters("blic")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_public;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_pr: // ES_pr
				switch (ch)
				{
					case 'i':
						if (CheckLetters("vate")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_private;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'o':
						if (CheckLetters("tected")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_protected;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_s: // ES_s
				switch (ch)
				{
					case 'h':
						if (CheckLetters("ort")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_short;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 't':
						if (CheckLetters("atic")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_static;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'u':
						if (CheckLetters("per")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_super;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'w':
						if (CheckLetters("itch")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_switch;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'y':
						if (CheckLetters("nchronized")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_synchronized;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_t: // ES_t
				switch (ch)
				{
					case 'h':
						state = ES_th; // ES_th
						break;
					case 'r':
						state = ES_tr; // ES_tr
						break;
					case 'y':
						if (CheckLetters("peof")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_typeof;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_th: // ES_th
				switch (ch)
				{
					case 'i':
						if (CheckLetters("s")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							//type = TokenType::TT_THIS; // Special case, "this" keyword
							//value.keyword = SymbolType::EK_this; // Only needed for the check below
							type = TokenType::TK_this;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'r':
						if (CheckLetters("ow")) // All possible symbols have these symbols
						{
							state = ES_throw; // ES_throw
							type = TokenType::TK_throw;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_throw: // ES_throw
				switch (ch)
				{
					case 's':
						state = ES__DONE; // Mark as done
						type = TokenType::TR_throws;
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_tr: // ES_tr
				switch (ch)
				{
					case 'a':
						if (CheckLetters("nsient")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_transient;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'u':
						if (CheckLetters("e")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_true;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'y':
						state = ES__DONE; // Mark as done
						type = TokenType::TK_try;
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_v: // ES_v
				switch (ch)
				{
					case 'a':
						if (CheckLetters("r")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_var;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'o':
						state = ES_vo; // ES_vo
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_vo: // ES_vo
				switch (ch)
				{
					case 'i':
						if (CheckLetters("d")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_void;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'l':
						if (CheckLetters("atile")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TR_volatile;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES_w: // ES_w
				switch (ch)
				{
					case 'h':
						if (CheckLetters("ile")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_while;
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					case 'i':
						if (CheckLetters("th")) // Can only be this or unknown
						{
							state = ES__DONE; // Mark as done
							type = TokenType::TK_with;
							// Bad Bad Bad
						}
						else
						{
							state = ES__UNKNOWN; // Mark as unknown
						}
						break;
					default:
						state = ES__UNKNOWN; // Mark as unknown
						break;
				}
				break;
			case ES__DONE:
				// If it's done that means there's no longer known
				// word that it can be, so if we get another char
				// then it's a custom symbol that starts out the
				// same as a regular symbol
				Message::Send(Message::POSSIBLY_AMBIGUOUS);
				state = ES__UNKNOWN;
				break;
			case ES__UNKNOWN:
				// Do nothing, we're just collecting data
				break;
			default:
				Message::Send(Message::UNKNOWN_STATE);
				state = ES__UNKNOWN;
				break;
		}
		ch = Read();
		// Check IsSym and IsDec as now they're both
		// valid symbol characters
	}
	while (IsSym(ch) || IsDec(ch));
	if (state == ES__UNKNOWN || type == TokenType::TT_SYMBOL)
	{
		// Technically not "unknown"
		// Just a new custom symbol
		// Found a new token
		std::streampos
			len;
		if (!ch)
		{
			// At the end of the file
			m_sCur->clear();
			len = 1;
		}
		else
		{
			len = 0;
		}
		len += m_sCur->tellg();
		len -= pos;
		// Include NULL in allocation
		// Use alloca because we only need this
		// temporarilly and it's easy to handle
		// no need to remember to delete the
		// memory on function exit or exception
		char *
			c = (char *)alloca(len);
		if (c)
		{
			// Get the start of the symbol and read
			m_sCur->seekg(pos);
			len -= 1;
			m_sCur->read(c, len);
			c[len] = '\0';
			Preprocessor &
				pp = Compiler::Get().GetPreprocessor();
			// Check if this is a macro
			if (pp.Defined(c))
			{
				// Yes
				m_altIn.push(pp.Get(c));
				return GetNext();
			}
			if (m_sCur->bad())
			{
				// Error reading
				Message::Send(Message::INPUT_STREAM_ERROR);
			}
			else
			{
				// Read, save token
				return Create(c, TokenType::TT_SYMBOL);
			}
		}
		else
		{
			m_sCur->unget();
			Message::Send(Message::OUT_OF_MEMORY);
		}
		// Something went wrong
		// Compile should fail
		return Create(TokenType::TT__NONE);
	}
	else
	{
		// Found an existing known token
		if (TokenType::IsReserved(type) && type != TokenType::TK_undefined)
		{
			// Using a reserved word, may conflict in future
			Message::Send(Message::USED_RESERVE, SC::L(type));
		}
		// Return a character to the stream
		m_sCur->unget();
		return Create(type);
	}
}