#include <iostream>
#include <iomanip>
#include <map>
#include <string>
enum token_t
{
END,
PLUS,
NUMBER,
D,
DR,
R,
A,
// ...
};
// ...
using keyword_to_token_t = std::map < std::string, token_t >;
keyword_to_token_t kwtt =
{
{"A", A},
{"D", D},
{"R", R},
{"DR", DR}
// ...
};
// ...
std::string s;
int n;
// ...
token_t get_token( std::istream& is )
{
char c;
std::ws( is ); // discard white-space
if ( !is.get( c ) ) // read a character
return END; // failed to read or eof
// analyze the character
switch ( c )
{
case '+': // simple token
return PLUS;
case '0': case '1': // rest of digits
is.putback( c ); // it starts with a digit: it must be a number, so put it back
is >> n; // and let the library to the hard work
return NUMBER;
//...
default: // keyword
is.putback( c );
is >> s;
if ( kwtt.find( s ) == kwtt.end() )
throw "keyword not found";
return kwtt[ s ];
}
}
int main()
{
try
{
while ( get_token( std::cin ) )
;
std::cout << "valid tokens";
}
catch ( const char* e )
{
std::cout << e;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHN0cmluZz4KCmVudW0gdG9rZW5fdAp7CiAgRU5ELAogIFBMVVMsCiAgTlVNQkVSLAogIEQsCiAgRFIsCiAgUiwKICBBLAoKICAvLyAuLi4KfTsKCi8vIC4uLgoKdXNpbmcga2V5d29yZF90b190b2tlbl90ID0gc3RkOjptYXAgPCBzdGQ6OnN0cmluZywgdG9rZW5fdCA+OwoKa2V5d29yZF90b190b2tlbl90IGt3dHQgPQp7CiAgeyJBIiwgQX0sCiAgeyJEIiwgRH0sCiAgeyJSIiwgUn0sCiAgeyJEUiIsIERSfQoKICAvLyAuLi4KCn07CgovLyAuLi4KCnN0ZDo6c3RyaW5nIHM7CmludCBuOwoKLy8gLi4uCgp0b2tlbl90IGdldF90b2tlbiggc3RkOjppc3RyZWFtJiBpcyApCnsKICBjaGFyIGM7CgogIHN0ZDo6d3MoIGlzICk7IC8vIGRpc2NhcmQgd2hpdGUtc3BhY2UKCiAgaWYgKCAhaXMuZ2V0KCBjICkgKSAvLyByZWFkIGEgY2hhcmFjdGVyCiAgICByZXR1cm4gRU5EOyAvLyBmYWlsZWQgdG8gcmVhZCBvciBlb2YKCiAgLy8gYW5hbHl6ZSB0aGUgY2hhcmFjdGVyCiAgc3dpdGNoICggYyApCiAgewogIGNhc2UgJysnOiAvLyBzaW1wbGUgdG9rZW4KICAgIHJldHVybiBQTFVTOwoKICBjYXNlICcwJzogY2FzZSAnMSc6IC8vIHJlc3Qgb2YgZGlnaXRzCiAgICBpcy5wdXRiYWNrKCBjICk7IC8vIGl0IHN0YXJ0cyB3aXRoIGEgZGlnaXQ6IGl0IG11c3QgYmUgYSBudW1iZXIsIHNvIHB1dCBpdCBiYWNrIAogICAgaXMgPj4gbjsgLy8gYW5kIGxldCB0aGUgbGlicmFyeSB0byB0aGUgaGFyZCB3b3JrCiAgICByZXR1cm4gTlVNQkVSOwogICAgLy8uLi4KCiAgZGVmYXVsdDogLy8ga2V5d29yZAogICAgaXMucHV0YmFjayggYyApOwogICAgaXMgPj4gczsKICAgIGlmICgga3d0dC5maW5kKCBzICkgPT0ga3d0dC5lbmQoKSApCiAgICAgIHRocm93ICJrZXl3b3JkIG5vdCBmb3VuZCI7CiAgICByZXR1cm4ga3d0dFsgcyBdOwogIH0KfQoKaW50IG1haW4oKQp7CiAgdHJ5CiAgewogICAgd2hpbGUgKCBnZXRfdG9rZW4oIHN0ZDo6Y2luICkgKQogICAgICA7CiAgICBzdGQ6OmNvdXQgPDwgInZhbGlkIHRva2VucyI7CiAgfQogIGNhdGNoICggY29uc3QgY2hhciogZSApCiAgewogICAgc3RkOjpjb3V0IDw8IGU7CiAgfQp9Cg==