diff options
| author | Charles Cabergs <me@cacharle.xyz> | 2020-10-10 08:39:24 +0200 |
|---|---|---|
| committer | Charles Cabergs <me@cacharle.xyz> | 2020-10-10 08:39:24 +0200 |
| commit | 5f908033e68f6f3e03f2c38f4c396a0eab77ed05 (patch) | |
| tree | 993f38b720a00b3013828da7969df22e05b013c3 | |
| parent | 25ca78b5a53c931b0bc388aef099974dbba4b6ff (diff) | |
| download | minishell-5f908033e68f6f3e03f2c38f4c396a0eab77ed05.tar.gz minishell-5f908033e68f6f3e03f2c38f4c396a0eab77ed05.tar.bz2 minishell-5f908033e68f6f3e03f2c38f4c396a0eab77ed05.zip | |
Norming lexer
| -rw-r--r-- | include/lexer.h | 26 | ||||
| -rw-r--r-- | include/minishell.h | 6 | ||||
| -rw-r--r-- | src/lexer/lexer.c | 29 | ||||
| -rw-r--r-- | src/lexer/tok_lst.c | 24 | ||||
| -rw-r--r-- | src/lexer/tok_lst_wrapper.c | 34 | ||||
| -rw-r--r-- | src/lexer/trim.c | 62 | ||||
| -rw-r--r-- | src/lexer/utils.c | 21 | ||||
| -rw-r--r-- | src/main.c | 5 |
8 files changed, 105 insertions, 102 deletions
diff --git a/include/lexer.h b/include/lexer.h index 36dfd5b..123531d 100644 --- a/include/lexer.h +++ b/include/lexer.h @@ -6,7 +6,7 @@ /* By: nahaddac <nahaddac@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/06/19 10:51:26 by nahaddac #+# #+# */ -/* Updated: 2020/10/09 13:44:09 by cacharle ### ########.fr */ +/* Updated: 2020/10/10 08:35:51 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -65,10 +65,6 @@ enum e_tok }; /* -** tok_lst.c -*/ - -/* ** \brief Token list struct ** \param content token string content ** \param next next token in the list (NULL if end) @@ -85,27 +81,33 @@ typedef struct s_tok_lst enum e_tok tag; } t_tok_lst; +/* +** tok_lst.c +*/ + t_tok_lst *tok_lst_new(enum e_tok tag, char *content); t_tok_lst *tok_lst_new_until( enum e_tok tag, char *content, size_t n); -void tok_lst_push_back( - t_tok_lst **tokens, t_tok_lst *pushed); t_tok_lst *tok_lst_push_front( t_tok_lst **tokens, t_tok_lst *pushed); +t_tok_lst *tok_lst_uncons(t_tok_lst **tokens); + +/* +** tok_lst_wrapper.c +*/ + +void tok_lst_push_back( + t_tok_lst **tokens, t_tok_lst *pushed); void tok_lst_pop_front( t_tok_lst **tokens, void (*del)(void*)); void *tok_lst_destroy( t_tok_lst **tokens, void (*del)(void*)); t_tok_lst *tok_lst_last(t_tok_lst *tokens); -t_tok_lst *tok_lst_uncons(t_tok_lst **tokens); /* ** lexer.c */ -int len_until_sep(char *input); -int tok_len(char *input); -t_tok_lst *create_token_list(char *input, t_tok_lst **lst); int lexer(char *input, t_tok_lst **out); /* @@ -113,9 +115,7 @@ int lexer(char *input, t_tok_lst **out); */ enum e_tok tok_assign_tag(char *content); -enum e_tok tok_assign_stick(t_tok_lst *tok); enum e_tok tok_assign_str(t_tok_lst *tok); -int lexer_sep(char input); int lexer_space(char *input); int quote_len(char *input, int i); diff --git a/include/minishell.h b/include/minishell.h index 4181c46..b1af152 100644 --- a/include/minishell.h +++ b/include/minishell.h @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/26 15:33:51 by cacharle #+# #+# */ -/* Updated: 2020/10/10 08:08:21 by cacharle ### ########.fr */ +/* Updated: 2020/10/10 08:14:38 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,6 +37,7 @@ # include "libft_dstr.h" # include "lexer.h" +# include "parser.h" # include "error.h" /* @@ -151,15 +152,12 @@ bool utils_strisblank(char *str); bool setup(char *first_arg, t_env env); - /* ** debug.c */ # ifdef MINISHELL_TEST -# include "parser.h" - int debug_lexer(char *input); int debug_parser(char *input); void ast_print(int level, t_ast *ast); diff --git a/src/lexer/lexer.c b/src/lexer/lexer.c index 5df63ba..749450b 100644 --- a/src/lexer/lexer.c +++ b/src/lexer/lexer.c @@ -6,14 +6,19 @@ /* By: nahaddac <nahaddac@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/07/16 08:18:25 by nahaddac #+# #+# */ -/* Updated: 2020/10/09 15:12:51 by cacharle ### ########.fr */ +/* Updated: 2020/10/10 08:35:03 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" #include <stdio.h> -int len_until_sep(char *input) +static int st_lexer_sep(char c) +{ + return (ft_strchr(";&|><()", c) != NULL); +} + +static int st_len_until_sep(char *input) { int i; @@ -26,10 +31,10 @@ int len_until_sep(char *input) if (ft_isblank(input[i])) return (i + 1 + lexer_space(&input[i + 1])); else if (input[i] != '\'' || input[i] != '"') - i += len_until_sep(&input[i]); + i += st_len_until_sep(&input[i]); return (i); } - if (lexer_sep(input[i])) + if (st_lexer_sep(input[i])) return (i); if (input[i] == '\'' || input[i] == '"') return (i); @@ -39,19 +44,19 @@ int len_until_sep(char *input) return (i); } -int tok_len(char *input) +static int st_tok_len(char *input) { int i; i = 0; - if (input[i] == '\\' && lexer_sep(input[i + 1])) + if (input[i] == '\\' && st_lexer_sep(input[i + 1])) { i += 2; return (i + lexer_space(&input[i])); } if (input[i] == '(' || input[i] == ')') return (i + 1); - if (lexer_sep(input[i])) + if (st_lexer_sep(input[i])) { if (input[i] != ';' && input[i] == input[i + 1]) i++; @@ -61,7 +66,7 @@ int tok_len(char *input) return (quote_len(input, i)); if (ft_isblank(input[i])) return (i + 1 + lexer_space(&input[i + 1])); - return (len_until_sep(&input[i])); + return (st_len_until_sep(&input[i])); } /* @@ -72,7 +77,7 @@ int tok_len(char *input) ** return all token */ -t_tok_lst *create_token_list(char *input, t_tok_lst **lst) +static t_tok_lst *st_create_token_list(char *input, t_tok_lst **lst) { t_tok_lst *tok; size_t i; @@ -83,7 +88,7 @@ t_tok_lst *create_token_list(char *input, t_tok_lst **lst) i = 0; while (i < len) { - j = tok_len(&input[i]); + j = st_tok_len(&input[i]); tok = tok_lst_new_until(0, input + i, j); tok->tag = tok_assign_tag(tok->content); if (tok->tag == 0) @@ -103,12 +108,12 @@ t_tok_lst *create_token_list(char *input, t_tok_lst **lst) ** \return The created tokens or NULL on error */ -int lexer(char *input, t_tok_lst **out) +int lexer(char *input, t_tok_lst **out) { int status; *out = NULL; - *out = create_token_list(input, out); + *out = st_create_token_list(input, out); status = lexer_trim(*out); return (status); } diff --git a/src/lexer/tok_lst.c b/src/lexer/tok_lst.c index 89ab120..ac8ca4a 100644 --- a/src/lexer/tok_lst.c +++ b/src/lexer/tok_lst.c @@ -6,7 +6,7 @@ /* By: charles <me@cacharle.xyz> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/08/27 09:32:58 by charles #+# #+# */ -/* Updated: 2020/10/09 15:14:38 by cacharle ### ########.fr */ +/* Updated: 2020/10/10 08:15:34 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -45,11 +45,6 @@ t_tok_lst *tok_lst_new_until( return (ret); } -void tok_lst_push_back(t_tok_lst **tokens, t_tok_lst *pushed) -{ - ft_lstpush_back((t_ftlst**)tokens, (t_ftlst*)pushed); -} - t_tok_lst *tok_lst_push_front( t_tok_lst **tokens, t_tok_lst *pushed) { @@ -59,23 +54,6 @@ t_tok_lst *tok_lst_push_front( return (*tokens); } -void tok_lst_pop_front( - t_tok_lst **tokens, void (*del)(void*)) -{ - ft_lstpop_front((t_ftlst**)tokens, del); -} - -void *tok_lst_destroy(t_tok_lst **tokens, void (*del)(void*)) -{ - ft_lstdestroy((t_ftlst**)tokens, del); - return (NULL); -} - -t_tok_lst *tok_lst_last(t_tok_lst *tokens) -{ - return ((t_tok_lst*)ft_lstlast((t_ftlst*)tokens)); -} - t_tok_lst *tok_lst_uncons(t_tok_lst **tokens) { t_tok_lst *poped; diff --git a/src/lexer/tok_lst_wrapper.c b/src/lexer/tok_lst_wrapper.c new file mode 100644 index 0000000..2852451 --- /dev/null +++ b/src/lexer/tok_lst_wrapper.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tok_lst_wrapper.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle <me@cacharle.xyz> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/10/10 08:15:38 by cacharle #+# #+# */ +/* Updated: 2020/10/10 08:17:04 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "lexer.h" + +void tok_lst_push_back(t_tok_lst **tokens, t_tok_lst *pushed) +{ + ft_lstpush_back((t_ftlst **)tokens, (t_ftlst *)pushed); +} + +void tok_lst_pop_front(t_tok_lst **tokens, void (*del)(void *)) +{ + ft_lstpop_front((t_ftlst **)tokens, del); +} + +void *tok_lst_destroy(t_tok_lst **tokens, void (*del)(void *)) +{ + ft_lstdestroy((t_ftlst **)tokens, del); + return (NULL); +} + +t_tok_lst *tok_lst_last(t_tok_lst *tokens) +{ + return ((t_tok_lst *)ft_lstlast((t_ftlst *)tokens)); +} diff --git a/src/lexer/trim.c b/src/lexer/trim.c index d0ba90a..efc5171 100644 --- a/src/lexer/trim.c +++ b/src/lexer/trim.c @@ -6,13 +6,13 @@ /* By: nahaddac <nahaddac@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/07/16 08:18:36 by nahaddac #+# #+# */ -/* Updated: 2020/10/09 15:17:45 by cacharle ### ########.fr */ +/* Updated: 2020/10/10 08:32:41 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -void del_space(char *str) +static void st_del_space(char *str) { int i; @@ -30,50 +30,46 @@ void del_space(char *str) } } -int del_quote(char *str) +static size_t st_count_quote(char *str) { - size_t i; - size_t quote_counter; + char quote_char; + size_t counter; - i = 0; - quote_counter = 1; - if (str[0] == '\'') - { - while (str[i++] != '\0') - { - if (str[i] == '\'') - { - quote_counter++; - break ; - } - } - } - else if (str[0] == '"') + if (*str != '\'' && *str != '"') + return (0); + quote_char = *str; + counter = 1; + str++; + while (*str != '\0') { - while (str[i++] != '\0') + if (quote_char == '"' && *str == '\\') + str += 2; + if (*str == quote_char) { - if (str[i] == '\\') - i += 2; - if (str[i] == '"') - { - quote_counter++; - break ; - } + counter++; + *str = '\0'; + break ; } + str++; } - else - return (0); + return (counter); +} + +static int st_del_quote(char *str) +{ + size_t quote_counter; + + quote_counter = st_count_quote(str); if (quote_counter % 2 == 1) { errorf("unexpected EOF while looking for matching `%c'\n", str[0]); return (2); } - str[i] = '\0'; ft_memmove(str, str + 1, ft_strlen(str + 1) + 1); return (0); } -int lexer_trim(t_tok_lst *tokens) +int lexer_trim(t_tok_lst *tokens) { int status; @@ -81,14 +77,14 @@ int lexer_trim(t_tok_lst *tokens) { if (tokens->tag & (TAG_STR_DOUBLE | TAG_STR_SINGLE)) { - if ((status = del_quote(tokens->content)) != 0) + if ((status = st_del_quote(tokens->content)) != 0) return (status); if (tokens->next == NULL) tokens->tag &= ~TAG_STICK; } else { - del_space(tokens->content); + st_del_space(tokens->content); if (tokens->next == NULL) tokens->tag &= ~TAG_STICK; } diff --git a/src/lexer/utils.c b/src/lexer/utils.c index 624b460..0d8080c 100644 --- a/src/lexer/utils.c +++ b/src/lexer/utils.c @@ -6,13 +6,13 @@ /* By: nahaddac <nahaddac@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/07/16 08:18:15 by nahaddac #+# #+# */ -/* Updated: 2020/10/09 15:24:31 by cacharle ### ########.fr */ +/* Updated: 2020/10/10 08:38:46 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -enum e_tok tok_assign_tag(char *content) +enum e_tok tok_assign_tag(char *content) { if (content[0] == ';') return (TAG_END); @@ -41,9 +41,9 @@ enum e_tok tok_assign_tag(char *content) ** a la fin (char *)tk->tok ne figure pas d'espace. */ -enum e_tok tok_assign_stick(t_tok_lst *tok) +static enum e_tok st_tok_assign_stick(t_tok_lst *tok) { - int i; + int i; i = ft_strlen(tok->content); if (i > 0 && ft_isblank(tok->content[i - 1])) @@ -57,7 +57,7 @@ enum e_tok tok_assign_stick(t_tok_lst *tok) ** \note the loop after ft_strpbrk is to search again if the quote was escaped */ -enum e_tok tok_assign_str(t_tok_lst *tok) +enum e_tok tok_assign_str(t_tok_lst *tok) { char *found; @@ -70,20 +70,15 @@ enum e_tok tok_assign_str(t_tok_lst *tok) tok->tag = TAG_STR_SINGLE; else if (*found == '"') tok->tag = TAG_STR_DOUBLE; - return (tok_assign_stick(tok)); + return (st_tok_assign_stick(tok)); } -int lexer_sep(char c) -{ - return (ft_strchr(";&|><()", c) != NULL); -} - -int lexer_space(char *input) +int lexer_space(char *input) { return (ft_strspn(input, " \t")); } -int quote_len(char *input, int i) +int quote_len(char *input, int i) { char quote_type; @@ -6,7 +6,7 @@ /* By: cacharle <cacharle@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/28 11:45:44 by cacharle #+# #+# */ -/* Updated: 2020/10/09 15:51:00 by cacharle ### ########.fr */ +/* Updated: 2020/10/10 08:39:05 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,9 +20,6 @@ #include "parser.h" #include "eval.h" -int debug_lexer(char *input); -int debug_parser(char *input); - t_state g_state; int run_eval(t_env env, t_parsed *parser_out) |
