backslash should work, also keep NL when they are quoted
This commit is contained in:
parent
f7ed0a6bdd
commit
742a99440e
8 changed files with 45 additions and 16 deletions
|
|
@ -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\
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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] == '`')
|
||||
{
|
||||
|
|
|
|||
18
42sh/src/lexer/lexer_end.c
Normal file
18
42sh/src/lexer/lexer_end.c
Normal file
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue