/* One operand, one result. */ #define UNARY_OPERATOR(NAME) DEFINE_OPERATOR (NAME, 0, OP_NO_FLAGS, 0) /* Two operands, one result. */ #define BINARY_OPERATOR(NAME) DEFINE_OPERATOR (NAME, -1, OP_NO_FLAGS, 0) /* Three operands, one result. */ #define TERNARY_OPERATOR(NAME) DEFINE_OPERATOR (NAME, -2, OP_NO_FLAGS, 0) /* Variable operands, one result. */ #define NARY_OPERATOR(NAME, FLAGS, ARGS) \ DEFINE_OPERATOR (NAME, 0, OP_VAR_ARGS | OP_ABSORB_MISS | (FLAGS), ARGS) /* No operands, one result. */ #define TERMINAL(NAME, ARGS) DEFINE_OPERATOR (NAME, +1, OP_NO_FLAGS, ARGS) /* Basic operators. */ BINARY_OPERATOR (ADD) BINARY_OPERATOR (SUB) DEFINE_OPERATOR (MUL, -1, OP_ABSORB_MISS, 0) DEFINE_OPERATOR (DIV, -1, OP_ABSORB_MISS, 0) DEFINE_OPERATOR (MOD, -1, OP_ABSORB_MISS, 0) DEFINE_OPERATOR (POW, -1, OP_ABSORB_MISS, 0) DEFINE_OPERATOR (AND, -1, OP_ABSORB_MISS, 0) DEFINE_OPERATOR (OR, -1, OP_ABSORB_MISS, 0) UNARY_OPERATOR (NOT) /* Numeric relational operators. */ BINARY_OPERATOR (EQ) BINARY_OPERATOR (GE) BINARY_OPERATOR (GT) BINARY_OPERATOR (LE) BINARY_OPERATOR (LT) BINARY_OPERATOR (NE) /* String relational operators. */ BINARY_OPERATOR (EQ_STRING) BINARY_OPERATOR (GE_STRING) BINARY_OPERATOR (GT_STRING) BINARY_OPERATOR (LE_STRING) BINARY_OPERATOR (LT_STRING) BINARY_OPERATOR (NE_STRING) /* Unary functions. */ UNARY_OPERATOR (NEG) UNARY_OPERATOR (ABS) UNARY_OPERATOR (ARCOS) UNARY_OPERATOR (ARSIN) UNARY_OPERATOR (ARTAN) UNARY_OPERATOR (COS) UNARY_OPERATOR (EXP) UNARY_OPERATOR (LG10) UNARY_OPERATOR (LN) UNARY_OPERATOR (MOD10) UNARY_OPERATOR (RND) UNARY_OPERATOR (SIN) UNARY_OPERATOR (SQRT) UNARY_OPERATOR (TAN) UNARY_OPERATOR (TRUNC) /* N-ary numeric functions. */ NARY_OPERATOR (ANY, 0, 1) NARY_OPERATOR (ANY_STRING, 0, 1) NARY_OPERATOR (CFVAR, OP_MIN_ARGS, 2) NARY_OPERATOR (MAX, OP_MIN_ARGS, 2) NARY_OPERATOR (MAX_STRING, 0, 1) NARY_OPERATOR (MEAN, OP_MIN_ARGS, 2) NARY_OPERATOR (MIN, OP_MIN_ARGS, 2) NARY_OPERATOR (MIN_STRING, 0, 1) NARY_OPERATOR (NMISS, 0, 1) NARY_OPERATOR (NVALID, 0, 1) NARY_OPERATOR (RANGE, 0, 1) NARY_OPERATOR (RANGE_STRING, 0, 1) NARY_OPERATOR (SD, OP_MIN_ARGS, 2) NARY_OPERATOR (SUM, OP_MIN_ARGS, 2) NARY_OPERATOR (VARIANCE, OP_MIN_ARGS, 2) /* Time construction & extraction functions. */ TERNARY_OPERATOR (TIME_HMS) UNARY_OPERATOR (CTIME_DAYS) UNARY_OPERATOR (CTIME_HOURS) UNARY_OPERATOR (CTIME_MINUTES) UNARY_OPERATOR (CTIME_SECONDS) UNARY_OPERATOR (TIME_DAYS) /* Date construction functions. */ TERNARY_OPERATOR (DATE_DMY) TERNARY_OPERATOR (DATE_MDY) BINARY_OPERATOR (DATE_MOYR) BINARY_OPERATOR (DATE_QYR) BINARY_OPERATOR (DATE_WKYR) BINARY_OPERATOR (DATE_YRDAY) TERNARY_OPERATOR (YRMODA) /* Date extraction functions. */ UNARY_OPERATOR (XDATE_DATE) UNARY_OPERATOR (XDATE_HOUR) UNARY_OPERATOR (XDATE_JDAY) UNARY_OPERATOR (XDATE_MDAY) UNARY_OPERATOR (XDATE_MINUTE) UNARY_OPERATOR (XDATE_MONTH) UNARY_OPERATOR (XDATE_QUARTER) UNARY_OPERATOR (XDATE_SECOND) UNARY_OPERATOR (XDATE_TDAY) UNARY_OPERATOR (XDATE_TIME) UNARY_OPERATOR (XDATE_WEEK) UNARY_OPERATOR (XDATE_WKDAY) UNARY_OPERATOR (XDATE_YEAR) /* String functions. */ NARY_OPERATOR (CONCAT, 0, 0) BINARY_OPERATOR (INDEX_2) TERNARY_OPERATOR (INDEX_3) BINARY_OPERATOR (RINDEX_2) TERNARY_OPERATOR (RINDEX_3) UNARY_OPERATOR (LENGTH) UNARY_OPERATOR (LOWER) UNARY_OPERATOR (UPPER) DEFINE_OPERATOR (LPAD, -2, OP_ABSORB_MISS, 0) DEFINE_OPERATOR (RPAD, -2, OP_ABSORB_MISS, 0) UNARY_OPERATOR (LTRIM) UNARY_OPERATOR (RTRIM) DEFINE_OPERATOR (NUMBER, -1, OP_FMT_SPEC, 3) DEFINE_OPERATOR (STRING, 0, OP_FMT_SPEC | OP_ABSORB_MISS, 3) DEFINE_OPERATOR (SUBSTR_2, -1, OP_ABSORB_MISS, 0) DEFINE_OPERATOR (SUBSTR_3, -2, OP_ABSORB_MISS, 0) /* Artificial. */ UNARY_OPERATOR (SQUARE) UNARY_OPERATOR (NUM_TO_BOOL) /* Weirdness. */ UNARY_OPERATOR (NORMAL) UNARY_OPERATOR (UNIFORM) DEFINE_OPERATOR (SYSMIS, 0, OP_ABSORB_MISS, 0) DEFINE_OPERATOR (VEC_ELEM_NUM, 0, OP_MIN_ARGS, 1) DEFINE_OPERATOR (VEC_ELEM_STR, 0, OP_MIN_ARGS, 1) /* Terminals. */ TERMINAL (NUM_CON, 0) TERMINAL (STR_CON, 0) TERMINAL (NUM_VAR, 0) TERMINAL (STR_VAR, 0) TERMINAL (NUM_LAG, 1) TERMINAL (STR_LAG, 1) TERMINAL (NUM_SYS, 1) TERMINAL (NUM_VAL, 1) TERMINAL (STR_MIS, 1) TERMINAL (CASENUM, 0) #undef DEFINE_OPERATOR