diff --git a/lang/ast/ctx.c b/lang/ast/ctx.c index 24e6ae2..32b2b0f 100644 --- a/lang/ast/ctx.c +++ b/lang/ast/ctx.c @@ -83,6 +83,10 @@ enum ivy_status ivy_parser_get_status(struct ivy_parser *parser) enum ivy_status ivy_parser_push_token( struct ivy_parser *parser, struct ivy_token *tok) { + if (!tok) { + return ivy_parser_push_eof(parser); + } + while (true) { struct parser_state *state = parser_get_state_generic(parser); if (!state) { @@ -119,6 +123,52 @@ enum ivy_status ivy_parser_push_token( return parser->p_status; } +enum ivy_status ivy_parser_push_eof(struct ivy_parser *parser) +{ + while (true) { + struct parser_state *state = parser_get_state_generic(parser); + if (!state) { + parser->p_status = IVY_ERR_INTERNAL_FAILURE; + break; + } + + token_parse_function func = NULL; + struct ivy_token tok = {0}; + + switch (state->s_node->n_type) { + case IVY_AST_EXPR: + case IVY_AST_COND_GROUP: + case IVY_AST_FOR_LOOP: + case IVY_AST_WHILE_LOOP: + tok.t_type = IVY_TOK_SYMBOL; + tok.t_symbol = IVY_SYM_DOT; + func = get_token_parser(state->s_node, &tok); + break; + default: + break; + } + + if (!func) { + break; + } + + struct token_parse_result result = func(parser, &tok); + parser->p_status = result.r_status; + + if (result.r_flags & PARSE_REPEAT_TOKEN) { + continue; + } + +#ifdef IVY_LANG_DEBUG + debug_printf("states (after token)\n"); + print_state_stack(parser); +#endif + break; + } + + return parser->p_status; +} + struct parser_state *parser_get_state_generic(struct ivy_parser *parser) { b_queue_entry *entry = b_queue_last(&parser->p_state);