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)
/* 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 */
/* */
/* ************************************************************************** */
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
/* 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);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* 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);
+}
/* 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 */
/* */
/* ************************************************************************** */
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)
{
/* 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 */
/* */
/* ************************************************************************** */
// 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);