#include "expr.h" #include "../node.h" void expr_add_terminator(struct expr_parser_state *state, unsigned short tok) { if (state->s_nr_terminators < EXPR_TERMINATOR_MAX) { state->s_terminators[state->s_nr_terminators++] = tok; } } void expr_copy_terminators( const struct expr_parser_state *src, struct expr_parser_state *dest) { dest->s_nr_terminators = src->s_nr_terminators; for (unsigned int i = 0; i < src->s_nr_terminators; i++) { dest->s_terminators[i] = src->s_terminators[i]; } } bool expr_terminates_at_token(struct expr_parser_state *state, unsigned short tok) { for (unsigned int i = 0; i < EXPR_TERMINATOR_MAX; i++) { if (state->s_terminators[i] == tok) { return true; } } return false; } static enum ivy_status add_child( struct parser_state *parent, struct ivy_ast_node *child) { struct expr_parser_state *state = (struct expr_parser_state *)parent; switch (state->s_type) { case EXPR_TYPE_STMT: return IVY_ERR_NOT_SUPPORTED; case EXPR_TYPE_ARITH: return arith_add_child(parent, child); default: return IVY_ERR_NOT_SUPPORTED; } } struct ast_node_type expr_node_ops = { .n_add_child = add_child, .n_state_size = sizeof(struct expr_parser_state), .n_node_size = sizeof(struct ivy_ast_expr_node), .n_token_parsers = { TOK_PARSER(IDENT, arith_parse_ident), TOK_PARSER(INT, arith_parse_operand), TOK_PARSER(DOUBLE, arith_parse_operand), TOK_PARSER(ATOM, arith_parse_operand), TOK_PARSER(STRING, arith_parse_operand), TOK_PARSER(STR_START, arith_parse_fstring), TOK_PARSER(SYMBOL, arith_parse_operator), TOK_PARSER(LABEL, arith_parse_label), }, .n_symbol_parsers = { SYM_PARSER(LEFT_PAREN, arith_parse_left_paren), SYM_PARSER(RIGHT_PAREN, arith_parse_right_paren), SYM_PARSER(LEFT_BRACE, arith_parse_left_brace), SYM_PARSER(RIGHT_BRACE, arith_parse_right_brace), SYM_PARSER(LEFT_BRACKET, arith_parse_left_bracket), SYM_PARSER(RIGHT_BRACKET, arith_parse_right_bracket), SYM_PARSER(SEMICOLON, arith_parse_semicolon), SYM_PARSER(UNDERSCORE, arith_parse_operand), SYM_PARSER(CARET, arith_parse_caret), /* treat colons as empty labels */ SYM_PARSER(COLON, arith_parse_label), SYM_PARSER(COMMA, arith_parse_comma), SYM_PARSER(DOT, arith_parse_dot), SYM_PARSER(BANG, arith_parse_bang), SYM_PARSER(EQUAL_RIGHT_ANGLE, arith_parse_equal_right_angle), }, .n_keyword_parsers = { /* statement keywords */ KW_PARSER(FOR, stmt_parse_for), KW_PARSER(TRY, stmt_parse_try), KW_PARSER(WHILE, stmt_parse_while), KW_PARSER(MATCH, stmt_parse_match), KW_PARSER(IF, stmt_parse_if), KW_PARSER(THEN, stmt_parse_end), KW_PARSER(ELSE, stmt_parse_end), KW_PARSER(CATCH, stmt_parse_end), KW_PARSER(FINALLY, stmt_parse_end), KW_PARSER(END, stmt_parse_end), /* operator/block keywords */ KW_PARSER(IN, arith_parse_in), KW_PARSER(DO, arith_parse_do), } };