#include "expr.h" #include "../node.h" 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(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(END, stmt_parse_end), /* operator/block keywords */ KW_PARSER(IN, arith_parse_in), KW_PARSER(DO, arith_parse_do), } };