// Prog: simple_calculator_l.cpp // evaluate arithmetic expressions involving +, - // over double operands, with left-to-right evaluation order // Syntax in BNF: // --------------- // sum = val | val "+" sum | val "-" sum #include #include #include #include char lookahead (std::istream& is) { is >> std::ws; // skip whitespaces if (is.eof()) return 0; // end of stream else return is.peek(); // next character in is } double val (std::istream& is) { double v; is >> v; assert (!is.fail()); return v; } // sum = val | val "+" sum | val "-" sum. double sum (double v, char sign, std::istream& is) { if (sign == '+') v += val (is); else if (sign == '-') v -= val (is); char c = lookahead (is); if (c == '+' || c == '-') return sum (v, c, is >> c); else return v; } int main() { std::stringstream input ("3-4-5"); // -6 std::cout << sum (0, '+', input) << "\n"; return 0; }