Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <string>
- #include "std_lib_facilities.h"
- void throwError(std::string message){
- std::cout << "-----------------------------------" << std::endl << message << std::endl
- << "-----------------------------------" << std::endl;
- system("PAUSE");
- }
- class Token {
- public:
- char kind;
- double value;
- Token(char ch)
- :kind(ch), value(0){}
- Token(char ch, double val)
- :kind(ch), value(val){}
- };
- class Token_stream{
- public:
- Token_stream();
- Token get();
- void putBack(Token t);
- private:
- bool full;
- Token buffer;
- };
- Token_stream::Token_stream()
- :full(false), buffer(0){}
- void Token_stream::putBack(Token t){
- if (full) throwError("putBack() into a full buffer");
- buffer = t;
- full = true;
- }
- Token Token_stream::get(){
- if (full){
- full = false;
- return buffer;
- }
- char ch;
- std::cin >> ch;
- switch (ch){
- case ';': case 'q':
- case '(': case ')': case '+':
- case '-': case '*': case '/':
- return Token(ch);
- case '.':
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':{
- std::cin.putback(ch);
- double val;
- std::cin >> val;
- return Token('8', val);
- }
- default:
- throwError("Bad token");
- }
- }
- Token_stream ts;
- double expression();
- double primary(){
- Token t = ts.get();
- switch (t.kind){
- case '(': {
- double d = expression();
- t = ts.get();
- if (t.kind != ')'){
- throwError("')' expected");
- }
- return d;
- }
- case '8':
- return t.value;
- default:
- throwError("Primary expected");
- }
- }
- double term(){
- double left = primary();
- Token t = ts.get();
- while (true){
- switch (t.kind){
- case '*':
- left *= primary();
- t = ts.get();
- break;
- case '/': {
- double d = primary();
- if (d == 0){
- throwError("You cannot divide by 0.");
- break;
- }
- left /= d;
- t = ts.get();
- break;
- }
- default:
- ts.putBack(t);
- return left;
- }
- }
- }
- double expression(){
- double left = term();
- Token t = ts.get();
- while (true){
- switch (t.kind){
- case '+':
- left += term();
- t = ts.get();
- break;
- case '-':
- left -= term();
- t = ts.get();
- break;
- default:
- ts.putBack(t);
- return left;
- }
- }
- }
- int main(){
- try{
- double val = 0;
- while (std::cin){
- Token t = ts.get();
- if (t.kind == 'q') break;
- if (t.kind == ';'){
- std::cout << "=" << val << std::endl;
- }else{
- ts.putBack(t);
- val = expression();
- }
- system("PAUSE");
- return 0;
- }
- }
- catch (std::exception& e){
- std::cerr << e.what() << std::endl;
- system("PAUSE");
- return 1;
- }
- catch (...){
- std::cerr << "Exception" << std::endl;
- system("PAUSE");
- return 2;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement