|
@@ -51,38 +51,25 @@ typedef struct {
|
|
|
const char* name;
|
|
|
} TypedOp;
|
|
|
|
|
|
-static const TypedOp TYPED_MUL = {OP_MUL_INT, OP_MUL_FLOAT, OP_NOTHING,
|
|
|
- OP_NOTHING, "*"};
|
|
|
-static const TypedOp TYPED_DIV = {OP_DIV_INT, OP_DIV_FLOAT, OP_NOTHING,
|
|
|
- OP_NOTHING, "/"};
|
|
|
-static const TypedOp TYPED_MOD = {OP_MOD_INT, OP_NOTHING, OP_NOTHING,
|
|
|
- OP_NOTHING, "%"};
|
|
|
-static const TypedOp TYPED_ADD = {OP_ADD_INT, OP_ADD_FLOAT, OP_NOTHING,
|
|
|
- OP_NOTHING, "+"};
|
|
|
-static const TypedOp TYPED_SUB = {OP_SUB_INT, OP_SUB_FLOAT, OP_NOTHING,
|
|
|
- OP_NOTHING, "-"};
|
|
|
-static const TypedOp TYPED_LESS = {OP_LESS_INT, OP_LESS_FLOAT, OP_NOTHING,
|
|
|
- OP_NOTHING, "<"};
|
|
|
-static const TypedOp TYPED_LESS_EQUAL = {OP_GREATER_INT, OP_GREATER_FLOAT,
|
|
|
- OP_NOTHING, OP_NOTHING, "<="};
|
|
|
-static const TypedOp TYPED_GREATER = {OP_GREATER_INT, OP_GREATER_FLOAT,
|
|
|
- OP_NOTHING, OP_NOTHING, ">"};
|
|
|
-static const TypedOp TYPED_GREATER_EQUAL = {OP_LESS_INT, OP_LESS_FLOAT,
|
|
|
- OP_NOTHING, OP_NOTHING, ">="};
|
|
|
-static const TypedOp TYPED_EQUAL = {OP_EQUAL_INT, OP_EQUAL_FLOAT, OP_EQUAL_BOOL,
|
|
|
- OP_EQUAL_POINTER, "=="};
|
|
|
-static const TypedOp TYPED_NOT_EQUAL = {OP_EQUAL_INT, OP_EQUAL_FLOAT,
|
|
|
- OP_EQUAL_BOOL, OP_EQUAL_POINTER, "!="};
|
|
|
-static const TypedOp TYPED_BIT_OR = {OP_BIT_OR, OP_NOTHING, OP_NOTHING,
|
|
|
- OP_NOTHING, "|"};
|
|
|
-static const TypedOp TYPED_BIT_XOR = {OP_BIT_XOR, OP_NOTHING, OP_NOTHING,
|
|
|
- OP_NOTHING, "^"};
|
|
|
-static const TypedOp TYPED_BIT_AND = {OP_BIT_AND, OP_NOTHING, OP_NOTHING,
|
|
|
- OP_NOTHING, "&"};
|
|
|
-static const TypedOp TYPED_LEFT_SHIFT = {OP_LEFT_SHIFT, OP_NOTHING, OP_NOTHING,
|
|
|
- OP_NOTHING, "<<"};
|
|
|
-static const TypedOp TYPED_RIGHT_SHIFT = {OP_RIGHT_SHIFT, OP_NOTHING,
|
|
|
- OP_NOTHING, OP_NOTHING, ">>"};
|
|
|
+#define TYPE_OP(NAME, INT, FLOAT, BOOL, POINTER, text) \
|
|
|
+ static const TypedOp TYPED_##NAME = {OP_##INT, OP_##FLOAT, OP_##BOOL, \
|
|
|
+ OP_##POINTER, text};
|
|
|
+TYPE_OP(MUL, MUL_INT, MUL_FLOAT, NOTHING, NOTHING, "*")
|
|
|
+TYPE_OP(DIV, DIV_INT, DIV_FLOAT, NOTHING, NOTHING, "/")
|
|
|
+TYPE_OP(MOD, MOD_INT, NOTHING, NOTHING, NOTHING, "%")
|
|
|
+TYPE_OP(ADD, ADD_INT, ADD_FLOAT, NOTHING, NOTHING, "+")
|
|
|
+TYPE_OP(SUB, SUB_INT, SUB_FLOAT, NOTHING, NOTHING, "-")
|
|
|
+TYPE_OP(LESS, LESS_INT, LESS_FLOAT, NOTHING, NOTHING, "<")
|
|
|
+TYPE_OP(LESS_EQUAL, GREATER_INT, GREATER_FLOAT, NOTHING, NOTHING, "<=")
|
|
|
+TYPE_OP(GREATER, GREATER_INT, GREATER_FLOAT, NOTHING, NOTHING, ">")
|
|
|
+TYPE_OP(GREATER_EQUAL, LESS_INT, LESS_FLOAT, NOTHING, NOTHING, ">=")
|
|
|
+TYPE_OP(EQUAL, EQUAL_INT, EQUAL_FLOAT, EQUAL_BOOL, EQUAL_POINTER, "==")
|
|
|
+TYPE_OP(NOT_EQUAL, EQUAL_INT, EQUAL_FLOAT, EQUAL_BOOL, EQUAL_POINTER, "!=")
|
|
|
+TYPE_OP(BIT_OR, BIT_OR, NOTHING, NOTHING, NOTHING, "|")
|
|
|
+TYPE_OP(BIT_XOR, BIT_XOR, NOTHING, NOTHING, NOTHING, "^")
|
|
|
+TYPE_OP(BIT_AND, BIT_AND, NOTHING, NOTHING, NOTHING, "&")
|
|
|
+TYPE_OP(LEFT_SHIFT, LEFT_SHIFT, NOTHING, NOTHING, NOTHING, "<<")
|
|
|
+TYPE_OP(RIGHT_SHIFT, RIGHT_SHIFT, NOTHING, NOTHING, NOTHING, ">>")
|
|
|
|
|
|
static void cError(const char* format, ...) {
|
|
|
va_list args;
|