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

View file

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

View file

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

View file

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

View file

@ -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);
} }
lexer->pos++; else
token_append(token, lexer, 1, 1); token_append(token, lexer, 1, 1);
return (lexer_dquote(alst,lexer)); lexer->pos++;
return (lexer_lex(alst,lexer));
} }
else if (lexer->str[lexer->pos] == '`') 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_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();

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