lang: ast: add function to signal the end of token input to the parser
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user