calc: generate calculators
[m6w6/ext-psi] / src / types / num_exp.c
index aba528853b6ec4f7208ee8c18089d3365bb20106..20a09c6900c6cdc09dfc7899d3dd257b2dd7bb02 100644 (file)
@@ -87,6 +87,16 @@ struct psi_num_exp *psi_num_exp_copy(struct psi_num_exp *exp)
                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:
@@ -129,6 +139,16 @@ void psi_num_exp_free(struct psi_num_exp **c_ptr)
                        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:
@@ -155,39 +175,57 @@ void psi_num_exp_free(struct psi_num_exp **c_ptr)
        }
 }
 
-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);
@@ -204,7 +242,7 @@ void psi_num_exp_dump(int fd, struct psi_num_exp *exp)
 
        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;
 
@@ -214,6 +252,17 @@ void psi_num_exp_dump(int fd, struct psi_num_exp *exp)
                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:
@@ -224,7 +273,7 @@ void psi_num_exp_dump(int fd, struct psi_num_exp *exp)
        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;
 
@@ -241,12 +290,37 @@ bool psi_num_exp_validate(struct psi_data *data, struct psi_num_exp *exp,
        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;
 
@@ -297,6 +371,16 @@ bool psi_num_exp_validate(struct psi_data *data, struct psi_num_exp *exp,
                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:
@@ -346,6 +430,7 @@ static inline void psi_impl_val_dump(token_t t, impl_val *res,
                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", " = ");
@@ -379,7 +464,7 @@ static void psi_num_exp_reduce(struct psi_num_exp *exp, struct psi_plist **outpu
                        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;
@@ -388,11 +473,11 @@ static void psi_num_exp_reduce(struct psi_num_exp *exp, struct psi_plist **outpu
        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;
@@ -405,11 +490,11 @@ static void psi_num_exp_reduce(struct psi_num_exp *exp, struct psi_plist **outpu
                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;
@@ -441,7 +526,7 @@ token_t psi_num_exp_exec(struct psi_num_exp *exp, impl_val *res,
        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");
@@ -455,7 +540,7 @@ token_t psi_num_exp_exec(struct psi_num_exp *exp, impl_val *res,
                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);
@@ -463,6 +548,16 @@ token_t psi_num_exp_exec(struct psi_num_exp *exp, impl_val *res,
                        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:
@@ -477,7 +572,7 @@ token_t psi_num_exp_exec(struct psi_num_exp *exp, impl_val *res,
                        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(