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;
}