void calculate() { const char quit = 'q'; // t.kind==quit means that t is a quit Token const char print = ';'; // t.kind==print means that t is a print Token const std::string prompt = "> "; const std::string equals = "= "; // used to indicate that what follows is an evaluation TokenStream tokenStream; std::string enterToClose = "~~"; while (std::cin) try { std::cout << prompt; Token token = tokenStream.getToken(); if (token.kind == print) token = tokenStream.getToken(); // eat ';' if (token.kind == quit) break; tokenStream.setToken(token); // reset token into tokenStream std::cout << equals << expression(tokenStream) << '\n'; } catch (std::exception& e) { std::cerr << e.what() << '\n'; // write error message tokenStream.ignore(print); } }