lang: ast: adjust and clarify the precedence of token parser callbacks
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user