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(
|
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user