lang: ast: add function to signal the end of token input to the parser

This commit is contained in:
2025-09-08 15:58:14 +01:00
parent 3c72527204
commit 6dfa0c7e17

View File

@@ -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);