Merge parsing_table_constructor into no_crash
authorLukas Jiriste <ljiriste@student.42prague.com>
Thu, 28 Nov 2024 10:58:17 +0000 (11:58 +0100)
committerLukas Jiriste <ljiriste@student.42prague.com>
Thu, 28 Nov 2024 16:00:16 +0000 (17:00 +0100)
1  2 
Makefile
ft_parse/ft_parse_inner.h
ft_parse/ft_parsing_table_load.c
ft_parse/ft_parsing_table_load_helpers.c
ft_parse/load_rules.c
ft_parse/load_rules_helpers.c
ft_parse/parsing_table_constructor/prepare_table.c
inc/ft_parse.h

diff --cc Makefile
index 537e92de4a4f384da0365229b1e19c717631d7de,83286a7a1b45312f17779ea9084c0d02453841a8..502f6142cea00944051e4611921eb9a8e7b3d5dc
+++ b/Makefile
@@@ -1,10 -1,5 +1,10 @@@
  CC := cc
- CFLAGS := -std=c99 -Wall -Wextra -Werror -Wpedantic
+ CFLAGS := -std=c99 -Wall -Wextra -Werror -Wpedantic -fPIE
 +
 +ifneq ("$(wildcard .debug)","")
 +      CFLAGS += -g
 +endif
 +
  AR := ar
  
  RM := rm -f
@@@ -14,138 -9,155 +14,156 @@@ INCLUDE := $(addprefix -I, $(INCDIR)
  
  SRCDIR := ft_gen ft_math ft_str ft_mem ft_io ft_check ft_conv ft_lst ft_arr ft_parse ft_struct
  
- SRCstruct:=   ft_stack_free.c                                         \
-                       ft_stack_init.c                                         \
-                       ft_stack_pop.c                                          \
-                       ft_stack_pop_forget.c                           \
-                       ft_stack_push.c                                         \
-                       ft_stack_top.c                                          \
- SRCparse:=    ft_parse.c                                                      \
-                       ft_parsing_table_init.c                         \
-                       ft_parsing_table_load.c                         \
-                       ft_parsing_table_load_helpers.c         \
-                       ft_parsing_table_print.c                        \
-                       ft_parsing_table_free.c                         \
-                       ft_parse_tree_print.c                           \
-                       ft_parse_tree_free.c                            \
-                       load_rules.c                                            \
-                       add_line.c                                                      \
-                       actions.c                                                       \
-                       helpers.c                                                       \
- SRCgen        :=      ft_swap.c                                                       \
- SRCmath       :=      ft_abs.c                                                        \
-                       ft_sgn.c                                                        \
-                       ft_max.c                                                        \
-                       ft_min.c                                                        \
- SRCstr        :=      ft_strcat_alloc.c                                       \
-                       ft_strncat_alloc.c                                      \
-                       ft_strcmp.c                                                     \
-                       ft_strncmp.c                                            \
-                       ft_strndup.c                                            \
-                       ft_strchr.c                                                     \
-                       ft_strtrim.c                                            \
-                       ft_strlen.c                                                     \
-                       ft_strdup.c                                                     \
-                       ft_strlcpy.c                                            \
-                       ft_strnstr.c                                            \
-                       ft_striteri.c                                           \
-                       ft_strmapi.c                                            \
-                       ft_strjoin.c                                            \
-                       ft_remove_space.c                                       \
-                       ft_split.c                                                      \
-                       ft_substr.c                                                     \
-                       ft_strlcat.c                                            \
-                       ft_strrchr.c                                            \
- SRCmem        :=      ft_calloc.c                                                     \
-                       ft_memchr.c                                                     \
-                       ft_memcmp.c                                                     \
-                       ft_memset.c                                                     \
-                       ft_memmove.c                                            \
-                       ft_memcpy.c                                                     \
-                       ft_bzero.c                                                      \
- SRCio :=      ft_putendl_fd.c                                         \
-                       ft_putnbr_fd.c                                          \
-                       ft_printf/conversion.c                          \
-                       ft_printf/ft_printf.c                           \
-                       ft_printf/padding.c                                     \
-                       ft_printf/parsing.c                                     \
-                       ft_printf/formatting.c                          \
-                       ft_putchar_fd.c                                         \
-                       get_next_line.c                                         \
-                       ft_putstr_fd.c                                          \
- SRCcheck:=    ft_isalnum.c                                            \
-                       ft_isspace.c                                            \
-                       ft_isdigit.c                                            \
-                       ft_isascii.c                                            \
-                       ft_isalpha.c                                            \
-                       ft_islower.c                                            \
-                       ft_isupper.c                                            \
-                       ft_isprint.c                                            \
-                       ft_isint.c                                                      \
- SRCconv       :=      ft_itoa_base.c                                          \
-                       ft_tolower.c                                            \
-                       ft_toupper.c                                            \
-                       ft_atoi.c                                                       \
-                       ft_ctoa.c                                                       \
-                       ft_itoa.c                                                       \
-                       ft_uitoa_base.c                                         \
- SRClst        :=      ft_lst_reverse.c                                        \
-                       ft_lstdelone.c                                          \
-                       ft_lst_foreach_if.c                                     \
-                       ft_lstlast.c                                            \
-                       ft_lstclear.c                                           \
-                       ft_lst_at.c                                                     \
-                       ft_lst_sorted_merge.c                           \
-                       ft_lst_find.c                                           \
-                       ft_lstmap.c                                                     \
-                       ft_lst_remove_if.c                                      \
-                       ft_lstnew.c                                                     \
-                       ft_lst_merge.c                                          \
-                       ft_lstsize.c                                            \
-                       ft_lstadd_front.c                                       \
-                       ft_lstadd_back.c                                        \
-                       ft_lstiter.c                                            \
-                       ft_lst_sort.c                                           \
-                       ft_lst_sorted_insert.c                          \
- SRCarr        :=      ft_vec_init.c                                           \
-                       ft_vec_reserve.c                                        \
-                       ft_vec_enlarge.c                                        \
-                       ft_vec_insert.c                                         \
-                       ft_vec_append.c                                         \
-                       ft_vec_forget.c                                         \
-                       ft_vec_erase.c                                          \
-                       ft_vec_access.c                                         \
-                       ft_vec_free.c                                           \
-                       ft_vec_find.c                                           \
-                       ft_vec_find_index.c                                     \
-                       ft_vec_copy.c                                           \
-                                                                                               \
-                       ft_vec_is_equal.c                                       \
-                                                                                               \
-                       ft_vec_contains.c                                       \
-                       ft_vec_is_subset.c                                      \
-                       ft_vec_is_setequal.c                            \
-                                                                                               \
-                       ft_vec_setinsert.c                                      \
-                                                                                               \
-                       ft_mat_init.c                                           \
-                       ft_mat_append.c                                         \
-                       ft_mat_insert_col.c                                     \
-                       ft_mat_insert_row.c                                     \
-                       ft_mat_zeros.c                                          \
-                       ft_mat_fill.c                                           \
-                       ft_mat_access.c                                         \
-                       ft_mat_free.c                                           \
+ SRCstruct:=   ft_stack_free.c                                                                                 \
+                       ft_stack_init.c                                                                                 \
+                       ft_stack_pop.c                                                                                  \
+                       ft_stack_pop_forget.c                                                                   \
+                       ft_stack_push.c                                                                                 \
+                       ft_stack_top.c                                                                                  \
+ SRCparse:=    ft_parse.c                                                                                              \
+                       ft_parsing_table_init.c                                                                 \
+                       ft_parsing_table_load.c                                                                 \
++                      ft_parsing_table_load_helpers.c                                                 \
+                       ft_parsing_table_print.c                                                                \
+                       ft_parsing_table_save.c                                                                 \
+                       ft_parsing_table_free.c                                                                 \
+                       ft_parse_tree_print.c                                                                   \
+                       ft_parse_tree_free.c                                                                    \
+                       load_rules.c                                                                                    \
++                      load_rules_helpers.c                                                                    \
+                       add_line.c                                                                                              \
+                       actions.c                                                                                               \
+                       helpers.c                                                                                               \
+                       parsing_table_constructor/categorize_tokens.c                   \
+                       parsing_table_constructor/categorize_helpers.c                  \
+                       parsing_table_constructor/conversion_to_table.c                 \
+                       parsing_table_constructor/conversion_helpers.c                  \
+                       parsing_table_constructor/conversion_subhelpers.c               \
+                       parsing_table_constructor/fill_closure.c                                \
+                       parsing_table_constructor/helpers.c                                             \
+                       parsing_table_constructor/helpers_cmp.c                                 \
+                       parsing_table_constructor/helpers_void_cmp.c                    \
+                       parsing_table_constructor/helpers_free.c                                \
+                       parsing_table_constructor/init_new_row.c                                \
+                       parsing_table_constructor/lookahead.c                                   \
+                       parsing_table_constructor/lookahead2.c                                  \
+                       parsing_table_constructor/prepare_table.c                               \
+                       parsing_table_constructor/solve_gotos.c                                 \
+                       parsing_table_constructor/ft_parsing_table_generate.c   \
 -
+ SRCgen        :=      ft_swap.c                                                                                               \
+ SRCmath       :=      ft_abs.c                                                                                                \
+                       ft_sgn.c                                                                                                \
+                       ft_max.c                                                                                                \
+                       ft_min.c                                                                                                \
+ SRCstr        :=      ft_strcat_alloc.c                                                                               \
+                       ft_strncat_alloc.c                                                                              \
+                       ft_strcmp.c                                                                                             \
+                       ft_strncmp.c                                                                                    \
+                       ft_strndup.c                                                                                    \
+                       ft_strchr.c                                                                                             \
+                       ft_strtrim.c                                                                                    \
+                       ft_strlen.c                                                                                             \
+                       ft_strdup.c                                                                                             \
+                       ft_strlcpy.c                                                                                    \
+                       ft_strnstr.c                                                                                    \
+                       ft_striteri.c                                                                                   \
+                       ft_strmapi.c                                                                                    \
+                       ft_strjoin.c                                                                                    \
+                       ft_remove_space.c                                                                               \
+                       ft_split.c                                                                                              \
+                       ft_substr.c                                                                                             \
+                       ft_strlcat.c                                                                                    \
+                       ft_strrchr.c                                                                                    \
+ SRCmem        :=      ft_calloc.c                                                                                             \
+                       ft_memchr.c                                                                                             \
+                       ft_memcmp.c                                                                                             \
+                       ft_memset.c                                                                                             \
+                       ft_memmove.c                                                                                    \
+                       ft_memcpy.c                                                                                             \
+                       ft_bzero.c                                                                                              \
+ SRCio :=      ft_putendl_fd.c                                                                                 \
+                       ft_putnbr_fd.c                                                                                  \
+                       ft_printf/conversion.c                                                                  \
+                       ft_printf/ft_printf.c                                                                   \
+                       ft_printf/padding.c                                                                             \
+                       ft_printf/parsing.c                                                                             \
+                       ft_printf/formatting.c                                                                  \
+                       ft_putchar_fd.c                                                                                 \
+                       get_next_line.c                                                                                 \
+                       ft_putstr_fd.c                                                                                  \
+ SRCcheck:=    ft_isalnum.c                                                                                    \
+                       ft_isspace.c                                                                                    \
+                       ft_isdigit.c                                                                                    \
+                       ft_isascii.c                                                                                    \
+                       ft_isalpha.c                                                                                    \
+                       ft_islower.c                                                                                    \
+                       ft_isupper.c                                                                                    \
+                       ft_isprint.c                                                                                    \
+                       ft_isint.c                                                                                              \
+ SRCconv       :=      ft_itoa_base.c                                                                                  \
+                       ft_tolower.c                                                                                    \
+                       ft_toupper.c                                                                                    \
+                       ft_atoi.c                                                                                               \
+                       ft_ctoa.c                                                                                               \
+                       ft_itoa.c                                                                                               \
+                       ft_uitoa_base.c                                                                                 \
+ SRClst        :=      ft_lst_reverse.c                                                                                \
+                       ft_lstdelone.c                                                                                  \
+                       ft_lst_foreach_if.c                                                                             \
+                       ft_lstlast.c                                                                                    \
+                       ft_lstclear.c                                                                                   \
+                       ft_lst_at.c                                                                                             \
+                       ft_lst_sorted_merge.c                                                                   \
+                       ft_lst_find.c                                                                                   \
+                       ft_lstmap.c                                                                                             \
+                       ft_lst_remove_if.c                                                                              \
+                       ft_lstnew.c                                                                                             \
+                       ft_lst_merge.c                                                                                  \
+                       ft_lstsize.c                                                                                    \
+                       ft_lstadd_front.c                                                                               \
+                       ft_lstadd_back.c                                                                                \
+                       ft_lstiter.c                                                                                    \
+                       ft_lst_sort.c                                                                                   \
+                       ft_lst_sorted_insert.c                                                                  \
+ SRCarr        :=      ft_vec_init.c                                                                                   \
+                       ft_vec_reserve.c                                                                                \
+                       ft_vec_enlarge.c                                                                                \
+                       ft_vec_insert.c                                                                                 \
+                       ft_vec_append.c                                                                                 \
+                       ft_vec_forget.c                                                                                 \
+                       ft_vec_erase.c                                                                                  \
+                       ft_vec_access.c                                                                                 \
+                       ft_vec_free.c                                                                                   \
+                       ft_vec_find.c                                                                                   \
+                       ft_vec_find_index.c                                                                             \
+                       ft_vec_copy.c                                                                                   \
+                                                                                                                                       \
+                       ft_vec_is_equal.c                                                                               \
+                                                                                                                                       \
+                       ft_vec_contains.c                                                                               \
+                       ft_vec_is_subset.c                                                                              \
+                       ft_vec_is_setequal.c                                                                    \
+                                                                                                                                       \
+                       ft_vec_setinsert.c                                                                              \
+                                                                                                                                       \
+                       ft_mat_init.c                                                                                   \
+                       ft_mat_append.c                                                                                 \
+                       ft_mat_insert_col.c                                                                             \
+                       ft_mat_insert_row.c                                                                             \
+                       ft_mat_zeros.c                                                                                  \
+                       ft_mat_fill.c                                                                                   \
+                       ft_mat_access.c                                                                                 \
+                       ft_mat_free.c                                                                                   \
  
  SOURCES := $(foreach dir, $(SRCDIR), $(addprefix $(dir)/, $($(dir:ft_%=SRC%))))
  OBJECTS := $(SOURCES:.c=.o)
index 3d5cea9870008f0dbe932aba69d26900362bddcc,2e14f5eea786fa6cf959d9f89633e8ce6c855525..7ec51e8c31bbce67f882102554d2ec1bf67f1c42
@@@ -6,7 -6,7 +6,7 @@@
  /*   By: ljiriste <marvin@42.fr>                    +#+  +:+       +#+        */
  /*                                                +#+#+#+#+#+   +#+           */
  /*   Created: 2024/06/20 13:23:20 by ljiriste          #+#    #+#             */
- /*   Updated: 2024/08/02 14:21:48 by ljiriste         ###   ########.fr       */
 -/*   Updated: 2024/11/26 17:03:13 by ljiriste         ###   ########.fr       */
++/*   Updated: 2024/11/28 11:54:35 by ljiriste         ###   ########.fr       */
  /*                                                                            */
  /* ************************************************************************** */
  
  
  # include "libft.h"
  
--void          ft_free_token(void *v_token);
--void          ft_free_rule(void *v_rule);
--void          ft_free_state(void *v_state);
--void          ft_free_stack_element(void *v_el);
++void                  ft_free_token(void *v_token);
++void                  ft_free_rule(void *v_rule);
++void                  ft_free_state(void *v_state);
++void                  ft_free_stack_element(void *v_el);
  
- t_token               ft_token_dup(t_token token);
 -t_token               ft_token_dup(const t_token *token);
--ssize_t               find_token_index(t_token token, const t_vec *tokens);
++t_token                       ft_token_dup(const t_token *token);
++ssize_t                       find_token_index(t_token token, const t_vec *tokens);
  
- t_ft_stat     load_rules_fd(t_vec *rules, int fd);
- t_ft_stat     load_rules_str(t_vec *rules, const char *rules_str);
 -size_t                get_terminal_tokens_num(t_vec *tokens);
 -t_ft_stat     load_rules(t_vec *rules, const char *rules_filename);
--int                   add_line(t_vec *states, const char *line, size_t lookahead_size);
--int                   follow_rule(t_stack *stack, size_t rule_num,
--                              const t_parsing_table *table);
--int                   push_state(t_stack *stack, size_t state_num, t_token token);
++void                  parse_constituents(t_vec *constituents, const char *line);
++int                           is_valid_rule(t_grammar_rule *rule);
++t_grammar_rule        parse_rule(const char *line);
++t_ft_stat             load_rules_fd(t_vec *rules, int fd);
++t_ft_stat             load_rules_name(t_vec *rules, const char *rules_filename);
++t_ft_stat             load_rules_str(t_vec *rules, const char *rules_str);
++int                           add_line(t_vec *states,
++                                      const char *line, size_t lookahead_size);
++int                           follow_rule(t_stack *stack, size_t rule_num,
++                                      const t_parsing_table *table);
++int                           push_state(t_stack *stack, size_t state_num, t_token token);
  
- int                   is_consistent(t_parsing_table *table);
- size_t                get_terminal_tokens_num(t_vec *tokens);
- t_vec         parse_header(const char *header);
++int                           is_consistent(t_parsing_table *table);
++size_t                        get_terminal_tokens_num(t_vec *tokens);
++t_vec                 parse_header(const char *header);
  #endif //FT_PARSE_INNER_H
index 7f916ba1aa4446be7c1dd16c13a2c93ac2f1048b,0c28a7d4d12dccdd8e1a36125911fcebd69e2fde..1a48e9772e39aaff0fc3b93fd4cff4e606d1cd18
@@@ -6,7 -6,7 +6,7 @@@
  /*   By: ljiriste <marvin@42.fr>                    +#+  +:+       +#+        */
  /*                                                +#+#+#+#+#+   +#+           */
  /*   Created: 2024/06/20 12:34:17 by ljiriste          #+#    #+#             */
- /*   Updated: 2024/08/02 14:13:13 by ljiriste         ###   ########.fr       */
 -/*   Updated: 2024/07/07 09:44:09 by ljiriste         ###   ########.fr       */
++/*   Updated: 2024/11/28 11:43:45 by ljiriste         ###   ########.fr       */
  /*                                                                            */
  /* ************************************************************************** */
  
  #include <fcntl.h>
  #include <unistd.h>
  
 -static char   *get_token_type(const char *line)
 +t_ft_stat     ft_parsing_table_load_str(t_parsing_table *table,
-               const char *table_str, const char *rules_str)
++                              const char *table_str, const char *rules_str)
  {
 +      char    **table_split;
        size_t  i;
 -      char    *type;
  
 -      i = 0;
 -      while (line[i] && line[i] != ';')
 -              ++i;
 -      type = ft_strndup(line, i);
 -      return (type);
 -}
 -
 -static t_vec  parse_header(const char *header)
 -{
 -      t_vec   tokens;
 -      t_token token;
 -      char    *condensed_line;
 -      size_t  i;
 -
 -      condensed_line = ft_remove_space(header);
 -      ft_vec_init(&tokens, sizeof(t_token));
 -      token.str = NULL;
 -      i = 0;
 -      while (condensed_line[i] && condensed_line[i] != ';')
 -              ++i;
 -      while (condensed_line[i])
 +      load_rules_str(&table->rules, rules_str);
 +      table_split = ft_split(table_str, "\n");
 +      if (!table_split)
 +              return (alloc_fail);
 +      table->tokens = parse_header(table_split[0]);
 +      table->terminal_tokens_num = get_terminal_tokens_num(&table->tokens);
 +      i = 1;
 +      while (table_split[i])
        {
 +              add_line(&table->states, table_split[i],
 +                      table->terminal_tokens_num + 1);
                ++i;
 -              token.type = get_token_type(condensed_line + i);
 -              while (condensed_line[i] && condensed_line[i] != ';')
 -                      ++i;
 -              ft_vec_append(&tokens, &token);
        }
 -      free(condensed_line);
 -      return (tokens);
 +      ft_free_split(table_split);
 +      if (is_consistent(table))
 +              return (success);
 +      return (non_specific_failure);
  }
  
 -static int    is_consistent(__attribute__((unused)) t_parsing_table *table)
 +t_ft_stat     ft_parsing_table_load_fd(t_parsing_table *table,
 +              int table_fd, int rules_fd)
  {
 -      return (1);
 -}
 +      char    *line;
  
 -t_ft_stat     ft_parsing_table_load(t_parsing_table *table,
 -              const char *filename,
 -              const char *rules_filename)
 -{
 -      int                             fd;
 -      char                    *line;
 -
 -      load_rules(&table->rules, rules_filename);
 -      fd = open(filename, O_RDONLY);
 -      if (fd < 0)
 -              return (file_error);
 -      line = get_next_line(fd);
 +      load_rules_fd(&table->rules, rules_fd);
 +      line = get_next_line(table_fd);
        table->tokens = parse_header(line);
        table->terminal_tokens_num = get_terminal_tokens_num(&table->tokens);
        free(line);
index 8436368f80e21ba7cc8ce358284369ffc10b2737,0000000000000000000000000000000000000000..36267d3f8e80a9f3c210f771f93d6f8e64a543cf
mode 100644,000000..100644
--- /dev/null
@@@ -1,75 -1,0 +1,59 @@@
- /*   Updated: 2024/08/02 14:21:37 by ljiriste         ###   ########.fr       */
 +/* ************************************************************************** */
 +/*                                                                            */
 +/*                                                        :::      ::::::::   */
 +/*   ft_parsing_table_load_helpers.c                    :+:      :+:    :+:   */
 +/*                                                    +:+ +:+         +:+     */
 +/*   By: ljiriste <marvin@42.fr>                    +#+  +:+       +#+        */
 +/*                                                +#+#+#+#+#+   +#+           */
 +/*   Created: 2024/08/02 14:09:21 by ljiriste          #+#    #+#             */
- size_t        get_terminal_tokens_num(t_vec *tokens)
- {
-       size_t  i;
-       t_token *token;
-       i = 0;
-       while (i < tokens->size)
-       {
-               token = (t_token *)ft_vec_access(tokens, i);
-               if (!ft_strcmp(token->type, "$"))
-                       return (i);
-               ++i;
-       }
-       return (0);
- }
++/*   Updated: 2024/11/28 17:00:08 by ljiriste         ###   ########.fr       */
 +/*                                                                            */
 +/* ************************************************************************** */
 +
 +#include "ft_parse_inner.h"
 +#include "libft.h"
 +#include <stdlib.h>
 +#include <fcntl.h>
 +#include <unistd.h>
 +
 +static char   *get_token_type(const char *line)
 +{
 +      size_t  i;
 +      char    *type;
 +
 +      i = 0;
 +      while (line[i] && line[i] != ';')
 +              ++i;
 +      type = ft_strndup(line, i);
 +      return (type);
 +}
 +
 +t_vec parse_header(const char *header)
 +{
 +      t_vec   tokens;
 +      t_token token;
 +      char    *condensed_line;
 +      size_t  i;
 +
 +      condensed_line = ft_remove_space(header);
 +      ft_vec_init(&tokens, sizeof(t_token));
 +      token.str = NULL;
 +      i = 0;
 +      while (condensed_line[i] && condensed_line[i] != ';')
 +              ++i;
 +      while (condensed_line[i])
 +      {
 +              ++i;
 +              token.type = get_token_type(condensed_line + i);
 +              while (condensed_line[i] && condensed_line[i] != ';')
 +                      ++i;
 +              ft_vec_append(&tokens, &token);
 +      }
 +      free(condensed_line);
 +      return (tokens);
 +}
 +
 +int   is_consistent(__attribute__((unused)) t_parsing_table *table)
 +{
 +      return (1);
 +}
index 162df5fc5b2ad7780c4c305a1151d1e1f32aeab4,857e2653fd78ba8682c90bb67504f88e227a3dbd..35ed2ccc5fa603bb580bedf34b4c59f12fb1fab2
@@@ -6,7 -6,7 +6,7 @@@
  /*   By: ljiriste <marvin@42.fr>                    +#+  +:+       +#+        */
  /*                                                +#+#+#+#+#+   +#+           */
  /*   Created: 2024/06/20 13:29:48 by ljiriste          #+#    #+#             */
- /*   Updated: 2024/08/02 14:24:01 by ljiriste         ###   ########.fr       */
 -/*   Updated: 2024/06/21 16:45:29 by ljiriste         ###   ########.fr       */
++/*   Updated: 2024/11/28 11:56:19 by ljiriste         ###   ########.fr       */
  /*                                                                            */
  /* ************************************************************************** */
  
  #include <unistd.h>
  #include <fcntl.h>
  
--static void   parse_constituents(t_vec *constituents, const char *line)
- {
-       size_t  i;
-       size_t  j;
-       t_token token;
-       token.str = NULL;
-       i = 0;
-       while (line[i])
-       {
-               while (ft_isspace(line[i]))
-                       ++i;
-               j = i;
-               while (!ft_isspace(line[i]) && line[i])
-                       ++i;
-               if (j == i)
-                       break ;
-               token.type = ft_strndup(line + j, i - j);
-               ft_vec_append(constituents, &token);
-       }
- }
- static t_grammar_rule parse_rule(const char *line)
- {
-       t_grammar_rule  rule;
-       t_token                 token;
-       size_t                  i;
-       size_t                  j;
-       token.str = NULL;
-       ft_vec_init(&rule.constituents, sizeof(t_token));
-       i = 0;
-       while (ft_isspace(line[i]))
-               ++i;
-       j = i;
-       while (!ft_isspace(line[i]))
-               ++i;
-       token.type = ft_strndup(line + j, i - j);
-       rule.result = token;
-       while (ft_isspace(line[i]))
-               ++i;
-       if (!(line[i++] == '-' && line[i++] == '>'))
-               return (rule);
-       parse_constituents(&rule.constituents, line + i);
-       return (rule);
- }
- static int    is_valid_rule(t_grammar_rule *rule)
- {
-       size_t  i;
-       if (!rule->result.type)
-               return (0);
-       i = 0;
-       while (i < rule->constituents.size)
-       {
-               if (!((t_token *)ft_vec_access(&rule->constituents, i))->type)
-                       return (0);
-               ++i;
-       }
-       return (1);
- }
 +t_ft_stat     load_rules_str(t_vec *rules, const char *rules_str)
  {
 -      size_t  i;
 -      size_t  j;
 -      t_token token;
 -
 -      token.str = NULL;
 -      i = 0;
 -      while (line[i])
 -      {
 -              while (ft_isspace(line[i]))
 -                      ++i;
 -              j = i;
 -              while (!ft_isspace(line[i]) && line[i])
 -                      ++i;
 -              if (j == i)
 -                      break ;
 -              token.type = ft_strndup(line + j, i - j);
 -              ft_vec_append(constituents, &token);
 -      }
 -}
 -
 -static t_grammar_rule parse_rule(const char *line)
 -{
 -      t_grammar_rule  rule;
 -      t_token                 token;
 +      char                    **rules_split;
        size_t                  i;
 -      size_t                  j;
 -
 -      token.str = NULL;
 -      ft_vec_init(&rule.constituents, sizeof(t_token));
 -      i = 0;
 -      while (ft_isspace(line[i]))
 -              ++i;
 -      j = i;
 -      while (!ft_isspace(line[i]))
 -              ++i;
 -      token.type = ft_strndup(line + j, i - j);
 -      rule.result = token;
 -      while (ft_isspace(line[i]))
 -              ++i;
 -      if (!(line[i++] == '-' && line[i++] == '>'))
 -              return (rule);
 -      parse_constituents(&rule.constituents, line + i);
 -      return (rule);
 -}
 -
 -static int    is_valid_rule(t_grammar_rule *rule)
 -{
 -      size_t  i;
 +      t_grammar_rule  rule;
  
 -      if (!rule->result.type)
 -              return (0);
 +      rules_split = ft_split(rules_str, "\n");
 +      if (!rules_split)
 +              return (alloc_fail);
        i = 0;
 -      while (i < rule->constituents.size)
 +      while (rules_split[i])
        {
 -              if (!((t_token *)ft_vec_access(&rule->constituents, i))->type)
 -                      return (0);
 +              rule = parse_rule(rules_split[i]);
 +              if (!is_valid_rule(&rule) || ft_vec_append(rules, &rule) != success)
 +              {
 +                      ft_vec_free(rules, ft_free_rule);
 +                      return (non_specific_failure);
 +              }
                ++i;
        }
 -      return (1);
 +      ft_free_split(rules_split);
 +      return (success);
  }
  
 -t_ft_stat     load_rules(t_vec *rules, const char *rules_filename)
 +t_ft_stat     load_rules_fd(t_vec *rules, int fd)
  {
 -      int                             fd;
        char                    *line;
        t_grammar_rule  rule;
  
                free(line);
                line = get_next_line(fd);
        }
--      close(fd);
        return (success);
  }
++
++t_ft_stat     load_rules_name(t_vec *rules, const char *rules_filename)
++{
++      int                     rules_fd;
++      t_ft_stat       res;
++
++      rules_fd = open(rules_filename, O_RDONLY);
++      if (rules_fd < 0)
++              return (file_error);
++      res = load_rules_fd(rules, rules_fd);
++      close(rules_fd);
++      return (res);
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..ad26ef885fe3bf950a72813aa1d49b9a74baa178
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,77 @@@
++/* ************************************************************************** */
++/*                                                                            */
++/*                                                        :::      ::::::::   */
++/*   load_rules_helpers.c                               :+:      :+:    :+:   */
++/*                                                    +:+ +:+         +:+     */
++/*   By: ljiriste <ljiriste@student.42prague.com>   +#+  +:+       +#+        */
++/*                                                +#+#+#+#+#+   +#+           */
++/*   Created: 2024/11/28 11:52:27 by ljiriste          #+#    #+#             */
++/*   Updated: 2024/11/28 11:56:12 by ljiriste         ###   ########.fr       */
++/*                                                                            */
++/* ************************************************************************** */
++
++#include "ft_parse_inner.h"
++#include "libft.h"
++
++void  parse_constituents(t_vec *constituents, const char *line)
++{
++      size_t  i;
++      size_t  j;
++      t_token token;
++
++      token.str = NULL;
++      i = 0;
++      while (line[i])
++      {
++              while (ft_isspace(line[i]))
++                      ++i;
++              j = i;
++              while (!ft_isspace(line[i]) && line[i])
++                      ++i;
++              if (j == i)
++                      break ;
++              token.type = ft_strndup(line + j, i - j);
++              ft_vec_append(constituents, &token);
++      }
++}
++
++int   is_valid_rule(t_grammar_rule *rule)
++{
++      size_t  i;
++
++      if (!rule->result.type)
++              return (0);
++      i = 0;
++      while (i < rule->constituents.size)
++      {
++              if (!((t_token *)ft_vec_access(&rule->constituents, i))->type)
++                      return (0);
++              ++i;
++      }
++      return (1);
++}
++
++t_grammar_rule        parse_rule(const char *line)
++{
++      t_grammar_rule  rule;
++      t_token                 token;
++      size_t                  i;
++      size_t                  j;
++
++      token.str = NULL;
++      ft_vec_init(&rule.constituents, sizeof(t_token));
++      i = 0;
++      while (ft_isspace(line[i]))
++              ++i;
++      j = i;
++      while (!ft_isspace(line[i]))
++              ++i;
++      token.type = ft_strndup(line + j, i - j);
++      rule.result = token;
++      while (ft_isspace(line[i]))
++              ++i;
++      if (!(line[i++] == '-' && line[i++] == '>'))
++              return (rule);
++      parse_constituents(&rule.constituents, line + i);
++      return (rule);
++}
index 0000000000000000000000000000000000000000,3581748493859f10d71c2d65cfdebdc3f500f1ef..6efd8dd167da07b459b73c6195b5d91b4e9045ac
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,78 +1,78 @@@
 -/*   Updated: 2024/11/27 11:24:11 by ljiriste         ###   ########.fr       */
+ /* ************************************************************************** */
+ /*                                                                            */
+ /*                                                        :::      ::::::::   */
+ /*   prepare_table.c                                    :+:      :+:    :+:   */
+ /*                                                    +:+ +:+         +:+     */
+ /*   By: ljiriste <ljiriste@student.42prague.com>   +#+  +:+       +#+        */
+ /*                                                +#+#+#+#+#+   +#+           */
+ /*   Created: 2024/11/26 16:26:32 by ljiriste          #+#    #+#             */
 -      res = load_rules(&table->rules, rules_filename);
++/*   Updated: 2024/11/28 11:51:00 by ljiriste         ###   ########.fr       */
+ /*                                                                            */
+ /* ************************************************************************** */
+ #include "pt_constructor.h"
+ #include "../ft_parse_inner.h"
+ #include "libft.h"
+ static t_ft_stat      init_table(t_parsing_table *table)
+ {
+       t_ft_stat       res;
+       res = ft_vec_init(&table->rules, sizeof(t_grammar_rule));
+       if (res != success)
+               return (res);
+       res = ft_vec_init(&table->states, sizeof(t_parser_state));
+       if (res != success)
+               return (res);
+       res = ft_vec_init(&table->tokens, sizeof(t_token));
+       if (res != success)
+               return (res);
+       return (success);
+ }
+ static t_ft_stat      add_zeroth_rule(t_vec *rules)
+ {
+       t_ft_stat               res;
+       t_grammar_rule  rule;
+       t_token                 first_token;
+       rule.result.type = NULL;
+       rule.result.str = NULL;
+       first_token = ft_token_dup(
+                       &((const t_grammar_rule *)ft_vec_caccess(rules, 0))->result);
+       if (!first_token.type)
+               return (alloc_fail);
+       res = ft_vec_init(&rule.constituents, sizeof(t_token));
+       if (res != success)
+               return (res);
+       res = ft_vec_append(&rule.constituents, &first_token);
+       if (res != success)
+               ft_free_token(&first_token);
+       res = ft_vec_insert(rules, &rule, 0);
+       if (res != success)
+               ft_free_rule(&rule);
+       return (success);
+ }
+ t_ft_stat     prepare_table(t_parsing_table *table, const char *rules_filename)
+ {
+       t_ft_stat       res;
+       res = init_table(table);
+       if (res != success)
+               return (res);
++      res = load_rules_name(&table->rules, rules_filename);
+       if (res != success)
+               return (res);
+       res = add_zeroth_rule(&table->rules);
+       if (res != success)
+       {
+               ft_vec_free(&table->rules, ft_free_rule);
+               return (res);
+       }
+       res = categorize_tokens(&table->tokens, &table->rules);
+       table->terminal_tokens_num = get_terminal_tokens_num(&table->tokens);
+       if (res != success)
+               ft_vec_free(&table->rules, ft_free_rule);
+       return (res);
+ }
diff --cc inc/ft_parse.h
index 6c3d05fc72ac7b575468d7b27354bdf22dde5650,4b89a5672ea0f5fca5b07265810ab8b0c3717383..b06a1a81fa9769b849f686a18cd5e0375f70c3b4
@@@ -6,7 -6,7 +6,7 @@@
  /*   By: ljiriste <ljiriste@student.42prague.com>   +#+  +:+       +#+        */
  /*                                                +#+#+#+#+#+   +#+           */
  /*   Created: 2024/05/27 21:21:54 by ljiriste          #+#    #+#             */
- /*   Updated: 2024/08/02 13:57:10 by ljiriste         ###   ########.fr       */
 -/*   Updated: 2024/07/18 12:41:50 by ljiriste         ###   ########.fr       */
++/*   Updated: 2024/11/28 11:46:05 by ljiriste         ###   ########.fr       */
  /*                                                                            */
  /* ************************************************************************** */
  
@@@ -92,13 -92,11 +92,14 @@@ typedef struct s_parser_stack_elemen
  //    Tokens should not contain whitespace as it is used as separator
  
  t_ft_stat                     ft_parsing_table_init(t_parsing_table *table);
-                                               const char *filename,
 +t_ft_stat                     ft_parsing_table_load_name(t_parsing_table *table,
++                                              const char *filename, const char *rules_filename);
+ t_ft_stat                     ft_parsing_table_generate(t_parsing_table *table,
                                                const char *rules_filename);
 -t_ft_stat                     ft_parsing_table_load(t_parsing_table *table,
 -                                              const char *filename,
 -                                              const char *rules_filename);
 +t_ft_stat                     ft_parsing_table_load_fd(t_parsing_table *table,
 +                                              int table_fd, int rules_fd);
 +t_ft_stat                     ft_parsing_table_load_str(t_parsing_table *table,
 +                                              const char *table_str, const char *rules_str);
  t_parse_tree_node     *ft_parse(const t_vec *tokens,
                                                const t_parsing_table *table);