backslash should work, also keep NL when they are quoted

This commit is contained in:
Jack Halford 2017-02-12 18:11:59 +01:00
parent f7ed0a6bdd
commit 742a99440e
8 changed files with 45 additions and 16 deletions

View file

@ -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\

View file

@ -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

View file

@ -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);
}

View file

@ -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));
}

View file

@ -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] == '`')
{

View 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);
}

View file

@ -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();

View file

@ -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);