2024-12-03 13:26:55 +00:00
|
|
|
#include "expr.h"
|
|
|
|
|
|
|
|
|
|
#include "../node.h"
|
|
|
|
|
|
2024-12-07 21:28:25 +00:00
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-16 13:15:48 +00:00
|
|
|
void expr_copy_terminators(
|
|
|
|
|
const struct expr_parser_state *src, struct expr_parser_state *dest)
|
2024-12-07 21:28:25 +00:00
|
|
|
{
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-03 13:26:55 +00:00
|
|
|
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),
|
2024-12-06 13:46:41 +00:00
|
|
|
TOK_PARSER(ATOM, arith_parse_operand),
|
2024-12-03 13:26:55 +00:00
|
|
|
TOK_PARSER(STRING, arith_parse_operand),
|
2024-12-06 13:46:58 +00:00
|
|
|
TOK_PARSER(STR_START, arith_parse_fstring),
|
2024-12-03 13:26:55 +00:00
|
|
|
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),
|
2024-12-06 13:46:58 +00:00
|
|
|
SYM_PARSER(LEFT_BRACE, arith_parse_left_brace),
|
|
|
|
|
SYM_PARSER(RIGHT_BRACE, arith_parse_right_brace),
|
2024-12-06 22:26:06 +00:00
|
|
|
SYM_PARSER(LEFT_BRACKET, arith_parse_left_bracket),
|
|
|
|
|
SYM_PARSER(RIGHT_BRACKET, arith_parse_right_bracket),
|
2024-12-03 21:57:44 +00:00
|
|
|
SYM_PARSER(SEMICOLON, arith_parse_semicolon),
|
2024-12-04 22:22:25 +00:00
|
|
|
SYM_PARSER(UNDERSCORE, arith_parse_operand),
|
2024-12-06 10:01:56 +00:00
|
|
|
SYM_PARSER(CARET, arith_parse_caret),
|
2024-12-07 10:07:20 +00:00
|
|
|
/* treat colons as empty labels */
|
|
|
|
|
SYM_PARSER(COLON, arith_parse_label),
|
2024-12-04 22:22:25 +00:00
|
|
|
SYM_PARSER(COMMA, arith_parse_comma),
|
2024-12-03 13:26:55 +00:00
|
|
|
SYM_PARSER(DOT, arith_parse_dot),
|
2024-12-06 13:22:33 +00:00
|
|
|
SYM_PARSER(BANG, arith_parse_bang),
|
2024-12-04 22:22:25 +00:00
|
|
|
SYM_PARSER(EQUAL_RIGHT_ANGLE, arith_parse_equal_right_angle),
|
2024-12-03 13:26:55 +00:00
|
|
|
},
|
2024-12-04 16:35:19 +00:00
|
|
|
.n_keyword_parsers = {
|
2024-12-04 22:22:25 +00:00
|
|
|
/* statement keywords */
|
2024-12-06 10:02:31 +00:00
|
|
|
KW_PARSER(FOR, stmt_parse_for),
|
2024-12-05 19:29:21 +00:00
|
|
|
KW_PARSER(WHILE, stmt_parse_while),
|
2025-09-08 15:55:12 +01:00
|
|
|
KW_PARSER(BREAK, stmt_parse_break),
|
|
|
|
|
KW_PARSER(CONTINUE, stmt_parse_continue),
|
|
|
|
|
KW_PARSER(TRY, stmt_parse_try),
|
2024-12-04 22:22:25 +00:00
|
|
|
KW_PARSER(MATCH, stmt_parse_match),
|
2024-12-04 16:35:19 +00:00
|
|
|
KW_PARSER(IF, stmt_parse_if),
|
2024-12-05 19:29:21 +00:00
|
|
|
KW_PARSER(THEN, stmt_parse_end),
|
|
|
|
|
KW_PARSER(ELSE, stmt_parse_end),
|
2025-04-24 09:45:26 +01:00
|
|
|
KW_PARSER(ELIF, stmt_parse_end),
|
2025-01-16 13:15:48 +00:00
|
|
|
KW_PARSER(CATCH, stmt_parse_end),
|
|
|
|
|
KW_PARSER(FINALLY, stmt_parse_end),
|
2024-12-04 16:35:19 +00:00
|
|
|
KW_PARSER(END, stmt_parse_end),
|
2024-12-04 22:22:25 +00:00
|
|
|
|
2025-09-08 15:56:03 +01:00
|
|
|
/* keyword constants */
|
|
|
|
|
KW_PARSER(TRUE, arith_parse_operand),
|
|
|
|
|
KW_PARSER(FALSE, arith_parse_operand),
|
|
|
|
|
KW_PARSER(NULL, arith_parse_operand),
|
|
|
|
|
|
2024-12-06 10:02:31 +00:00
|
|
|
/* operator/block keywords */
|
2024-12-04 22:22:25 +00:00
|
|
|
KW_PARSER(IN, arith_parse_in),
|
2025-04-10 13:04:12 +01:00
|
|
|
KW_PARSER(IS, arith_parse_operator),
|
2024-12-06 10:02:31 +00:00
|
|
|
KW_PARSER(DO, arith_parse_do),
|
2024-12-04 16:35:19 +00:00
|
|
|
}
|
2024-12-03 13:26:55 +00:00
|
|
|
};
|