initial implementation looks ok, parenthesis needs fix

This commit is contained in:
Jack Halford 2017-02-10 05:19:26 +01:00
parent e8cd4f45b0
commit 6ec9f9295e
17 changed files with 150 additions and 189 deletions

View file

@ -137,7 +137,6 @@ job-control/sigtstp_handler.c\
job-control/sigttin_handler.c\ job-control/sigttin_handler.c\
job-control/sigttou_handler.c\ job-control/sigttou_handler.c\
lexer/command_getoutput.c\ lexer/command_getoutput.c\
lexer/ft_post_tokenize.c\
lexer/get_state_global.c\ lexer/get_state_global.c\
lexer/get_state_redir.c\ lexer/get_state_redir.c\
lexer/lexer_backslash.c\ lexer/lexer_backslash.c\
@ -153,9 +152,9 @@ lexer/lexer_lessand.c\
lexer/lexer_lex.c\ lexer/lexer_lex.c\
lexer/lexer_newline.c\ lexer/lexer_newline.c\
lexer/lexer_number.c\ lexer/lexer_number.c\
lexer/lexer_paren.c\
lexer/lexer_quote.c\ lexer/lexer_quote.c\
lexer/lexer_sep.c\ lexer/lexer_sep.c\
lexer/lexer_subshell.c\
lexer/lexer_word.c\ lexer/lexer_word.c\
lexer/reduce_bquotes.c\ lexer/reduce_bquotes.c\
lexer/reduce_parens.c\ lexer/reduce_parens.c\

View file

@ -31,14 +31,15 @@
# define TK_PAREN_OPEN (1 << 11) # define TK_PAREN_OPEN (1 << 11)
# define TK_PAREN_CLOSE (1 << 12) # define TK_PAREN_CLOSE (1 << 12)
# define TK_BQUOTE (1 << 13) # define TK_BQUOTE (1 << 13)
# define TK_N_WORD (1 << 14) # define TK_WORD (1 << 14)
# define TK_Q_WORD (1 << 15) /* # define TK_N_WORD (1 << 14) */
# define TK_DQ_WORD (1 << 16) /* # 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_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_PAREN_OPEN | TK_PAREN_CLOSE | TK_BQUOTE)
@ -58,7 +59,7 @@ enum e_lexstate
DQUOTE, DQUOTE,
BQUOTE, BQUOTE,
BACKSLASH, BACKSLASH,
SUBSHELL, PAREN,
COMMENT, COMMENT,
}; };
@ -116,7 +117,7 @@ int lexer_quote(t_list **alst, t_lexer *lexer);
int lexer_dquote(t_list **alst, t_lexer *lexer); int lexer_dquote(t_list **alst, t_lexer *lexer);
int lexer_bquote(t_list **alst, t_lexer *lexer); 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_subshell(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);
#endif #endif

View file

@ -1,40 +0,0 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_post_tokenize.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/01/11 16:11:11 by jhalford #+# #+# */
/* Updated: 2017/02/06 14:33:34 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "lexer.h"
int ft_post_tokenize(t_list **alst, char **str)
{
int ret;
t_flag tk;
while ((ret = reduce_parens(alst, *str)))
if (ret == -1)
{
ft_dprintf(2, "{red}%s: parse error near '('{eoc}\n", SHELL_NAME);
return (-1);
}
tk = TK_PAREN_CLOSE;
if (ft_lst_find(*alst, &tk, token_cmp_type))
{
ft_dprintf(2, "{red}%s: parse error near ')'{eoc}\n", SHELL_NAME);
return (-1);
}
while ((ret = reduce_bquotes(alst, str)))
if (ret == -1)
{
ft_dprintf(2, "{red}%s: parse error near '`'{eoc}\n", SHELL_NAME);
return (-1);
}
DG("new command from bquotes: '%s'", *str);
return (0);
}

View file

@ -32,6 +32,6 @@ t_lexstate get_state_global(t_lexer *lexer)
else if (c == '`') else if (c == '`')
return (BQUOTE); return (BQUOTE);
else if (c == '(' || c == ')') else if (c == '(' || c == ')')
return (SUBSHELL); return (PAREN);
return (0); return (0);
} }

View file

@ -17,19 +17,21 @@ int lexer_bquote(t_list **alst, t_lexer *lexer)
t_token *token; t_token *token;
token = (*alst)->content; token = (*alst)->content;
token->type = TK_Q_WORD; token->type = TK_WORD;
lexer->pos++;
push(&lexer->stack, BQUOTE);
if (lexer->str[lexer->pos] == '`') if (lexer->str[lexer->pos] == '`')
{ {
lexer->state = WORD;
lexer->pos++; lexer->pos++;
if (!(lexer->stack && *(int*)lexer->stack->content == BQUOTE))
{
push(&lexer->stack, BQUOTE);
return (lexer_lex(alst, lexer));
}
lexer->state = WORD;
pop(&lexer->stack); pop(&lexer->stack);
return (lexer_lex(alst, lexer)); return (lexer_lex(alst, lexer));
} }
else if (lexer->str[lexer->pos] == 0)
return (0);
token_append(token, lexer, 0, 0); token_append(token, lexer, 0, 0);
lexer->pos++;
return (lexer_quote(alst, lexer)); return (lexer_quote(alst, lexer));
} }

View file

@ -14,27 +14,16 @@
int lexer_default(t_list **alst, t_lexer *lexer) int lexer_default(t_list **alst, t_lexer *lexer)
{ {
t_lexstate state;
t_token *token; t_token *token;
char c; char c;
c = lexer->str[lexer->pos]; c = lexer->str[lexer->pos];
if ((state = get_state_global(lexer))) if ((lexer->state = get_state_global(lexer)))
{
lexer->state = state;
return (lexer_lex(alst, lexer)); return (lexer_lex(alst, lexer));
} if ((lexer->state = get_state_redir(lexer)))
if ((state = get_state_redir(lexer)))
{
lexer->state = state;
return (lexer_lex(alst, lexer)); return (lexer_lex(alst, lexer));
} lexer->state = ft_isdigit(c) ? NUMBER : WORD;
else if (ft_isdigit(c))
lexer->state = NUMBER;
else
lexer->state = WORD;
token = (*alst)->content; token = (*alst)->content;
token_append(token, lexer, 0, 0); token->type = TK_WORD;
token->type = TK_N_WORD;
return (lexer_lex(alst, lexer)); return (lexer_lex(alst, lexer));
} }

View file

@ -17,13 +17,17 @@ int lexer_delim(t_list **alst, t_lexer *lexer)
t_token *token; t_token *token;
token = (*alst)->content; token = (*alst)->content;
DG("DELIM");
while (ft_is_delim(lexer->str[lexer->pos])) while (ft_is_delim(lexer->str[lexer->pos]))
lexer->pos++; lexer->pos++;
lexer->state = DEFAULT;
if (token->type) if (token->type)
{
return (lexer_lex(&(*alst)->next, lexer)); return (lexer_lex(&(*alst)->next, lexer));
}
else else
{ {
if (!lexer->str[lexer->pos]) if (lexer->str[lexer->pos] == 0)
ft_lst_delif(alst, (*alst)->content, &ft_addrcmp, &token_free); ft_lst_delif(alst, (*alst)->content, &ft_addrcmp, &token_free);
return (lexer_lex(alst, lexer)); return (lexer_lex(alst, lexer));
} }

View file

@ -17,18 +17,20 @@ int lexer_dquote(t_list **alst, t_lexer *lexer)
t_token *token; t_token *token;
token = (*alst)->content; token = (*alst)->content;
token->type = TK_DQ_WORD; token->type = TK_WORD;
if (*(int*)lexer->stack->content != DQUOTE)
push(&lexer->stack, DQUOTE);
lexer->pos++;
if (lexer->str[lexer->pos] == '"') if (lexer->str[lexer->pos] == '"')
{ {
lexer->pos++; lexer->pos++;
if (!(lexer->stack && *(int*)lexer->stack->content == DQUOTE))
{
push(&lexer->stack, DQUOTE);
return (lexer_lex(alst, lexer));
}
lexer->state = WORD; lexer->state = WORD;
pop(&lexer->stack); pop(&lexer->stack);
return (lexer_lex(alst, lexer)); return (lexer_lex(alst, lexer));
} }
else if (lexer->str[lexer->pos] == '\\') if (lexer->str[lexer->pos] == '\\')
{ {
if (lexer->str[lexer->pos + 1] == '"') if (lexer->str[lexer->pos + 1] == '"')
token_append(token, lexer, 1, 0); token_append(token, lexer, 1, 0);
@ -42,9 +44,11 @@ int lexer_dquote(t_list **alst, t_lexer *lexer)
return (lexer_dquote(alst,lexer)); return (lexer_dquote(alst,lexer));
} }
else if (lexer->str[lexer->pos] == '`') else if (lexer->str[lexer->pos] == '`')
{
lexer->state = BQUOTE;
lexer_bquote(alst, lexer); lexer_bquote(alst, lexer);
else if (lexer->str[lexer->pos] == 0) }
return (0); token_append(token, lexer, 1, 0);
token_append(token, lexer, 1, 0); lexer->pos++;
return (lexer_dquote(alst, lexer)); return (lexer_lex(alst, lexer));
} }

View file

@ -28,7 +28,7 @@ int (*g_lexer[])(t_list **alst, t_lexer *lexer) =
&lexer_dquote, &lexer_dquote,
&lexer_bquote, &lexer_bquote,
&lexer_backslash, &lexer_backslash,
&lexer_subshell, &lexer_paren,
&lexer_comment, &lexer_comment,
}; };

View file

@ -0,0 +1,31 @@
#include "lexer.h"
int lexer_paren(t_list **alst, t_lexer *lexer)
{
t_token *token;
t_list **lst;
lst = alst;
if (*alst)
{
token = (*alst)->content;
if (token->type)
lst = &(*alst)->next;
}
token = token_init();
*lst = ft_lstnew(token, sizeof(*token));
token = (*lst)->content;
if (lexer->str[lexer->pos] == '(')
{
token->type = TK_PAREN_OPEN;
push(&lexer->stack, PAREN);
}
else if (lexer->stack && *(int*)lexer->stack->content == PAREN)
{
token->type = TK_PAREN_CLOSE;
pop(&lexer->stack);
}
lexer->pos++;
lexer->state = DEFAULT;
return (lexer_lex(&(*lst)->next, lexer));
}

View file

@ -17,18 +17,20 @@ int lexer_quote(t_list **alst, t_lexer *lexer)
t_token *token; t_token *token;
token = (*alst)->content; token = (*alst)->content;
token->type = TK_Q_WORD; token->type = TK_WORD;
lexer->pos++;
push(&lexer->stack, QUOTE);
if (lexer->str[lexer->pos] == '\'') if (lexer->str[lexer->pos] == '\'')
{ {
lexer->state = WORD;
lexer->pos++; lexer->pos++;
if (!(lexer->stack && *(int*)lexer->stack->content == QUOTE))
{
push(&lexer->stack, QUOTE);
return (lexer_lex(alst, lexer));
}
lexer->state = WORD;
pop(&lexer->stack); pop(&lexer->stack);
return (lexer_lex(alst, lexer)); return (lexer_lex(alst, lexer));
} }
else if (lexer->str[lexer->pos] == 0)
return (0);
token_append(token, lexer, 1, 1); token_append(token, lexer, 1, 1);
return (lexer_quote(alst, lexer)); lexer->pos++;
return (lexer_lex(alst, lexer));
} }

View file

@ -1,37 +0,0 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* lexer_special.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/01/11 15:35:38 by jhalford #+# #+# */
/* Updated: 2017/02/09 22:09:07 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "lexer.h"
int lexer_subshell(t_list **alst, t_lexer *lexer)
{
t_token *token;
t_list **lst;
lst = alst;
if (*alst)
{
token = (*alst)->content;
if (token->type)
lst = &(*alst)->next;
}
token = token_init();
*lst = ft_lstnew(token, sizeof(*token));
token = (*lst)->content;
if (lexer->str[lexer->pos] == '(')
token->type = TK_PAREN_OPEN;
else if (lexer->str[lexer->pos] == ')')
token->type = TK_PAREN_CLOSE;
token->data = lexer->str;
lexer->pos++;
return (lexer_lex(&(*lst)->next, lexer));
}

View file

@ -18,9 +18,12 @@ int lexer_word(t_list **alst, t_lexer *lexer)
t_lexstate state; t_lexstate state;
token = (*alst)->content; token = (*alst)->content;
token->type = TK_N_WORD; token->type = TK_WORD;
if ((state = get_state_global(lexer))) if ((state = get_state_global(lexer)))
{
lexer->state = state;
return (lexer_lex(alst, lexer)); return (lexer_lex(alst, lexer));
}
if ((state = get_state_redir(lexer))) if ((state = get_state_redir(lexer)))
{ {
lexer->state = state; lexer->state = state;

View file

@ -27,8 +27,8 @@ char *stack_to_prompt(t_list *stack)
return ("dquote> "); return ("dquote> ");
else if (top == BQUOTE) else if (top == BQUOTE)
return ("bquote> "); return ("bquote> ");
else if (top == SUBSHELL) else if (top == PAREN)
return ("subsh> "); return ("subsh> ");
else else
return (" > "); return ("error> ");
} }

View file

@ -71,7 +71,7 @@ char *ft_read_stdin(void)
ft_print(ret); ft_print(ret);
else if (ret == 10) else if (ret == 10)
return (STR); return (STR);
/* else if (ft_isascii(ret) == 0) */ else if (ft_isascii(ret) == 0)
/* ft_read_it(ret, &POS, &STR); */ ft_read_it(ret, &POS, &STR);
} }
} }

View file

@ -10,62 +10,62 @@
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
/* #include "minishell.h" */ #include "minishell.h"
/* static void ft_read_it_3(char **str, char t[5], size_t *pos, int *j) */ static void ft_read_it_3(char **str, char t[5], size_t *pos, int *j)
/* { */ {
/* int i; */ int i;
/* i = 0; */ i = 0;
/* while (i < 4 && t[i] == '\0') */ while (i < 4 && t[i] == '\0')
/* ++i; */ ++i;
/* while (i < 4) */ while (i < 4)
/* { */ {
/* if (t[i] && ft_isprint(t[i])) */ if (t[i] && ft_isprint(t[i]))
/* { */ {
/* *str = ft_realloc_imput(*str, t[i], *pos); */ *str = ft_realloc_imput(*str, t[i], *pos);
/* ++(*pos); */ ++(*pos);
/* ++(*j); */ ++(*j);
/* } */ }
/* ++i; */ ++i;
/* } */ }
/* } */ }
/* static void ft_read_it_2(int input, char t[5]) */ static void ft_read_it_2(int input, char t[5])
/* { */ {
/* t[3] = (input / ft_pow(256, 3)) ? (input / ft_pow(256, 3)) : '\0'; */ t[3] = (input / ft_pow(256, 3)) ? (input / ft_pow(256, 3)) : '\0';
/* if (t[3]) */ if (t[3])
/* input = input % ft_pow(256, 3); */ input = input % ft_pow(256, 3);
/* t[2] = (input / ft_pow(256, 2)) ? (input / ft_pow(256, 2)) : '\0'; */ t[2] = (input / ft_pow(256, 2)) ? (input / ft_pow(256, 2)) : '\0';
/* if (t[2]) */ if (t[2])
/* input = input % ft_pow(256, 2); */ input = input % ft_pow(256, 2);
/* t[1] = (input / ft_pow(256, 1)) ? (input / ft_pow(256, 1)) : '\0'; */ t[1] = (input / ft_pow(256, 1)) ? (input / ft_pow(256, 1)) : '\0';
/* if (t[1]) */ if (t[1])
/* input = input % ft_pow(256, 1); */ input = input % ft_pow(256, 1);
/* t[0] = (input / ft_pow(256, 0)) ? (input / ft_pow(256, 0)) : '\0'; */ t[0] = (input / ft_pow(256, 0)) ? (input / ft_pow(256, 0)) : '\0';
/* if (t[0]) */ if (t[0])
/* input = input % ft_pow(256, 0); */ input = input % ft_pow(256, 0);
/* t[4] = '\0'; */ t[4] = '\0';
/* } */ }
/* void ft_read_it(int input, size_t *pos, char **str) */ void ft_read_it(int input, size_t *pos, char **str)
/* { */ {
/* int j; */ int j;
/* char t[5]; */ char t[5];
/* size_t pos_tmp; */ size_t pos_tmp;
/* j = 0; */ j = 0;
/* pos_tmp = *pos; */ pos_tmp = *pos;
/* if (input == TOUCHE_DELETE || input < 0 || input == 892427035 || */ if (input == TOUCHE_DELETE || input < 0 || input == 892427035 ||
/* input == 126 || input == 993090331 || input == 925981467 || */ input == 126 || input == 993090331 || input == 925981467 ||
/* input == 21298 || input == 892427035 || input == 8270395 || input == */ input == 21298 || input == 892427035 || input == 8270395 || input ==
/* 942758683 || input == 993090331 || input == 18489 || input == 17977) */ 942758683 || input == 993090331 || input == 18489 || input == 17977)
/* return ; */ return ;
/* ft_read_it_2(input, t); */ ft_read_it_2(input, t);
/* ft_read_it_3(str, t, pos, &j); */ ft_read_it_3(str, t, pos, &j);
/* *pos = pos_tmp; */ *pos = pos_tmp;
/* ft_current_str((*str), *pos); */ ft_current_str((*str), *pos);
/* ft_get_next_str((*str), pos); */ ft_get_next_str((*str), pos);
/* ft_putnc('\b', *pos - (pos_tmp + j)); */ ft_putnc('\b', *pos - (pos_tmp + j));
/* *pos = (pos_tmp + j); */ *pos = (pos_tmp + j);
/* } */ }

View file

@ -24,17 +24,20 @@ int interactive_shell()
lexer.str = NULL; lexer.str = NULL;
token = NULL; token = NULL;
lexer.stack = NULL; lexer.stack = NULL;
ast = NULL;
do { do {
if (lexer.stack && *(int*)lexer.stack->content == BACKSLASH) if (lexer.stack && *(int*)lexer.stack->content == BACKSLASH)
pop(&lexer.stack); pop(&lexer.stack);
ft_strappend(&lexer.str, readline(stack_to_prompt(lexer.stack))); ft_strappend(&lexer.str, readline(stack_to_prompt(lexer.stack)));
DG("[{mag}%s{eoc}]", lexer.str);
ltoken = ft_lstlast(token); ltoken = ft_lstlast(token);
lexer_lex((token ? &ltoken : &token), &lexer); lexer_lex((token ? &ltoken : &token), &lexer);
token_print(token); token_print(token);
} while (lexer.stack->content); } 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);
if (ft_exec(&ast)) if (ft_exec(&ast))
return (1); return (1);