#include <iostream>
#include <sstream>
using namespace std;
typedef unsigned char uchar;
enum Token {
TkMD = 'M' | 'D' << 8,
TkRP = 'R' | 'P' << 8,
TkTP = 'T' | 'P' << 8,
TkTT = 'T' | 'T' << 8
};
inline Token tokenize(uchar c0, uchar c1) { return (Token)(c0 | c1 << 8); }
bool parse(istream &in)
{
for (;;) {
// read command (2 chars)
char cmd[2];
if (in >> cmd[0] >> cmd[1]) {
//cout << "DEBUG: token: " << hex << tokenize(cmd[0], cmd[1]) << endl;
switch (tokenize(cmd[0], cmd[1])) {
case TkMD: { // MD<num>
int num;
if (in >> num) {
cout << "Received 'MD" << dec << num << "'." << endl;
} else {
cerr << "ERROR: Number expected after 'MD'!" << endl;
return false;
}
} break;
case TkRP: { // RP<num>
int num;
if (in >> num) {
cout << "Received 'RP" << dec << num << "'." << endl;
} else {
cerr << "ERROR: Number expected after 'MD'!" << endl;
return false;
}
} break;
case TkTP: // TP
cout << "Received 'TP'." << endl;
break;
case TkTT: // TT
cout << "Received 'TT'." << endl;
break;
default:
cerr << "ERROR: Wrong command '" << cmd[0] << cmd[1] << "'!" << endl;
return false;
}
} else {
cerr << "ERROR: Command expected!" << endl;
return false;
}
// try to read separator
char sep;
if (!(in >> sep)) break; // probably EOF (further checks possible)
if (sep != ',') {
cerr << "ERROR: ',' expected!" << endl;
return false;
}
}
return true;
}
int main()
{
// test string
string sample("MD1,TP,RP5,TT,RP10");
// read test string
istringstream in(sample);
if (parse(in)) cout << "Done." << endl;
else cerr << "Interpreting aborted!" << endl;
// done
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWNoYXI7CgplbnVtIFRva2VuIHsKICBUa01EID0gJ00nIHwgJ0QnIDw8IDgsCiAgVGtSUCA9ICdSJyB8ICdQJyA8PCA4LAogIFRrVFAgPSAnVCcgfCAnUCcgPDwgOCwKICBUa1RUID0gJ1QnIHwgJ1QnIDw8IDgKfTsKCmlubGluZSBUb2tlbiB0b2tlbml6ZSh1Y2hhciBjMCwgdWNoYXIgYzEpIHsgcmV0dXJuIChUb2tlbikoYzAgfCBjMSA8PCA4KTsgfQoKYm9vbCBwYXJzZShpc3RyZWFtICZpbikKewogIGZvciAoOzspIHsKICAgIC8vIHJlYWQgY29tbWFuZCAoMiBjaGFycykKICAgIGNoYXIgY21kWzJdOwogICAgaWYgKGluID4+IGNtZFswXSA+PiBjbWRbMV0pIHsKICAgICAgLy9jb3V0IDw8ICJERUJVRzogdG9rZW46ICIgPDwgaGV4IDw8IHRva2VuaXplKGNtZFswXSwgY21kWzFdKSA8PCBlbmRsOwogICAgICBzd2l0Y2ggKHRva2VuaXplKGNtZFswXSwgY21kWzFdKSkgewogICAgICAgIGNhc2UgVGtNRDogeyAvLyBNRDxudW0+CiAgICAgICAgICBpbnQgbnVtOwogICAgICAgICAgaWYgKGluID4+IG51bSkgewogICAgICAgICAgICBjb3V0IDw8ICJSZWNlaXZlZCAnTUQiIDw8IGRlYyA8PCBudW0gPDwgIicuIiA8PCBlbmRsOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY2VyciA8PCAiRVJST1I6IE51bWJlciBleHBlY3RlZCBhZnRlciAnTUQnISIgPDwgZW5kbDsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0gYnJlYWs7CiAgICAgICAgY2FzZSBUa1JQOiAgeyAvLyBSUDxudW0+CiAgICAgICAgICBpbnQgbnVtOwogICAgICAgICAgaWYgKGluID4+IG51bSkgewogICAgICAgICAgICBjb3V0IDw8ICJSZWNlaXZlZCAnUlAiIDw8IGRlYyA8PCBudW0gPDwgIicuIiA8PCBlbmRsOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY2VyciA8PCAiRVJST1I6IE51bWJlciBleHBlY3RlZCBhZnRlciAnTUQnISIgPDwgZW5kbDsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0gYnJlYWs7CiAgICAgICAgY2FzZSBUa1RQOiAvLyBUUAogICAgICAgICAgY291dCA8PCAiUmVjZWl2ZWQgJ1RQJy4iIDw8IGVuZGw7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRrVFQ6IC8vIFRUCiAgICAgICAgICBjb3V0IDw8ICJSZWNlaXZlZCAnVFQnLiIgPDwgZW5kbDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBjZXJyIDw8ICJFUlJPUjogV3JvbmcgY29tbWFuZCAnIiA8PCBjbWRbMF0gPDwgY21kWzFdIDw8ICInISIgPDwgZW5kbDsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY2VyciA8PCAiRVJST1I6IENvbW1hbmQgZXhwZWN0ZWQhIiA8PCBlbmRsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvLyB0cnkgdG8gcmVhZCBzZXBhcmF0b3IKICAgIGNoYXIgc2VwOwogICAgaWYgKCEoaW4gPj4gc2VwKSkgYnJlYWs7IC8vIHByb2JhYmx5IEVPRiAoZnVydGhlciBjaGVja3MgcG9zc2libGUpCiAgICBpZiAoc2VwICE9ICcsJykgewogICAgICBjZXJyIDw8ICJFUlJPUjogJywnIGV4cGVjdGVkISIgPDwgZW5kbDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gdHJ1ZTsKfQoKaW50IG1haW4oKQp7CiAgLy8gdGVzdCBzdHJpbmcKICBzdHJpbmcgc2FtcGxlKCJNRDEsVFAsUlA1LFRULFJQMTAiKTsKICAvLyByZWFkIHRlc3Qgc3RyaW5nCiAgaXN0cmluZ3N0cmVhbSBpbihzYW1wbGUpOwogIGlmIChwYXJzZShpbikpIGNvdXQgPDwgIkRvbmUuIiA8PCBlbmRsOwogIGVsc2UgY2VyciA8PCAiSW50ZXJwcmV0aW5nIGFib3J0ZWQhIiA8PCBlbmRsOwogIC8vIGRvbmUKICByZXR1cm4gMDsKfQ==