cpy->data.u = psi_num_exp_copy(exp->data.u);
break;
+ case PSI_T_OR:
+ case PSI_T_AND:
+
+ case PSI_T_CMP_EQ:
+ case PSI_T_CMP_NE:
+ case PSI_T_CMP_LE:
+ case PSI_T_CMP_GE:
+ case PSI_T_RCHEVR:
+ case PSI_T_LCHEVR:
+
case PSI_T_PIPE:
case PSI_T_CARET:
case PSI_T_AMPERSAND:
psi_num_exp_free(&c->data.u);
break;
+ case PSI_T_OR:
+ case PSI_T_AND:
+
+ case PSI_T_CMP_EQ:
+ case PSI_T_CMP_NE:
+ case PSI_T_CMP_LE:
+ case PSI_T_CMP_GE:
+ case PSI_T_RCHEVR:
+ case PSI_T_LCHEVR:
+
case PSI_T_PIPE:
case PSI_T_CARET:
case PSI_T_AMPERSAND:
}
}
-static inline wint_t psi_num_exp_op_tok(token_t op)
+static inline const char *psi_num_exp_op_tok(token_t op)
{
switch (op) {
case PSI_T_NOT:
- return L'!';
+ return "!";
case PSI_T_TILDE:
- return L'~';
+ return "~";
case PSI_T_LPAREN:
- return L'(';
+ return "(";
case PSI_T_PIPE:
- return L'|';
+ return "|";
case PSI_T_CARET:
- return L'^';
+ return "^";
case PSI_T_AMPERSAND:
- return L'&';
+ return "&";
case PSI_T_LSHIFT:
- return L'«';
+ return "<<";
case PSI_T_RSHIFT:
- return L'»';
+ return ">>";
case PSI_T_PLUS:
- return L'+';
+ return "+";
case PSI_T_MINUS:
- return L'-';
+ return "-";
case PSI_T_ASTERISK:
- return L'*';
+ return "*";
case PSI_T_SLASH:
- return L'/';
+ return "/";
case PSI_T_MODULO:
- return L'%';
+ return "%";
+
+ case PSI_T_OR:
+ return "||";
+ case PSI_T_AND:
+ return "&&";
+
+ case PSI_T_CMP_EQ:
+ return "==";
+ case PSI_T_CMP_NE:
+ return "!=";
+ case PSI_T_CMP_LE:
+ return "<=";
+ case PSI_T_CMP_GE:
+ return ">=";
+ case PSI_T_RCHEVR:
+ return ">";
+ case PSI_T_LCHEVR:
+ return "<";
default:
assert(0);
case PSI_T_NOT:
case PSI_T_TILDE:
- dprintf(fd, "%lc", psi_num_exp_op_tok(exp->op));
+ dprintf(fd, "%s", psi_num_exp_op_tok(exp->op));
psi_num_exp_dump(fd, exp->data.u);
break;
dprintf(fd, ")");
break;
+
+ case PSI_T_OR:
+ case PSI_T_AND:
+
+ case PSI_T_CMP_EQ:
+ case PSI_T_CMP_NE:
+ case PSI_T_CMP_LE:
+ case PSI_T_CMP_GE:
+ case PSI_T_RCHEVR:
+ case PSI_T_LCHEVR:
+
case PSI_T_PIPE:
case PSI_T_CARET:
case PSI_T_AMPERSAND:
case PSI_T_ASTERISK:
case PSI_T_SLASH:
psi_num_exp_dump(fd, exp->data.b.lhs);
- dprintf(fd, " %lc ", psi_num_exp_op_tok(exp->op));
+ dprintf(fd, " %s ", psi_num_exp_op_tok(exp->op));
psi_num_exp_dump(fd, exp->data.b.rhs);
break;
if (exp->op) {
switch (exp->op) {
case PSI_T_NOT:
- exp->calc = psi_calc_not;
+ exp->calc = psi_calc_bool_not;
break;
case PSI_T_TILDE:
exp->calc = psi_calc_bin_not;
break;
+ case PSI_T_OR:
+ exp->calc = psi_calc_bool_or;
+ break;
+ case PSI_T_AND:
+ exp->calc = psi_calc_bool_and;
+ break;
+ case PSI_T_CMP_EQ:
+ exp->calc = psi_calc_cmp_eq;
+ break;
+ case PSI_T_CMP_NE:
+ exp->calc = psi_calc_cmp_ne;
+ break;
+ case PSI_T_CMP_LE:
+ exp->calc = psi_calc_cmp_le;
+ break;
+ case PSI_T_CMP_GE:
+ exp->calc = psi_calc_cmp_ge;
+ break;
+ case PSI_T_LCHEVR:
+ exp->calc = psi_calc_cmp_lt;
+ break;
+ case PSI_T_RCHEVR:
+ exp->calc = psi_calc_cmp_gt;
+ break;
+
case PSI_T_LPAREN:
break;
return psi_num_exp_validate(data, exp->data.u, impl, cb_decl, current_let, current_set, current_enum);
break;
+ case PSI_T_OR:
+ case PSI_T_AND:
+
+ case PSI_T_CMP_EQ:
+ case PSI_T_CMP_NE:
+ case PSI_T_CMP_LE:
+ case PSI_T_CMP_GE:
+ case PSI_T_RCHEVR:
+ case PSI_T_LCHEVR:
+
case PSI_T_PIPE:
case PSI_T_CARET:
case PSI_T_AMPERSAND:
assert(0);
}
}
+
static inline void psi_num_exp_verify_result(token_t t, impl_val *res, struct psi_call_frame *frame)
{
if (frame) PSI_DEBUG_PRINT(frame->context, "%s", " = ");
if (entry.type == PSI_T_LPAREN) {
break;
}
- if (frame) PSI_DEBUG_PRINT(frame->context, " %lc", psi_num_exp_op_tok(entry.type));
+ if (frame) PSI_DEBUG_PRINT(frame->context, " %s", psi_num_exp_op_tok(entry.type));
output = psi_plist_add(output, &entry);
}
break;
case PSI_T_TILDE:
while (psi_plist_top(input, &entry)) {
/* bail out if exp->op >= entry.type */
- if (psi_num_exp_op_cmp(exp->op, entry.type) != 1) {
+ if (psi_calc_oper(exp->op, entry.type) != 1) {
break;
}
psi_plist_pop(input, NULL);
- if (frame) PSI_DEBUG_PRINT(frame->context, " %lc", psi_num_exp_op_tok(entry.type));
+ if (frame) PSI_DEBUG_PRINT(frame->context, " %s", psi_num_exp_op_tok(entry.type));
output = psi_plist_add(output, &entry);
}
entry.type = exp->op;
psi_num_exp_reduce(exp->data.b.lhs, &output, &input, frame);
while (psi_plist_top(input, &entry)) {
/* bail out if exp->op > entry.type */
- if (psi_num_exp_op_cmp(exp->op, entry.type) == -1) {
+ if (psi_calc_oper(exp->op, entry.type) == -1) {
break;
}
psi_plist_pop(input, NULL);
- if (frame) PSI_DEBUG_PRINT(frame->context, " %lc", psi_num_exp_op_tok(entry.type));
+ if (frame) PSI_DEBUG_PRINT(frame->context, " %s", psi_num_exp_op_tok(entry.type));
output = psi_plist_add(output, &entry);
}
entry.type = exp->op;
psi_num_exp_reduce(exp, &output, &input, frame);
while (psi_plist_pop(input, &entry)) {
- if (frame) PSI_DEBUG_PRINT(frame->context, " %lc", psi_num_exp_op_tok(entry.type));
+ if (frame) PSI_DEBUG_PRINT(frame->context, " %s", psi_num_exp_op_tok(entry.type));
output = psi_plist_add(output, &entry);
}
if (frame) PSI_DEBUG_PRINT(frame->context, "%s", "\n");
case PSI_T_NOT:
case PSI_T_TILDE:
psi_plist_pop(input, &rhs);
- if (frame) PSI_DEBUG_PRINT(frame->context, " %lc", psi_num_exp_op_tok(entry.type));
+ if (frame) PSI_DEBUG_PRINT(frame->context, " %s", psi_num_exp_op_tok(entry.type));
psi_impl_val_dump(rhs.type, &rhs.data.value, frame);
entry.type = entry.data.calc(rhs.type, &rhs.data.value, 0, NULL, &entry.data.value);
psi_num_exp_verify_result(entry.type, &entry.data.value, frame);
break;
+ case PSI_T_OR:
+ case PSI_T_AND:
+
+ case PSI_T_CMP_EQ:
+ case PSI_T_CMP_NE:
+ case PSI_T_CMP_LE:
+ case PSI_T_CMP_GE:
+ case PSI_T_RCHEVR:
+ case PSI_T_LCHEVR:
+
case PSI_T_PIPE:
case PSI_T_CARET:
case PSI_T_AMPERSAND:
psi_plist_pop(input, &lhs);
psi_impl_val_dump(lhs.type, &lhs.data.value, frame);
- if (frame) PSI_DEBUG_PRINT(frame->context, " %lc", psi_num_exp_op_tok(entry.type));
+ if (frame) PSI_DEBUG_PRINT(frame->context, " %s", psi_num_exp_op_tok(entry.type));
psi_impl_val_dump(rhs.type, &rhs.data.value, frame);
entry.type = entry.data.calc(