From 376a73dcacc1e030794cd64766bcc2d8e78d146e Mon Sep 17 00:00:00 2001 From: Lukas Jiriste Date: Thu, 18 Jul 2024 11:49:55 +0200 Subject: [PATCH] Repair some oddities in finding the first tokens --- ft_parse/ft_parsing_table_generate.c | 32 ++++++++++++++++------------ 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/ft_parse/ft_parsing_table_generate.c b/ft_parse/ft_parsing_table_generate.c index 62057fb..0396f64 100644 --- a/ft_parse/ft_parsing_table_generate.c +++ b/ft_parse/ft_parsing_table_generate.c @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/27 11:16:53 by ljiriste #+# #+# */ -/* Updated: 2024/07/11 20:15:42 by ljiriste ### ########.fr */ +/* Updated: 2024/07/18 11:47:10 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ @@ -268,12 +268,14 @@ t_ft_stat add_first(t_vec *lookahead, const t_token *token, const t_vec *rules, t_marked_grammar_rule rule; t_token token_copy; - if (is_terminal_token(token, tokens)) + if (is_terminal_token(token, tokens) || !cmp_token_type(token, &empty_token)) { token_copy = ft_token_dup(token); res = ft_vec_setinsert(lookahead, &token_copy, void_cmp_token_type); if (res != success) ft_free_token(&token_copy); + if (res == already_inside) + return (success); return (res); } rule.position = 0; @@ -313,13 +315,10 @@ t_ft_stat expand_lookahead(t_vec *lookahead, const t_marked_grammar_rule *rule, t_ft_stat res; const t_token *token; - i = rule->position + 1; - if (lookahead->size == 0) - { - res = append_token(lookahead, &empty_token); - if (res != success) - return (res); - } + res = append_token(lookahead, &empty_token); + if (res != success) + return (res); + i = rule->position; while (ft_vec_contains(lookahead, &empty_token, void_cmp_token_type) && i < rule->rule->constituents.size) { remove_empty_token(lookahead); @@ -352,16 +351,21 @@ t_ft_stat add_to_lookahead(const t_vec *lookahead, t_vec *new_lookahead) return (success); } -t_ft_stat add_lookahead(t_lr1_item *new, const t_lr1_item *item, const t_vec *rules, const t_vec *tokens) +t_ft_stat add_lookahead(t_lr1_item *new, t_lr1_item *item, const t_vec *rules, const t_vec *tokens) { t_ft_stat res; res = ft_vec_init(&new->lookahead, sizeof(t_token)); if (res != success) return (res); + ++item->core.position; res = expand_lookahead(&new->lookahead, &item->core, rules, tokens); + --item->core.position; if (res != success) + { + ft_vec_free(&new->lookahead, ft_free_token); return (res); + } if (ft_vec_contains(&new->lookahead, &empty_token, void_cmp_token_type)) { remove_empty_token(&new->lookahead); @@ -370,7 +374,7 @@ t_ft_stat add_lookahead(t_lr1_item *new, const t_lr1_item *item, const t_vec *ru return (res); } -t_ft_stat add_predictions(t_vec *closure, const t_lr1_item *item, const t_vec *rules, const t_vec *tokens) +t_ft_stat add_predictions(t_vec *closure, t_lr1_item *item, const t_vec *rules, const t_vec *tokens) { size_t i; t_lr1_item new_item; @@ -419,16 +423,16 @@ t_ft_stat fill_closure2(t_vec *closure, const t_vec *rules, const t_vec *tokens) return (success); } -t_ft_stat fill_closure(t_vec *closure, const t_vec *kernel, const t_vec *rules, const t_vec *tokens) +t_ft_stat fill_closure(t_vec *closure, t_vec *kernel, const t_vec *rules, const t_vec *tokens) { size_t i; - const t_lr1_item *item; + t_lr1_item *item; t_ft_stat res; i = 0; while (i < kernel->size) { - item = ft_vec_caccess(kernel, i); + item = ft_vec_access(kernel, i); res = add_predictions(closure, item, rules, tokens); if (res != success) return (res); -- 2.30.2