#include "expression_parts.h"
#include "expr_stack.h"
// Part printer.
std::ostream & operator<<(std::ostream &strm, const Expression_Part &p)
{
p.print(strm);
return strm;
}
// Action for reading an integer.
void Operand::action(expr_stack &s) { s.push(shared_from_this()); }
// Action on reading (
void Left::action(expr_stack &s) { s.push(shared_from_this()); }
// Action on reading an operator.
void Operator::action(expr_stack &s)
{
// Perform pending operations of equal or greater precedence,
// then push ourself onto the stack.
s.reduce(m_precedence);
s.push(shared_from_this());
}
/*
* When a right paren is input, use reduce to replace the contents of
* the parenthetical with its value. Then remove the paren itself, and
* discard it, along with the one read. Throws if something goes wrong.
*/
void Right::action(expr_stack &s)
{
// Perform all operations to the matching left paren.
s.reduce();
// Remove the value, remove and discard the left paren, then
// return the value.
auto paren_value = s.pop();
if(!s.pop()->is_left())
throw bad_expression("Unbalanced right paren.");
s.push(paren_value);
}