Repair some oddities in finding the first tokens
authorLukas Jiriste <ljiriste@student.42prague.com>
Thu, 18 Jul 2024 09:49:55 +0000 (11:49 +0200)
committerLukas Jiriste <ljiriste@student.42prague.com>
Sun, 21 Jul 2024 18:21:22 +0000 (20:21 +0200)
ft_parse/ft_parsing_table_generate.c

index 62057fba8a298fae8650826d6a6a394d5d1ac565..0396f6472d005fe1fea7e4ba6bcfc9dd875207d8 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: ljiriste <ljiriste@student.42prague.com>   +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   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);