using namespace std;
#include <iostream>
#include <string>

using namespace std;
class Token {
   private:
      string type;
      string val;
   public:
      string getType() {return type;}
      string getVal() {return val;}
      void setType(string t) {type = t;}
      void setVal(string v) {val = v;}
      string toString () { return "[" + type + "," + val + "]"; }
}; //End of Token Class


int index(char s[], char ch) {
  int i=0;
  int len = strlen(s);
  int ans = -1;
  while (i < len && ch != s[i]) i++;
  if (i < len) ans = i;
  // cout << "Returning ans= " << ans << endl;
  return ans;
} 

Token TokenONE(string &s) {
   cout << "Matching \"" << s << "\" in TokenONE";
    char alphabet[] = "ab";
    string name="TokenONE";
    int state = 0;
    char ch ;
    int length = s.length();
    Token t;
    t.setType("");
    t.setVal(""); 
    int pos = 0;
    while (pos < length && (index(alphabet,ch=s[pos]) >= 0 )  ){ 
      switch(state) {
        case 1:
        if (ch == 'a') state = 2;
        if (ch == 'b') state = 1;
       break;
       case 2:
        if (ch == 'a') state = 2;
        if (ch == 'b') state = 1;
       break;
       case 3:
       break;
     } //close switch 
     pos++; //increment position 
   } //close while 

   if(state == 2) { //final state checkers 
      t.setType(name);
      t.setVal(s.substr(0,pos));
      s = s.substr(pos);
   }
   else if(state == 2) { //final state checkers 
      t.setType(name);
      t.setVal(s.substr(0,pos));
      s = s.substr(pos);
   }
   return t;
}

Token match(string &s){
  Token tok;
  tok.setType("");
  tok.setVal("");
  tok = TokenONE(s);
  if(tok.getVal() != ""){
    cout << "Match Found in TokenONE";
    return tok;
  }
    return tok;
}

