diff --git a/src/reader/exprstate.cpp b/src/reader/exprstate.cpp index a9642063..00fb7b78 100644 --- a/src/reader/exprstate.cpp +++ b/src/reader/exprstate.cpp @@ -418,6 +418,9 @@ namespace xo { case tokentype::tk_leftangle: case tokentype::tk_rightangle: + this->on_operator_token(tk, p_psm); + return; + case tokentype::tk_dot: assert(false); return; diff --git a/src/reader/progress_xs.cpp b/src/reader/progress_xs.cpp index 150e092e..b3c7490a 100644 --- a/src/reader/progress_xs.cpp +++ b/src/reader/progress_xs.cpp @@ -182,12 +182,41 @@ namespace xo { } case optype::op_equal: - return Apply::make_cmp_eq_i64(lhs_, rhs_); + if (lhs_->valuetype()->is_i64() && rhs_->valuetype()->is_i64()) { + return Apply::make_cmp_eq_i64(lhs_, rhs_); + } else { + this->apply_type_error(c_self_name, + op_type_, lhs_, rhs_, p_psm); + return nullptr; + } + break; case optype::op_less: + // TODO: floating-point less-than + + if (lhs_->valuetype()->is_i64() && rhs_->valuetype()->is_i64()) { + return Apply::make_cmp_lt_i64(lhs_, rhs_); + } else { + this->apply_type_error(c_self_name, + op_type_, lhs_, rhs_, p_psm); + return nullptr; + } + break; + case optype::op_less_equal: case optype::op_not_equal: + assert(false); + case optype::op_great: + if (lhs_->valuetype()->is_i64() && rhs_->valuetype()->is_i64()) { + return Apply::make_cmp_gt_i64(lhs_, rhs_); + } else { + this->apply_type_error(c_self_name, + op_type_, lhs_, rhs_, p_psm); + return nullptr; + } + break; + case optype::op_great_equal: assert(false); @@ -532,6 +561,10 @@ namespace xo { return optype::op_equal; case tokentype::tk_cmpne: return optype::op_not_equal; + case tokentype::tk_leftangle: + return optype::op_less; + case tokentype::tk_rightangle: + return optype::op_great; default: assert(false); return optype::invalid;