diff --git a/lang/include/ivy/lang/operator.h b/lang/include/ivy/lang/operator.h index 22b8055..5ff7f07 100644 --- a/lang/include/ivy/lang/operator.h +++ b/lang/include/ivy/lang/operator.h @@ -29,6 +29,17 @@ enum ivy_operator_associativity { IVY_ASSOCIATIVITY_RIGHT, }; +enum ivy_operator_location { + IVY_OP_PREFIX, + IVY_OP_INFIX, + IVY_OP_POSTFIX, +}; + +enum ivy_operator_arity { + IVY_OP_UNARY, + IVY_OP_BINARY, +}; + enum ivy_operator_id { IVY_OP_NONE = 0, IVY_OP_ASSIGN, @@ -66,6 +77,7 @@ enum ivy_operator_id { IVY_OP_UNDERSTANDS, IVY_OP_SELF_ACCESS, IVY_OP_PKG_ACCESS, + IVY_OP_MSG, }; struct ivy_operator { @@ -73,6 +85,8 @@ struct ivy_operator { unsigned int op_token; enum ivy_operator_precedence op_precedence; enum ivy_operator_associativity op_associativity; + enum ivy_operator_location op_location; + enum ivy_operator_arity op_arity; }; IVY_API const struct ivy_operator *ivy_operator_get(unsigned int token); diff --git a/lang/operator.c b/lang/operator.c index a004a12..8ca81a6 100644 --- a/lang/operator.c +++ b/lang/operator.c @@ -2,58 +2,74 @@ #include #include -#define SYM_OP(id, t, p, a) \ +#define TOK_OP(id, t, p, a, l, u) \ + [IVY_TOK_##t] = { \ + .op_id = (IVY_OP_##id), \ + .op_token = (IVY_TOK_##t), \ + .op_precedence = (IVY_PRECEDENCE_##p), \ + .op_associativity = (IVY_ASSOCIATIVITY_##a), \ + .op_location = (IVY_OP_##l), \ + .op_arity = (IVY_OP_##u), \ + } + +#define SYM_OP(id, t, p, a, l, u) \ [IVY_SYM_##t] = { \ .op_id = (IVY_OP_##id), \ .op_token = (IVY_SYM_##t), \ .op_precedence = (IVY_PRECEDENCE_##p), \ .op_associativity = (IVY_ASSOCIATIVITY_##a), \ + .op_location = (IVY_OP_##l), \ + .op_arity = (IVY_OP_##u), \ } -#define KW_OP(id, t, p, a) \ +#define KW_OP(id, t, p, a, l, u) \ [IVY_KW_##t] = { \ .op_id = (IVY_OP_##id), \ .op_token = (IVY_KW_##t), \ .op_precedence = (IVY_PRECEDENCE_##p), \ .op_associativity = (IVY_ASSOCIATIVITY_##a), \ + .op_associativity = (IVY_ASSOCIATIVITY_##a), \ + .op_location = (IVY_OP_##l), \ + .op_arity = (IVY_OP_##u), \ } /* clang-format off */ static const struct ivy_operator operators[] = { - SYM_OP(ASSIGN, EQUAL, ASSIGN, RIGHT), - SYM_OP(ADD, PLUS, ADDITION, LEFT), - SYM_OP(SUBTRACT, HYPHEN, ADDITION, LEFT), - SYM_OP(MULTIPLY, ASTERISK, MULTIPLICATION, LEFT), - SYM_OP(DIVIDE, FORWARD_SLASH, MULTIPLICATION, LEFT), - SYM_OP(MODULO, PERCENT, MULTIPLICATION, LEFT), - SYM_OP(LEFT_SHIFT, DOUBLE_LEFT_ANGLE, BITSHIFT, LEFT), - SYM_OP(RIGHT_SHIFT, DOUBLE_RIGHT_ANGLE, BITSHIFT, LEFT), - SYM_OP(BINARY_AND, AMPERSAND, BITWISE_AND, LEFT), - SYM_OP(BINARY_OR, PIPE, BITWISE_OR, LEFT), - SYM_OP(BINARY_XOR, CARET, BITWISE_XOR, LEFT), - SYM_OP(LESS_THAN, LEFT_ANGLE, COMPARISON, LEFT), - SYM_OP(GREATER_THAN, RIGHT_ANGLE, COMPARISON, LEFT), - SYM_OP(CASCADE, SEMICOLON, CASCADE, LEFT), - SYM_OP(EQUAL, DOUBLE_EQUAL, EQUALITY, LEFT), - SYM_OP(NOT_EQUAL, BANG_EQUAL, EQUALITY, LEFT), - SYM_OP(LESS_EQUAL, LEFT_ANGLE_EQUAL, COMPARISON, LEFT), - SYM_OP(GREATER_EQUAL, RIGHT_ANGLE_EQUAL, COMPARISON, LEFT), - SYM_OP(ADD_ASSIGN, PLUS_EQUAL, ASSIGN, RIGHT), - SYM_OP(SUBTRACT_ASSIGN, HYPHEN_EQUAL, ASSIGN, RIGHT), - SYM_OP(MULTIPLY_ASSIGN, ASTERISK_EQUAL, ASSIGN, RIGHT), - SYM_OP(DIVIDE_ASSIGN, FORWARD_SLASH_EQUAL, ASSIGN, RIGHT), - SYM_OP(MODULO_ASSIGN, PERCENT_EQUAL, ASSIGN, RIGHT), - SYM_OP(LEFT_SHIFT_ASSIGN, DOUBLE_LEFT_ANGLE_EQUAL, ASSIGN, RIGHT), - SYM_OP(RIGHT_SHIFT_ASSIGN, DOUBLE_RIGHT_ANGLE_EQUAL, ASSIGN, RIGHT), - SYM_OP(BINARY_AND_ASSIGN, AMPERSAND_EQUAL, ASSIGN, RIGHT), - SYM_OP(BINARY_OR_ASSIGN, PIPE_EQUAL, ASSIGN, RIGHT), - SYM_OP(BINARY_XOR_ASSIGN, CARET_EQUAL, ASSIGN, RIGHT), - KW_OP(AND, AND, LOGICAL_AND, LEFT), - KW_OP(OR, OR, LOGICAL_OR, LEFT), - KW_OP(IS, IS, IS, LEFT), - KW_OP(NOT, NOT, NOT, LEFT), - KW_OP(UNDERSTANDS, UNDERSTANDS, IS, LEFT), - SYM_OP(SELF_ACCESS, DOUBLE_COLON, SUBSCRIPT, LEFT), - SYM_OP(PKG_ACCESS, HYPHEN_RIGHT_ANGLE, SUBSCRIPT, LEFT), + TOK_OP(MSG, IDENT, UNARY_MSG, LEFT, POSTFIX, UNARY), + SYM_OP(ASSIGN, EQUAL, ASSIGN, RIGHT, INFIX, BINARY), + SYM_OP(ADD, PLUS, ADDITION, LEFT, INFIX, BINARY), + SYM_OP(SUBTRACT, HYPHEN, ADDITION, LEFT, INFIX, BINARY), + SYM_OP(MULTIPLY, ASTERISK, MULTIPLICATION, LEFT, INFIX, BINARY), + SYM_OP(DIVIDE, FORWARD_SLASH, MULTIPLICATION, LEFT, INFIX, BINARY), + SYM_OP(MODULO, PERCENT, MULTIPLICATION, LEFT, INFIX, BINARY), + SYM_OP(LEFT_SHIFT, DOUBLE_LEFT_ANGLE, BITSHIFT, LEFT, INFIX, BINARY), + SYM_OP(RIGHT_SHIFT, DOUBLE_RIGHT_ANGLE, BITSHIFT, LEFT, INFIX, BINARY), + SYM_OP(BINARY_AND, AMPERSAND, BITWISE_AND, LEFT, INFIX, BINARY), + SYM_OP(BINARY_OR, PIPE, BITWISE_OR, LEFT, INFIX, BINARY), + SYM_OP(BINARY_XOR, CARET, BITWISE_XOR, LEFT, INFIX, BINARY), + SYM_OP(LESS_THAN, LEFT_ANGLE, COMPARISON, LEFT, INFIX, BINARY), + SYM_OP(GREATER_THAN, RIGHT_ANGLE, COMPARISON, LEFT, INFIX, BINARY), + SYM_OP(CASCADE, SEMICOLON, CASCADE, LEFT, INFIX, BINARY), + SYM_OP(EQUAL, DOUBLE_EQUAL, EQUALITY, LEFT, INFIX, BINARY), + SYM_OP(NOT_EQUAL, BANG_EQUAL, EQUALITY, LEFT, INFIX, BINARY), + SYM_OP(LESS_EQUAL, LEFT_ANGLE_EQUAL, COMPARISON, LEFT, INFIX, BINARY), + SYM_OP(GREATER_EQUAL, RIGHT_ANGLE_EQUAL, COMPARISON, LEFT, INFIX, BINARY), + SYM_OP(ADD_ASSIGN, PLUS_EQUAL, ASSIGN, RIGHT, INFIX, BINARY), + SYM_OP(SUBTRACT_ASSIGN, HYPHEN_EQUAL, ASSIGN, RIGHT, INFIX, BINARY), + SYM_OP(MULTIPLY_ASSIGN, ASTERISK_EQUAL, ASSIGN, RIGHT, INFIX, BINARY), + SYM_OP(DIVIDE_ASSIGN, FORWARD_SLASH_EQUAL, ASSIGN, RIGHT, INFIX, BINARY), + SYM_OP(MODULO_ASSIGN, PERCENT_EQUAL, ASSIGN, RIGHT, INFIX, BINARY), + SYM_OP(LEFT_SHIFT_ASSIGN, DOUBLE_LEFT_ANGLE_EQUAL, ASSIGN, RIGHT, INFIX, BINARY), + SYM_OP(RIGHT_SHIFT_ASSIGN, DOUBLE_RIGHT_ANGLE_EQUAL, ASSIGN, RIGHT, INFIX, BINARY), + SYM_OP(BINARY_AND_ASSIGN, AMPERSAND_EQUAL, ASSIGN, RIGHT, INFIX, BINARY), + SYM_OP(BINARY_OR_ASSIGN, PIPE_EQUAL, ASSIGN, RIGHT, INFIX, BINARY), + SYM_OP(BINARY_XOR_ASSIGN, CARET_EQUAL, ASSIGN, RIGHT, INFIX, BINARY), + KW_OP(AND, AND, LOGICAL_AND, LEFT, INFIX, BINARY), + KW_OP(OR, OR, LOGICAL_OR, LEFT, INFIX, BINARY), + KW_OP(IS, IS, IS, LEFT, INFIX, BINARY), + KW_OP(NOT, NOT, NOT, LEFT, PREFIX, UNARY), + KW_OP(UNDERSTANDS, UNDERSTANDS, IS, LEFT, INFIX, BINARY), + SYM_OP(SELF_ACCESS, DOUBLE_COLON, SUBSCRIPT, LEFT, INFIX, BINARY), + SYM_OP(PKG_ACCESS, HYPHEN_RIGHT_ANGLE, SUBSCRIPT, LEFT, INFIX, BINARY), }; static const size_t nr_operators = sizeof operators / sizeof operators[0]; /* clang-format on */