Lexer::Token Lexer::Token_stream::get() { char ch; do { if (!ip->get(ch)) return ct={Kind::end}; } while (ch != '\n' && isspace(ch)); switch (ch){ case ';': case '\n': return ct={Kind::print}; case '*': case '/': case '+': case '-': case '(': case ')': case '=': return ct={static_cast<Kind>(ch)}; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': ip->putback(ch); *ip >> ct.number_value; ct.kind = Kind::number; return ct; default: if (isalpha(ch)){ ct.string_value = ch; while (ip->get(ch)) if (isalnum(ch)) ct.string_value += ch; else { ip->putback(ch); break; } ct.kind = {Kind::name}; return ct; } error("bad token"); return ct={Kind::print}; } }