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_default.c\
|
||||||
lexer/lexer_delim.c\
|
lexer/lexer_delim.c\
|
||||||
lexer/lexer_dquote.c\
|
lexer/lexer_dquote.c\
|
||||||
|
lexer/lexer_end.c\
|
||||||
lexer/lexer_great.c\
|
lexer/lexer_great.c\
|
||||||
lexer/lexer_greatand.c\
|
lexer/lexer_greatand.c\
|
||||||
lexer/lexer_less.c\
|
lexer/lexer_less.c\
|
||||||
|
|
|
||||||
|
|
@ -32,16 +32,12 @@
|
||||||
# define TK_PAREN_CLOSE (1 << 12)
|
# define TK_PAREN_CLOSE (1 << 12)
|
||||||
# define TK_BQUOTE (1 << 13)
|
# define TK_BQUOTE (1 << 13)
|
||||||
# define TK_WORD (1 << 14)
|
# 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_COMMAND (1 << 17)
|
||||||
# define TK_SUBSHELL (1 << 18)
|
# define TK_SUBSHELL (1 << 18)
|
||||||
# define TK_NEWLINE (1 << 19)
|
# 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_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
|
enum e_lexstate
|
||||||
{
|
{
|
||||||
|
|
@ -62,6 +58,7 @@ enum e_lexstate
|
||||||
BACKSLASH,
|
BACKSLASH,
|
||||||
PAREN,
|
PAREN,
|
||||||
COMMENT,
|
COMMENT,
|
||||||
|
END,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct s_token
|
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_backslash(t_list **alst, t_lexer *lexer);
|
||||||
int lexer_paren(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_comment(t_list **alst, t_lexer *lexer);
|
||||||
|
int lexer_end(t_list **alst, t_lexer *lexer);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -33,5 +33,7 @@ t_lexstate get_state_global(t_lexer *lexer)
|
||||||
return (BQUOTE);
|
return (BQUOTE);
|
||||||
else if (c == '(' || c == ')')
|
else if (c == '(' || c == ')')
|
||||||
return (PAREN);
|
return (PAREN);
|
||||||
|
else if (c == 0)
|
||||||
|
return (END);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,19 @@ int lexer_bquote(t_list **alst, t_lexer *lexer)
|
||||||
lexer->state = top_state == DQUOTE_BQUOTE ? DQUOTE : DEFAULT;
|
lexer->state = top_state == DQUOTE_BQUOTE ? DQUOTE : DEFAULT;
|
||||||
return (lexer_lex(alst, lexer));
|
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++;
|
lexer->pos++;
|
||||||
return (lexer_lex(alst, lexer));
|
return (lexer_lex(alst, lexer));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,6 @@ int lexer_dquote(t_list **alst, t_lexer *lexer)
|
||||||
if (lexer->str[lexer->pos] == '"')
|
if (lexer->str[lexer->pos] == '"')
|
||||||
{
|
{
|
||||||
lexer->pos++;
|
lexer->pos++;
|
||||||
/* if (!(lexer->stack && *(int*)lexer->stack->content != BQUOTE)) */
|
|
||||||
if (!(lexer->stack && *(int*)lexer->stack->content == DQUOTE))
|
if (!(lexer->stack && *(int*)lexer->stack->content == DQUOTE))
|
||||||
{
|
{
|
||||||
push(&lexer->stack, 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] == '\\')
|
||||||
{
|
{
|
||||||
if (lexer->str[lexer->pos + 1] == '"')
|
lexer->pos++;
|
||||||
token_append(token, lexer, 1, 0);
|
if (lexer->str[lexer->pos] == 0)
|
||||||
else if (lexer->str[lexer->pos + 1] == 0)
|
|
||||||
{
|
{
|
||||||
push(&lexer->stack, BACKSLASH);
|
push(&lexer->stack, BACKSLASH);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
token_append(token, lexer, 1, 1);
|
||||||
lexer->pos++;
|
lexer->pos++;
|
||||||
token_append(token, lexer, 1, 1);
|
return (lexer_lex(alst,lexer));
|
||||||
return (lexer_dquote(alst,lexer));
|
|
||||||
}
|
}
|
||||||
else if (lexer->str[lexer->pos] == '`')
|
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_backslash,
|
||||||
&lexer_paren,
|
&lexer_paren,
|
||||||
&lexer_comment,
|
&lexer_comment,
|
||||||
|
&lexer_end,
|
||||||
};
|
};
|
||||||
|
|
||||||
int ft_is_delim(char c)
|
int ft_is_delim(char c)
|
||||||
|
|
@ -42,8 +43,8 @@ int lexer_lex(t_list **alst, t_lexer *lexer)
|
||||||
{
|
{
|
||||||
t_token *token;
|
t_token *token;
|
||||||
|
|
||||||
if (!lexer->str[lexer->pos])
|
if (lexer->str[lexer->pos] == 0)
|
||||||
return (0);
|
return (lexer_end(alst, lexer));
|
||||||
if (!*alst)
|
if (!*alst)
|
||||||
{
|
{
|
||||||
token = token_init();
|
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);
|
DG("[{mag}%s{eoc}] stack=[%i] state=[%i]", lexer.str, lexer.stack ? *(int*)lexer.stack->content : 0, lexer.state);
|
||||||
token_print(token);
|
token_print(token);
|
||||||
} while (lexer.stack);
|
} while (lexer.stack);
|
||||||
DG("after lexing");
|
|
||||||
token_print(token);
|
|
||||||
if (ft_parse(&ast, &token))
|
if (ft_parse(&ast, &token))
|
||||||
return (1);
|
return (1);
|
||||||
btree_print(STDBUG, ast, &ft_putast);
|
btree_print(STDBUG, ast, &ft_putast);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue