Files
bshell/bshell.runtime/include/bshell/runtime/operator.h
T
wash edfb3e24a3 bshell: re-organise build into three separate components
bshell: the front-end binary
bshell.runtime: contains the parser, compiler, and classes needed to run bshell scripts
bshell.core: contains the builtin commandlets and aliases
2026-05-25 10:33:29 +01:00

127 lines
2.9 KiB
C

#ifndef BSHELL_RUNTIME_OPERATOR_H_
#define BSHELL_RUNTIME_OPERATOR_H_
enum bshell_operator_precedence {
BSHELL_PRECEDENCE_MINIMUM = 0,
BSHELL_PRECEDENCE_ASSIGN,
BSHELL_PRECEDENCE_PIPELINE,
BSHELL_PRECEDENCE_LOGICAL,
BSHELL_PRECEDENCE_BITWISE,
BSHELL_PRECEDENCE_COMPARISON,
BSHELL_PRECEDENCE_ADDITION,
BSHELL_PRECEDENCE_MULTIPLICATION,
BSHELL_PRECEDENCE_NEGATE,
BSHELL_PRECEDENCE_FORMAT,
BSHELL_PRECEDENCE_RANGE,
BSHELL_PRECEDENCE_NOT,
BSHELL_PRECEDENCE_INCREMENT,
BSHELL_PRECEDENCE_ARRAY,
BSHELL_PRECEDENCE_JOIN,
BSHELL_PRECEDENCE_SPLIT,
BSHELL_PRECEDENCE_CAST,
BSHELL_PRECEDENCE_SUBSCRIPT,
BSHELL_PRECEDENCE_STATIC_ACCESS,
BSHELL_PRECEDENCE_MEMBER_ACCESS,
BSHELL_PRECEDENCE_PARENTHESIS,
};
enum bshell_operator_associativity {
BSHELL_ASSOCIATIVITY_LEFT,
BSHELL_ASSOCIATIVITY_RIGHT,
};
enum bshell_operator_location {
BSHELL_OPL_PREFIX,
BSHELL_OPL_INFIX,
BSHELL_OPL_POSTFIX,
};
enum bshell_operator_arity {
BSHELL_OPA_UNARY,
BSHELL_OPA_BINARY,
};
enum bshell_operator_id {
BSHELL_OP_NONE = 0,
BSHELL_OP_ADD,
BSHELL_OP_SUBTRACT,
BSHELL_OP_MULTIPLY,
BSHELL_OP_DIVIDE,
BSHELL_OP_MODULO,
BSHELL_OP_INCREMENT,
BSHELL_OP_DECREMENT,
BSHELL_OP_LEFT_SHIFT,
BSHELL_OP_RIGHT_SHIFT,
BSHELL_OP_BINARY_AND,
BSHELL_OP_BINARY_OR,
BSHELL_OP_BINARY_XOR,
BSHELL_OP_BINARY_NOT,
BSHELL_OP_LESS_THAN,
BSHELL_OP_GREATER_THAN,
BSHELL_OP_EQUAL,
BSHELL_OP_NOT_EQUAL,
BSHELL_OP_LESS_EQUAL,
BSHELL_OP_GREATER_EQUAL,
BSHELL_OP_ASSIGN,
BSHELL_OP_ADD_ASSIGN,
BSHELL_OP_SUBTRACT_ASSIGN,
BSHELL_OP_MULTIPLY_ASSIGN,
BSHELL_OP_DIVIDE_ASSIGN,
BSHELL_OP_MODULO_ASSIGN,
BSHELL_OP_LOGICAL_AND,
BSHELL_OP_LOGICAL_OR,
BSHELL_OP_LOGICAL_XOR,
BSHELL_OP_LOGICAL_NOT,
BSHELL_OP_RANGE,
BSHELL_OP_MATCH,
BSHELL_OP_NOTMATCH,
BSHELL_OP_REPLACE,
BSHELL_OP_LIKE,
BSHELL_OP_NOTLIKE,
BSHELL_OP_IN,
BSHELL_OP_NOTIN,
BSHELL_OP_FORMAT,
BSHELL_OP_CONTAINS,
BSHELL_OP_NOTCONTAINS,
BSHELL_OP_USPLIT,
BSHELL_OP_BSPLIT,
BSHELL_OP_UJOIN,
BSHELL_OP_BJOIN,
BSHELL_OP_IS,
BSHELL_OP_ISNOT,
BSHELL_OP_AS,
BSHELL_OP_SUBSCRIPT,
BSHELL_OP_CONDITIONAL_SUBSCRIPT,
BSHELL_OP_ARRAY_DELIMITER,
BSHELL_OP_ACCESS,
BSHELL_OP_STATIC_ACCESS,
BSHELL_OP_CONDITIONAL_ACCESS,
/* these are not real operators, and are just used internally by the
* parser. */
BSHELL_OP_CAST,
BSHELL_OP_SUBEXPR,
BSHELL_OP_PAREN,
BSHELL_OP_SCRIPTBLOCK,
BSHELL_OP_ARRAY_START,
BSHELL_OP_HASHTABLE_START,
};
struct bshell_operator_info {
enum bshell_operator_id op_id;
enum bshell_operator_precedence op_precedence;
enum bshell_operator_associativity op_associativity;
enum bshell_operator_location op_location;
enum bshell_operator_arity op_arity;
};
extern const struct bshell_operator_info *bshell_operator_get_by_id(
enum bshell_operator_id id);
extern const struct bshell_operator_info *bshell_operator_get_by_token(
unsigned int token);
extern const char *bshell_operator_id_to_string(enum bshell_operator_id op);
#endif