TokenONE ab 1 2 3 1 2 2 a 1 2 b 1 1 a 2 2 b 2 1 TokenTWO ab 1 2 1 1 a 1 2 b 1 1 a 2 2 b 2 1 using namespace std; #include #include 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; } //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); } } Token TokenTWO(string &s) { cout << "Matching \"" << s << \"" in TokenTWO; char alphabet[] = "ab"; string name="TokenTWO"; 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; } //close switch pos++; //increment position } //close while if(state == 1) { //final state checkers t.setType(name); t.setVal(s.substr(0,pos)); s = s.substr(pos); } } int main() { string input = ""; string line; while (getline(cin,line)) { input = input + line + "\n"; }; cout << "Processing input " << input << endl; Token t; bool done = false; while (!done && input != "") { done = true; t = TokenONE(input); if (t.getType() != "") { done = false; cout << "Found token:"; cout << t.toString() << endl; cout << "Remaining string is \"" << input << '\"'; continue; } t = TokenTWO(input); if (t.getType() != "") { done = false; cout << "Found token:"; cout << t.toString() << endl; cout << "Remaining string is \"" << input << '\"'; continue; } } // close while return 0; }