valty
typedef std::pair<valty, bool> result;
valty val;
terminal_expr(source_location l, valty v) : expression(l), val(v) {}
expr = new binary_operator<6, std::plus<valty>>(l, "+");
expr = new binary_operator<6, std::minus<valty>>(l, "-");
expr = new divmod<std::modulus<valty>>(l, "/");
expr = new binary_operator<5, std::multiplies<valty>>(l, "*");
expr = new divmod<std::divides<valty>>(l, "/");
expr = new binary_operator<8, std::less<valty>>(l, "<");
expr = new binary_operator<8, std::less_equal<valty>>(l, "<=");
expr = new binary_operator<7, lshift<valty>>(l, "<<");
expr = new binary_operator<8, std::greater<valty>>(l, ">");
expr = new binary_operator<8, std::greater_equal<valty>>(l, ">=");
expr = new binary_operator<7, rshift<valty>>(l, ">>");
expr = new binary_operator<9, std::equal_to<valty>>(l, "==");
expr = new binary_operator<9, std::not_equal_to<valty>>(l, "!=");
expr = new binary_operator<13, std::logical_and<valty>>(l, "&&");
expr = new binary_operator<10, std::bit_and<valty>>(l, "&");
expr = new binary_operator<12, std::logical_or<valty>>(l, "||");
expr = new binary_operator<14, std::bit_or<valty>>(l, "|");
lhs.reset(new unary_operator<'+', unary_plus<valty>>(l, std::move(subexpr)));
lhs.reset(new unary_operator<'-', std::negate<valty>>(l, std::move(subexpr)));
lhs.reset(new unary_operator<'!', std::logical_not<valty>>(l, std::move(subexpr)));
lhs.reset(new unary_operator<'~', bit_not<valty>>(l, std::move(subexpr)));