From: Lukas Jiriste Date: Fri, 2 Aug 2024 12:14:20 +0000 (+0200) Subject: Extend the input possibilities for parsing table X-Git-Url: https://git.ljiriste.work/?a=commitdiff_plain;h=64082548cadd785df622fe83950b16cdfce31f68;p=Libft.git Extend the input possibilities for parsing table 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. --- diff --git a/Makefile b/Makefile index 7ef43fd..5199275 100644 --- 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) diff --git a/ft_parse/ft_parse_inner.h b/ft_parse/ft_parse_inner.h index 7ec06e0..3d5cea9 100644 --- a/ft_parse/ft_parse_inner.h +++ b/ft_parse/ft_parse_inner.h @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 diff --git a/ft_parse/ft_parsing_table_load.c b/ft_parse/ft_parsing_table_load.c index d44a8d9..7f916ba 100644 --- a/ft_parse/ft_parsing_table_load.c +++ b/ft_parse/ft_parsing_table_load.c @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 */ /* */ /* ************************************************************************** */ @@ -17,88 +17,72 @@ #include #include -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 index 0000000..8436368 --- /dev/null +++ b/ft_parse/ft_parsing_table_load_helpers.c @@ -0,0 +1,75 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_parsing_table_load_helpers.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ljiriste +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* 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 +#include +#include + +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); +} diff --git a/ft_parse/load_rules.c b/ft_parse/load_rules.c index 857e265..162df5f 100644 --- a/ft_parse/load_rules.c +++ b/ft_parse/load_rules.c @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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) { diff --git a/inc/ft_parse.h b/inc/ft_parse.h index e9990db..6c3d05f 100644 --- a/inc/ft_parse.h +++ b/inc/ft_parse.h @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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);