lang: ast: adjust and clarify the precedence of token parser callbacks

This commit is contained in:
2024-12-06 22:24:08 +00:00
parent 4c36615bc1
commit 54c6fd7040

View File

@@ -117,34 +117,38 @@ enum token_expr_type get_token_expr_type(struct ivy_token *tok)
token_parse_function get_token_parser( token_parse_function get_token_parser(
struct ivy_ast_node *context, struct ivy_token *tok) 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); const struct ast_node_type *type = get_ast_node_type(context->n_type);
if (!type) { if (!type) {
return NULL; return NULL;
} }
token_parse_function generic_parser
= type->n_token_parsers[__TOK_PARSER_INDEX(tok->t_type)];
if (!generic_parser) { token_parser = type->n_token_parsers[__TOK_PARSER_INDEX(tok->t_type)];
generic_parser token_fallback_parser = type->n_token_parsers[__TOK_PARSER_FALLBACK_INDEX];
= type->n_token_parsers[__TOK_PARSER_FALLBACK_INDEX];
}
token_parse_function better_parser = NULL; token_parse_function better_parser = NULL;
switch (tok->t_type) { switch (tok->t_type) {
case IVY_TOK_KEYWORD: case IVY_TOK_KEYWORD:
better_parser type_parser
= type->n_keyword_parsers[__KW_PARSER_INDEX(tok->t_keyword)]; = type->n_keyword_parsers[__KW_PARSER_INDEX(tok->t_keyword)];
if (type->n_keyword_parsers[__KW_PARSER_FALLBACK_INDEX]) { if (type->n_keyword_parsers[__KW_PARSER_FALLBACK_INDEX]) {
generic_parser type_fallback_parser
= type->n_keyword_parsers[__KW_PARSER_FALLBACK_INDEX]; = type->n_keyword_parsers[__KW_PARSER_FALLBACK_INDEX];
} }
break; break;
case IVY_TOK_SYMBOL: case IVY_TOK_SYMBOL:
better_parser type_parser
= type->n_symbol_parsers[__SYM_PARSER_INDEX(tok->t_symbol)]; = type->n_symbol_parsers[__SYM_PARSER_INDEX(tok->t_symbol)];
if (type->n_symbol_parsers[__SYM_PARSER_FALLBACK_INDEX]) { if (type->n_symbol_parsers[__SYM_PARSER_FALLBACK_INDEX]) {
generic_parser type_fallback_parser
= type->n_symbol_parsers[__SYM_PARSER_FALLBACK_INDEX]; = type->n_symbol_parsers[__SYM_PARSER_FALLBACK_INDEX];
} }
break; break;
@@ -152,27 +156,40 @@ token_parse_function get_token_parser(
break; break;
} }
if (better_parser) {
return better_parser;
}
enum token_expr_type expr_type = get_token_expr_type(tok); enum token_expr_type expr_type = get_token_expr_type(tok);
switch (expr_type) { switch (expr_type) {
case TOK_EXPR_BEGIN: case TOK_EXPR_BEGIN:
better_parser = type->n_expr_parser.expr_begin expr_begin_parser = type->n_expr_parser.expr_begin;
? type->n_expr_parser.expr_begin expr_parser = type->n_expr_parser.expr_all;
: type->n_expr_parser.expr_all;
break; break;
case TOK_EXPR_ANY: case TOK_EXPR_ANY:
better_parser = type->n_expr_parser.expr_other expr_other_parser = type->n_expr_parser.expr_other;
? type->n_expr_parser.expr_other expr_parser = type->n_expr_parser.expr_all;
: type->n_expr_parser.expr_all;
break; break;
default: default:
break; 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) struct ivy_ast_node *ast_node_create(enum ivy_ast_node_type type)