From 54c6fd7040de9582c9c3688ae97e3c84c7fb6f0b Mon Sep 17 00:00:00 2001 From: Max Wash Date: Fri, 6 Dec 2024 22:24:08 +0000 Subject: [PATCH] lang: ast: adjust and clarify the precedence of token parser callbacks --- lang/ast/node.c | 59 +++++++++++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/lang/ast/node.c b/lang/ast/node.c index 4cdeb89..e7f6cc6 100644 --- a/lang/ast/node.c +++ b/lang/ast/node.c @@ -117,34 +117,38 @@ enum token_expr_type get_token_expr_type(struct ivy_token *tok) token_parse_function get_token_parser( struct ivy_ast_node *context, struct ivy_token *tok) { + token_parse_function type_parser = NULL; + token_parse_function type_fallback_parser = NULL; + token_parse_function token_parser = NULL; + token_parse_function expr_begin_parser = NULL; + token_parse_function expr_other_parser = NULL; + token_parse_function expr_parser = NULL; + token_parse_function token_fallback_parser = NULL; + const struct ast_node_type *type = get_ast_node_type(context->n_type); if (!type) { return NULL; } - token_parse_function generic_parser - = type->n_token_parsers[__TOK_PARSER_INDEX(tok->t_type)]; - if (!generic_parser) { - generic_parser - = type->n_token_parsers[__TOK_PARSER_FALLBACK_INDEX]; - } + token_parser = type->n_token_parsers[__TOK_PARSER_INDEX(tok->t_type)]; + token_fallback_parser = type->n_token_parsers[__TOK_PARSER_FALLBACK_INDEX]; token_parse_function better_parser = NULL; switch (tok->t_type) { case IVY_TOK_KEYWORD: - better_parser + type_parser = type->n_keyword_parsers[__KW_PARSER_INDEX(tok->t_keyword)]; if (type->n_keyword_parsers[__KW_PARSER_FALLBACK_INDEX]) { - generic_parser + type_fallback_parser = type->n_keyword_parsers[__KW_PARSER_FALLBACK_INDEX]; } break; case IVY_TOK_SYMBOL: - better_parser + type_parser = type->n_symbol_parsers[__SYM_PARSER_INDEX(tok->t_symbol)]; if (type->n_symbol_parsers[__SYM_PARSER_FALLBACK_INDEX]) { - generic_parser + type_fallback_parser = type->n_symbol_parsers[__SYM_PARSER_FALLBACK_INDEX]; } break; @@ -152,27 +156,40 @@ token_parse_function get_token_parser( break; } - if (better_parser) { - return better_parser; - } - enum token_expr_type expr_type = get_token_expr_type(tok); switch (expr_type) { case TOK_EXPR_BEGIN: - better_parser = type->n_expr_parser.expr_begin - ? type->n_expr_parser.expr_begin - : type->n_expr_parser.expr_all; + expr_begin_parser = type->n_expr_parser.expr_begin; + expr_parser = type->n_expr_parser.expr_all; break; case TOK_EXPR_ANY: - better_parser = type->n_expr_parser.expr_other - ? type->n_expr_parser.expr_other - : type->n_expr_parser.expr_all; + expr_other_parser = type->n_expr_parser.expr_other; + expr_parser = type->n_expr_parser.expr_all; break; default: break; } - return better_parser ? better_parser : generic_parser; + bool token_has_sub_id + = (tok->t_type == IVY_TOK_KEYWORD || tok->t_type == IVY_TOK_SYMBOL); + + if (type_parser) + return type_parser; + if (token_parser && !token_has_sub_id) + return token_parser; + if (expr_begin_parser) + return expr_begin_parser; + if (expr_other_parser) + return expr_other_parser; + if (expr_parser) + return expr_parser; + if (type_fallback_parser) + return type_fallback_parser; + if (token_parser && token_has_sub_id) + return token_parser; + if (token_fallback_parser) + return token_fallback_parser; + return NULL; } struct ivy_ast_node *ast_node_create(enum ivy_ast_node_type type)