diff --git a/42sh/Makefile b/42sh/Makefile index 0a38131a..4e41b851 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -145,6 +145,7 @@ lexer/lexer_comment.c\ lexer/lexer_default.c\ lexer/lexer_delim.c\ lexer/lexer_dquote.c\ +lexer/lexer_end.c\ lexer/lexer_great.c\ lexer/lexer_greatand.c\ lexer/lexer_less.c\ diff --git a/42sh/includes/lexer.h b/42sh/includes/lexer.h index f0405871..3385e5b8 100644 --- a/42sh/includes/lexer.h +++ b/42sh/includes/lexer.h @@ -32,16 +32,12 @@ # define TK_PAREN_CLOSE (1 << 12) # define TK_BQUOTE (1 << 13) # define TK_WORD (1 << 14) -/* # define TK_N_WORD (1 << 14) */ -/* # define TK_Q_WORD (1 << 15) */ -/* # define TK_DQ_WORD (1 << 16) */ # define TK_COMMAND (1 << 17) # define TK_SUBSHELL (1 << 18) # define TK_NEWLINE (1 << 19) -/* # define TK_WORD (TK_N_WORD | TK_Q_WORD | TK_DQ_WORD) */ # define TK_REDIR (0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20) -# define TK_NON_FREEABLE (TK_PAREN_OPEN | TK_PAREN_CLOSE | TK_BQUOTE) +# define TK_NON_FREEABLE (TK_BQUOTE) enum e_lexstate { @@ -62,6 +58,7 @@ enum e_lexstate BACKSLASH, PAREN, COMMENT, + END, }; struct s_token @@ -120,5 +117,6 @@ int lexer_bquote(t_list **alst, t_lexer *lexer); int lexer_backslash(t_list **alst, t_lexer *lexer); int lexer_paren(t_list **alst, t_lexer *lexer); int lexer_comment(t_list **alst, t_lexer *lexer); +int lexer_end(t_list **alst, t_lexer *lexer); #endif diff --git a/42sh/src/lexer/get_state_global.c b/42sh/src/lexer/get_state_global.c index bed48d83..38847ae2 100644 --- a/42sh/src/lexer/get_state_global.c +++ b/42sh/src/lexer/get_state_global.c @@ -33,5 +33,7 @@ t_lexstate get_state_global(t_lexer *lexer) return (BQUOTE); else if (c == '(' || c == ')') return (PAREN); + else if (c == 0) + return (END); return (0); } diff --git a/42sh/src/lexer/lexer_bquote.c b/42sh/src/lexer/lexer_bquote.c index 88dee442..0f961942 100644 --- a/42sh/src/lexer/lexer_bquote.c +++ b/42sh/src/lexer/lexer_bquote.c @@ -33,7 +33,19 @@ int lexer_bquote(t_list **alst, t_lexer *lexer) lexer->state = top_state == DQUOTE_BQUOTE ? DQUOTE : DEFAULT; return (lexer_lex(alst, lexer)); } + if (lexer->str[lexer->pos] == '\\') + { + lexer->pos++; + if (lexer->str[lexer->pos] == 0) + { + push(&lexer->stack, BACKSLASH); + return (0); + } + else + token_append(token, lexer, 1, 1); + lexer->pos++; + return (lexer_lex(alst,lexer)); + } lexer->pos++; return (lexer_lex(alst, lexer)); } - diff --git a/42sh/src/lexer/lexer_dquote.c b/42sh/src/lexer/lexer_dquote.c index 36399c62..1de82507 100644 --- a/42sh/src/lexer/lexer_dquote.c +++ b/42sh/src/lexer/lexer_dquote.c @@ -21,7 +21,6 @@ int lexer_dquote(t_list **alst, t_lexer *lexer) if (lexer->str[lexer->pos] == '"') { lexer->pos++; - /* if (!(lexer->stack && *(int*)lexer->stack->content != BQUOTE)) */ if (!(lexer->stack && *(int*)lexer->stack->content == DQUOTE)) { push(&lexer->stack, DQUOTE); @@ -33,16 +32,16 @@ int lexer_dquote(t_list **alst, t_lexer *lexer) } if (lexer->str[lexer->pos] == '\\') { - if (lexer->str[lexer->pos + 1] == '"') - token_append(token, lexer, 1, 0); - else if (lexer->str[lexer->pos + 1] == 0) + lexer->pos++; + if (lexer->str[lexer->pos] == 0) { push(&lexer->stack, BACKSLASH); return (0); } + else + token_append(token, lexer, 1, 1); lexer->pos++; - token_append(token, lexer, 1, 1); - return (lexer_dquote(alst,lexer)); + return (lexer_lex(alst,lexer)); } else if (lexer->str[lexer->pos] == '`') { diff --git a/42sh/src/lexer/lexer_end.c b/42sh/src/lexer/lexer_end.c new file mode 100644 index 00000000..f635cb3d --- /dev/null +++ b/42sh/src/lexer/lexer_end.c @@ -0,0 +1,18 @@ +#include "lexer.h" + +int lexer_end(t_list **alst, t_lexer *lexer) +{ + t_token *token; + + token = (*alst)->content; + if (lexer->state == QUOTE + || lexer->state == DQUOTE + || lexer->state == BQUOTE) + { + ft_strappend(&lexer->str, (char[]){'\n', 0}); + token_append(token, lexer, 1, 0); + lexer->pos++; + return (0); + } + return (0); +} diff --git a/42sh/src/lexer/lexer_lex.c b/42sh/src/lexer/lexer_lex.c index 1e9f4a03..9472a565 100644 --- a/42sh/src/lexer/lexer_lex.c +++ b/42sh/src/lexer/lexer_lex.c @@ -31,6 +31,7 @@ int (*g_lexer[])(t_list **alst, t_lexer *lexer) = &lexer_backslash, &lexer_paren, &lexer_comment, + &lexer_end, }; int ft_is_delim(char c) @@ -42,8 +43,8 @@ int lexer_lex(t_list **alst, t_lexer *lexer) { t_token *token; - if (!lexer->str[lexer->pos]) - return (0); + if (lexer->str[lexer->pos] == 0) + return (lexer_end(alst, lexer)); if (!*alst) { token = token_init(); diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index df8b4f98..3160048d 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -34,8 +34,6 @@ int interactive_shell() DG("[{mag}%s{eoc}] stack=[%i] state=[%i]", lexer.str, lexer.stack ? *(int*)lexer.stack->content : 0, lexer.state); token_print(token); } while (lexer.stack); - DG("after lexing"); - token_print(token); if (ft_parse(&ast, &token)) return (1); btree_print(STDBUG, ast, &ft_putast);