#include <cctype>
#include <iostream>
#include <stdexcept>
#include <string>
struct parse_error : std::runtime_error
{
parse_error(std::string const& what)
: runtime_error(what)
{}
};
void skip_spaces(char const*& line)
{
while(std::isspace(*line))
++line;
}
// primary-expression = number | '(' sum ')'
// product = primary-expression ['*' | '/' product]
// sum = product ['+' | '-' sum]
double parse_number(char const*& line)
{
return std::strtod(line, const_cast<char**>(&line));
}
double parse_sum(char const*& line);
double parse_primary_expression(char const*& line)
{
skip_spaces(line);
if(*line == '(')
{
double result = parse_sum(++line);
skip_spaces(line);
if(*line != ')')
throw parse_error("expected closing parenthesis here: " + std::string(line));
++line;
return result;
}
else if(std::isdigit(*line))
return parse_number(line);
}
double parse_product(char const*& line)
{
double first = parse_primary_expression(line);
skip_spaces(line);
for(;;)
{
skip_spaces(line);
if(*line == '*')
first *= parse_primary_expression(++line);
else if(*line == '/')
first /= parse_primary_expression(++line);
else break;
}
return first;
}
double parse_sum(char const*& line)
{
double first = parse_product(line);
for(;;)
{
skip_spaces(line);
if(*line == '+')
first += parse_product(++line);
else if(*line == '-')
first -= parse_product(++line);
else break;
}
return first;
}
double parse(char const* line)
{
double result = parse_sum(line);
skip_spaces(line);
if(*line)
throw parse_error("unexpected character here: " + std::string(line));
return result;
}
int main()
{
for(std::string line; std::getline(std::cin, line);)
{
try
{
std::cout << parse(line.c_str()) << '\n';
}
catch(parse_error const& e)
{
std::cout << e.what() << '\n';
}
}
}