diff --git a/lang/ast/ctx.c b/lang/ast/ctx.c index 8958ede..d26efeb 100644 --- a/lang/ast/ctx.c +++ b/lang/ast/ctx.c @@ -44,13 +44,18 @@ enum ivy_status ivy_parser_push_token( } token_parse_function func = get_token_parser(state->s_node, tok); - if (!func) { - parser->p_status = IVY_ERR_BAD_SYNTAX; - return IVY_ERR_BAD_SYNTAX; + if (func) { + parser->p_status = func(parser, tok); + return parser->p_status; } - parser->p_status = func(parser, tok); - return parser->p_status; + if (tok->t_type == IVY_TOK_LINEFEED) { + ivy_token_destroy(tok); + return IVY_OK; + } + + parser->p_status = IVY_ERR_BAD_SYNTAX; + return IVY_ERR_BAD_SYNTAX; } struct parser_state *parser_get_state_generic(struct ivy_parser *parser) @@ -106,7 +111,7 @@ void parser_pop_state(struct ivy_parser *parser, enum pop_state_flags flags) struct parser_state *state = b_unbox(struct parser_state, entry, s_entry); b_queue_pop_back(&parser->p_state); - if (flags & STATE_ADD_NODE_TO_PARENT) { + if (state && (flags & STATE_ADD_NODE_TO_PARENT)) { ast_node_add_child(state->s_parent, state->s_node); } @@ -122,7 +127,7 @@ struct ivy_ast_node *ivy_parser_root_node(struct ivy_parser *parser) { b_queue_entry *entry = b_queue_first(&parser->p_state); struct parser_state *state = b_unbox(struct parser_state, entry, s_entry); - return state->s_node; + return state ? state->s_node : NULL; } struct ivy_ast_node *ivy_parser_dequeue_node(struct ivy_parser *parser) @@ -130,6 +135,10 @@ struct ivy_ast_node *ivy_parser_dequeue_node(struct ivy_parser *parser) b_queue_entry *entry = b_queue_first(&parser->p_state); struct parser_state *state = b_unbox(struct parser_state, entry, s_entry); + if (!state) { + return NULL; + } + if (state->s_node->n_type != IVY_AST_UNIT) { return NULL; }