Extend the input possibilities for parsing table
authorLukas Jiriste <ljiriste@student.42prague.com>
Fri, 2 Aug 2024 12:14:20 +0000 (14:14 +0200)
committerLukas Jiriste <ljiriste@student.42prague.com>
Fri, 2 Aug 2024 12:27:55 +0000 (14:27 +0200)
This is done so that a parsing table may be included inside a source
file as a string.
Addition new (long) filename to Makefile lead to change of alignment
depth.

Makefile
ft_parse/ft_parse_inner.h
ft_parse/ft_parsing_table_load.c
ft_parse/ft_parsing_table_load_helpers.c [new file with mode: 0644]
ft_parse/load_rules.c
inc/ft_parse.h

index 7ef43fd16d4e49b387a5f3e22f041c294165548b..5199275f6e7399d14772f076c08d1fb9db2f4d31 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -9,138 +9,138 @@ 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_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_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                                           \
 
 SOURCES := $(foreach dir, $(SRCDIR), $(addprefix $(dir)/, $($(dir:ft_%=SRC%))))
 OBJECTS := $(SOURCES:.c=.o)
index 7ec06e0853dc761b7193b5b1abcc1161f48ad598..3d5cea9870008f0dbe932aba69d26900362bddcc 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: ljiriste <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/06/20 13:23:20 by ljiriste          #+#    #+#             */
-/*   Updated: 2024/06/21 16:57:14 by ljiriste         ###   ########.fr       */
+/*   Updated: 2024/08/02 14:21:48 by ljiriste         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -23,10 +23,14 @@ void                ft_free_stack_element(void *v_el);
 t_token                ft_token_dup(t_token token);
 ssize_t                find_token_index(t_token token, const t_vec *tokens);
 
-t_ft_stat      load_rules(t_vec *rules, const char *rules_filename);
+t_ft_stat      load_rules_fd(t_vec *rules, int fd);
+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);
 #endif //FT_PARSE_INNER_H
index d44a8d91465b9e9fa749756182eb37aec435d60f..7f916ba1aa4446be7c1dd16c13a2c93ac2f1048b 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: ljiriste <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/06/20 12:34:17 by ljiriste          #+#    #+#             */
-/*   Updated: 2024/06/20 17:45:54 by ljiriste         ###   ########.fr       */
+/*   Updated: 2024/08/02 14:13:13 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)
 {
+       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])
-       {
-               ++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);
-}
-
-static size_t  get_terminal_tokens_num(t_vec *tokens)
-{
-       size_t  i;
-       t_token *token;
-
-       i = 0;
-       while (i < tokens->size)
+       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])
        {
-               token = (t_token *)ft_vec_access(tokens, i);
-               if (!ft_strcmp(token->type, "$"))
-                       return (i);
+               add_line(&table->states, table_split[i],
+                       table->terminal_tokens_num + 1);
                ++i;
        }
-       return (0);
-}
-
-static int     is_consistent(__attribute__((unused)) t_parsing_table *table)
-{
-       return (1);
+       ft_free_split(table_split);
+       if (is_consistent(table))
+               return (success);
+       return (non_specific_failure);
 }
 
-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)
 {
-       int                             fd;
-       char                    *line;
+       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);
-       line = get_next_line(fd);
+       line = get_next_line(table_fd);
        while (line)
        {
                add_line(&table->states, line, table->terminal_tokens_num + 1);
                free(line);
-               line = get_next_line(fd);
+               line = get_next_line(table_fd);
        }
-       close(fd);
        if (is_consistent(table))
                return (success);
        return (non_specific_failure);
 }
+
+t_ft_stat      ft_parsing_table_load_name(t_parsing_table *table,
+               const char *filename,
+               const char *rules_filename)
+{
+       int                     rules_fd;
+       int                     table_fd;
+       t_ft_stat       res;
+
+       rules_fd = open(rules_filename, O_RDONLY);
+       if (rules_fd < 0)
+               return (file_error);
+       table_fd = open(filename, O_RDONLY);
+       if (table_fd < 0)
+       {
+               close(rules_fd);
+               return (file_error);
+       }
+       res = ft_parsing_table_load_fd(table, table_fd, rules_fd);
+       close(table_fd);
+       close(rules_fd);
+       return (res);
+}
diff --git a/ft_parse/ft_parsing_table_load_helpers.c b/ft_parse/ft_parsing_table_load_helpers.c
new file mode 100644 (file)
index 0000000..8436368
--- /dev/null
@@ -0,0 +1,75 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   ft_parsing_table_load_helpers.c                    :+:      :+:    :+:   */
+/*                                                    +:+ +:+         +:+     */
+/*   By: ljiriste <marvin@42.fr>                    +#+  +:+       +#+        */
+/*                                                +#+#+#+#+#+   +#+           */
+/*   Created: 2024/08/02 14:09:21 by ljiriste          #+#    #+#             */
+/*   Updated: 2024/08/02 14:21:37 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);
+}
+
+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);
+}
+
+int    is_consistent(__attribute__((unused)) t_parsing_table *table)
+{
+       return (1);
+}
index 857e2653fd78ba8682c90bb67504f88e227a3dbd..162df5fc5b2ad7780c4c305a1151d1e1f32aeab4 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: ljiriste <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/06/20 13:29:48 by ljiriste          #+#    #+#             */
-/*   Updated: 2024/06/21 16:45:29 by ljiriste         ###   ########.fr       */
+/*   Updated: 2024/08/02 14:24:01 by ljiriste         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -79,15 +79,35 @@ static int  is_valid_rule(t_grammar_rule *rule)
        return (1);
 }
 
-t_ft_stat      load_rules(t_vec *rules, const char *rules_filename)
+t_ft_stat      load_rules_str(t_vec *rules, const char *rules_str)
+{
+       char                    **rules_split;
+       size_t                  i;
+       t_grammar_rule  rule;
+
+       rules_split = ft_split(rules_str, "\n");
+       if (!rules_split)
+               return (alloc_fail);
+       i = 0;
+       while (rules_split[i])
+       {
+               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;
+       }
+       ft_free_split(rules_split);
+       return (success);
+}
+
+t_ft_stat      load_rules_fd(t_vec *rules, int fd)
 {
-       int                             fd;
        char                    *line;
        t_grammar_rule  rule;
 
-       fd = open(rules_filename, O_RDONLY);
-       if (fd < 0)
-               return (file_error);
        line = get_next_line(fd);
        while (line)
        {
index e9990db5713b05bad426bb509c40c1171ad3ea0a..6c3d05fc72ac7b575468d7b27354bdf22dde5650 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: ljiriste <ljiriste@student.42prague.com>   +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/05/27 21:21:54 by ljiriste          #+#    #+#             */
-/*   Updated: 2024/07/21 08:41:22 by ljiriste         ###   ########.fr       */
+/*   Updated: 2024/08/02 13:57:10 by ljiriste         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -92,9 +92,13 @@ typedef struct s_parser_stack_element
 //     Tokens should not contain whitespace as it is used as separator
 
 t_ft_stat                      ft_parsing_table_init(t_parsing_table *table);
-t_ft_stat                      ft_parsing_table_load(t_parsing_table *table,
+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_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);