From 3bde20ba236df395546c18fefd356632a2d137f1 Mon Sep 17 00:00:00 2001 From: Maieul BOYER Date: Sun, 28 Apr 2024 18:58:46 +0200 Subject: [PATCH] Created: test main for the parser --- shcat_c/.clang-format | 9 +++ shcat_c/.clangd | 1 + shcat_c/Minishell.mk | 15 ++-- shcat_c/includes/app/node.h | 35 ++++++++++ shcat_c/includes/me | 1 + shcat_c/includes/minishell.h | 4 +- shcat_c/includes/parser | 1 + shcat_c/sources/main.c | 107 +++++++++++++++++++++-------- shcat_c/sources/node/create_node.c | 13 ++++ shcat_c/sources/node/node.c | 87 +++++++++++++++++++++++ 10 files changed, 236 insertions(+), 37 deletions(-) create mode 100644 shcat_c/.clang-format create mode 100644 shcat_c/includes/app/node.h create mode 120000 shcat_c/includes/me create mode 120000 shcat_c/includes/parser create mode 100644 shcat_c/sources/node/create_node.c create mode 100644 shcat_c/sources/node/node.c diff --git a/shcat_c/.clang-format b/shcat_c/.clang-format new file mode 100644 index 00000000..6b13f20e --- /dev/null +++ b/shcat_c/.clang-format @@ -0,0 +1,9 @@ +BasedOnStyle: Microsoft +IndentWidth: 4 +ColumnLimit: 80 +UseTab: Always +SortIncludes: CaseInsensitive +IndentPPDirectives: AfterHash +PPIndentWidth: 1 +AllowShortIfStatementsOnASingleLine: false +AlignConsecutiveDeclarations: true diff --git a/shcat_c/.clangd b/shcat_c/.clangd index f5f407b8..1aebcb0c 100644 --- a/shcat_c/.clangd +++ b/shcat_c/.clangd @@ -1,4 +1,5 @@ CompileFlags: # Tweak the parse settings Add: - "-I/usr/include" + - "-I/home/maiboyer/Documents/ring-2/shcat/shcat_c/includes" diff --git a/shcat_c/Minishell.mk b/shcat_c/Minishell.mk index 6bc53dc1..c1687296 100644 --- a/shcat_c/Minishell.mk +++ b/shcat_c/Minishell.mk @@ -6,7 +6,7 @@ # By: maiboyer +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/04/28 17:28:30 by maiboyer #+# #+# # -# Updated: 2024/04/28 18:17:52 by maiboyer ### ########.fr # +# Updated: 2024/04/28 18:56:27 by maiboyer ### ########.fr # # # # **************************************************************************** # @@ -15,8 +15,7 @@ OBJDIRNAME ?= # Flags -CFLAGS = -Werror -Wextra -Wall -Wno-unused-command-line-argument -g3 -MMD -lreadline -L$(OBJDIRNAME) -lme -lgmr -I./includes -I./stdme/includes -I./parser_src/includes - +CFLAGS = -Werror -Wextra -Wall -Wno-unused-command-line-argument -g3 -MMD -lreadline -I./includes # Sources LIB = ./libft/ft_bzero.c \ ./libft/ft_calloc.c \ @@ -32,7 +31,8 @@ SRC = ./sources/ft_cmd.c \ ./sources/ft_echo.c \ ./sources/ft_exit.c \ ./sources/ft_pwd.c \ - ./sources/main.c + ./sources/main.c \ + ./sources/node/node.c # Name NAME = minishell @@ -64,21 +64,20 @@ bonus: $(OBJ) $(LIB_OBJ) $(OBJDIRNAME)/libme.a $(OBJDIRNAME)/libgmr.a @mkdir -p $(OBJDIRNAME)/$(LIBDIRNAME) @mkdir -p $(OBJDIRNAME)/$(SRCDIRNAME) @printf '$(GREY) Be Carefull ur in $(END)$(GREEN)Debug Mode$(END)\n' - @cc $(CFLAGS) -D DEBUG=42 -o $(NAME) $(OBJ) + @cc $(CFLAGS) -D DEBUG=42 -o $(NAME) $(OBJ) -L$(OBJDIRNAME) -lme -lgmr # Dependences for all $(NAME): $(OBJ) $(LIB_OBJ) $(OBJDIRNAME)/libme.a $(OBJDIRNAME)/libgmr.a @mkdir -p $(OBJDIRNAME) @mkdir -p $(OBJDIRNAME)/$(LIBDIRNAME) @mkdir -p $(OBJDIRNAME)/$(SRCDIRNAME) - @cc $(CFLAGS) -o $(NAME) $(OBJ) $(LIB_OBJ) + @cc $(CFLAGS) -o $(NAME) $(OBJ) $(LIB_OBJ) -L$(OBJDIRNAME) -lme -lgmr # Creating the objects $(OBJDIRNAME)/%.o: %.c @mkdir -p $(dir $@) @printf '$(GREY) Compiling $(END)$(GREEN)$<$(END)\n' - @cc $(CFLAGS) -o $@ -c $< - + @cc $(CFLAGS) -o $@ -c $< $(OBJDIRNAME)/libme.a: @$(MAKE) --no-print-directory -C ./stdme/ LIB_NAME="$(realpath ./$(stdme))/" "BUILD_DIR=$(shell realpath ./$(OBJDIRNAME))" libme.a diff --git a/shcat_c/includes/app/node.h b/shcat_c/includes/app/node.h new file mode 100644 index 00000000..b37bebb6 --- /dev/null +++ b/shcat_c/includes/app/node.h @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* node.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: maiboyer +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/28 18:35:22 by maiboyer #+# #+# */ +/* Updated: 2024/04/28 18:53:13 by maiboyer ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef NODE_H +#define NODE_H + +#include "me/types.h" +#include "parser/api.h" + +typedef struct s_node +{ + t_u64 kind; + const char *kind_str; + const char *input; + char *single_str; + t_usize start; + t_usize end; + t_usize childs_count; + struct s_node *childs; +} t_node; + +t_node build_node(TSNode curr, t_const_str input); +t_str node_getstr(t_node *node); +void free_node(t_node t); + +#endif /* NODE_H */ diff --git a/shcat_c/includes/me b/shcat_c/includes/me new file mode 120000 index 00000000..41fd7216 --- /dev/null +++ b/shcat_c/includes/me @@ -0,0 +1 @@ +../stdme/include/me/ \ No newline at end of file diff --git a/shcat_c/includes/minishell.h b/shcat_c/includes/minishell.h index d6485fad..6ff1c10c 100644 --- a/shcat_c/includes/minishell.h +++ b/shcat_c/includes/minishell.h @@ -6,14 +6,14 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/28 14:41:15 by rparodi #+# #+# */ -/* Updated: 2024/04/13 20:17:16 by rparodi ### ########.fr */ +/* Updated: 2024/04/28 18:34:45 by maiboyer ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef MINISHELL_H #define MINISHELL_H -# include "./type_rust.h" +# include "me/types.h" # include # include diff --git a/shcat_c/includes/parser b/shcat_c/includes/parser new file mode 120000 index 00000000..1882f1f8 --- /dev/null +++ b/shcat_c/includes/parser @@ -0,0 +1 @@ +../parser/includes/ \ No newline at end of file diff --git a/shcat_c/sources/main.c b/shcat_c/sources/main.c index 28e69cac..1b7a004e 100644 --- a/shcat_c/sources/main.c +++ b/shcat_c/sources/main.c @@ -6,13 +6,13 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/28 14:40:38 by rparodi #+# #+# */ -/* Updated: 2024/04/13 17:47:50 by rparodi ### ########.fr */ +/* Updated: 2024/04/28 18:58:04 by maiboyer ### ########.fr */ /* */ /* ************************************************************************** */ #include "../includes/minishell.h" -t_i32 ft_check_type_operators(t_str operators) +t_i32 ft_check_type_operators(t_str operators) { if (operators == NULL) printf("End of input"); @@ -45,11 +45,11 @@ t_i32 ft_check_type_operators(t_str operators) return (1); } -void ft_check(t_utils *shcat, char **input) +void ft_check(t_utils *shcat, char **input) { - t_usize i; - t_usize prev_i; - + t_usize i; + t_usize prev_i; + i = 0; prev_i = 0; while (input[i] != NULL) @@ -69,9 +69,9 @@ void ft_check(t_utils *shcat, char **input) } } -void ft_take_args(t_utils *shcat) +void ft_take_args(t_utils *shcat) { - t_i32 i; + t_i32 i; i = 0; while (1) @@ -85,21 +85,21 @@ void ft_take_args(t_utils *shcat) ft_check(shcat, shcat->strs_input); add_history(shcat->str_input); ft_free_strs(shcat->strs_input); - free(shcat->str_input); - i++; - } + free(shcat->str_input); + i++; + } } -void ft_init_arge(t_str arge[], t_utils *utils) +void ft_init_arge(t_str arge[], t_utils *utils) { - size_t i; - char *temp; + size_t i; + char *temp; i = 0; temp = NULL; while (arge[i] != NULL) { - if (arge[i][0] == 'P' && arge[i][1] == 'A' && arge[i][2] == 'T' && \ + if (arge[i][0] == 'P' && arge[i][1] == 'A' && arge[i][2] == 'T' && arge[i][3] == 'H' && arge[i][4] == '=') { temp = ft_strdup(arge[i] + 5); @@ -107,7 +107,7 @@ void ft_init_arge(t_str arge[], t_utils *utils) ft_exit(utils, 1); else utils->path = ft_split(temp, ':'); - break ; + break; } i++; } @@ -115,16 +115,69 @@ void ft_init_arge(t_str arge[], t_utils *utils) free(temp); } -t_i32 main(t_i32 argc, t_str argv[], t_str arge[]) -{ - t_utils *shcat; +// t_i32 main(t_i32 argc, t_str argv[], t_str arge[]) +// { +// t_utils *shcat; +// +// shcat = (t_utils *)ft_calloc(sizeof(t_utils), 1); +// if (argc == 2) +// shcat->name_shell = ft_strdup(strcat(argv[1], " \001🐱\002 > ")); +// else +// shcat->name_shell = ft_strdup("shcat \001🐱\002 > "); +// shcat->envp = arge; +// ft_init_arge(arge, shcat); +// ft_take_args(shcat); +// } - shcat = (t_utils *)ft_calloc(sizeof(t_utils), 1); - if (argc == 2) - shcat->name_shell = ft_strdup(strcat(argv[1], " \001🐱\002 > ")); - else - shcat->name_shell = ft_strdup("shcat \001🐱\002 > "); - shcat->envp = arge; - ft_init_arge(arge, shcat); - ft_take_args(shcat); +#include "app/node.h" +#include "me/string/str_len.h" +#include "parser/api.h" +#include "parser/parser.h" + +TSLanguage *tree_sitter_bash(void); + +t_node parse_to_nodes(TSParser *parser, t_const_str input) +{ + TSTree *tree; + TSNode node; + t_node ret; + + tree = ts_parser_parse_string(parser, NULL, input, str_len(input)); + node = ts_tree_root_node(tree); + ret = build_node(node, input); + ts_tree_delete(tree); + return (ret); +} + +void print_node_data(t_node *t, t_usize depth) +{ + t_usize idx; + + idx = 0; + while (idx++ < depth) + printf("\t"); + idx = 0; + printf("%s = %s\n", t->kind_str, node_getstr(t)); + while (idx < t->childs_count) + print_node_data(&t->childs[idx++], depth + 1); +} + +t_i32 main(t_i32 argc, t_str argv[], t_str envp[]) +{ + t_str input; + TSLanguage *lang; + TSParser *parser; + t_node root_node; + + (void)(argc); + (void)(argv); + (void)(envp); + lang = tree_sitter_bash(); + parser = ts_parser_new(); + ts_parser_set_language(parser, lang); + input = "test \n cmd"; + root_node = parse_to_nodes(parser, input); + print_node_data(&root_node, 0); + free_node(root_node); + ts_parser_delete(parser); } diff --git a/shcat_c/sources/node/create_node.c b/shcat_c/sources/node/create_node.c new file mode 100644 index 00000000..eab6414a --- /dev/null +++ b/shcat_c/sources/node/create_node.c @@ -0,0 +1,13 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* create_node.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: maiboyer +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/28 18:29:36 by maiboyer #+# #+# */ +/* Updated: 2024/04/28 18:31:36 by maiboyer ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "parser/api.h" diff --git a/shcat_c/sources/node/node.c b/shcat_c/sources/node/node.c new file mode 100644 index 00000000..6c1cfc85 --- /dev/null +++ b/shcat_c/sources/node/node.c @@ -0,0 +1,87 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* node.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: maiboyer +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/28 18:36:40 by maiboyer #+# #+# */ +/* Updated: 2024/04/28 18:53:21 by maiboyer ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "app/node.h" +#include "me/mem/mem_alloc.h" +#include "me/mem/mem_alloc_array.h" +#include "me/string/str_l_copy.h" +#include "parser/api.h" + +t_node build_node(TSNode curr, t_const_str input); + +t_node *build_childs(TSNode parent, t_const_str input, t_usize count) +{ + t_node *ret; + t_usize idx; + TSNode child; + + ret = mem_alloc_array(sizeof(*ret), count); + if (ret == NULL) + return (NULL); + idx = 0; + while (idx < count) + { + child = ts_node_named_child(parent, idx); + ret[idx] = build_node(child, input); + idx++; + } + return (ret); +} + +t_node build_node(TSNode curr, t_const_str input) +{ + t_node out; + + out.kind = ts_node_symbol(curr); + out.kind_str = ts_node_type(curr); + out.start = ts_node_start_byte(curr); + out.end = ts_node_end_byte(curr); + out.input = input; + out.single_str = NULL; + out.childs_count = ts_node_named_child_count(curr); + if (out.childs_count == 0) + out.childs = NULL; + else + out.childs = build_childs(curr, input, out.childs_count); + return (out); +} + +t_str node_getstr(t_node *node) +{ + t_usize start; + t_usize end; + t_str ret; + + if (node->single_str == NULL) + { + start = node->start; + end = node->end; + if (start > end) + return (NULL); + ret = mem_alloc(end - start + 1); + str_l_copy(ret, node->input + start, end - start + 1); + node->single_str = ret; + } + return (node->single_str); +} + +void free_node(t_node t) +{ + t_usize idx; + + idx = 0; + while (idx < t.childs_count) + free_node(t.childs[idx++]); + free(t.childs); + if (t.single_str != NULL) + free(t.single_str); +}