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/sigttou_handler.c\
lexer/command_getoutput.c\
lexer/ft_post_tokenize.c\
lexer/get_state_global.c\
lexer/get_state_redir.c\
lexer/lexer_backslash.c\
@ -153,9 +152,9 @@ lexer/lexer_lessand.c\
lexer/lexer_lex.c\
lexer/lexer_newline.c\
lexer/lexer_number.c\
lexer/lexer_paren.c\
lexer/lexer_quote.c\
lexer/lexer_sep.c\
lexer/lexer_subshell.c\
lexer/lexer_word.c\
lexer/reduce_bquotes.c\
lexer/reduce_parens.c\

View file

@ -31,14 +31,15 @@
# define TK_PAREN_OPEN (1 << 11)
# define TK_PAREN_CLOSE (1 << 12)
# define TK_BQUOTE (1 << 13)
# define TK_N_WORD (1 << 14)
# define TK_Q_WORD (1 << 15)
# define TK_DQ_WORD (1 << 16)
# 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_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)
@ -58,7 +59,7 @@ enum e_lexstate
DQUOTE,
BQUOTE,
BACKSLASH,
SUBSHELL,
PAREN,
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_bquote(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);
#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 == '`')
return (BQUOTE);
else if (c == '(' || c == ')')
return (SUBSHELL);
return (PAREN);
return (0);
}

View file

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

View file

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

View file

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

View file

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

View file

@ -28,7 +28,7 @@ int (*g_lexer[])(t_list **alst, t_lexer *lexer) =
&lexer_dquote,
&lexer_bquote,
&lexer_backslash,
&lexer_subshell,
&lexer_paren,
&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;
token = (*alst)->content;
token->type = TK_Q_WORD;
lexer->pos++;
push(&lexer->stack, QUOTE);
token->type = TK_WORD;
if (lexer->str[lexer->pos] == '\'')
{
lexer->state = WORD;
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);
return (lexer_lex(alst, lexer));
}
else if (lexer->str[lexer->pos] == 0)
return (0);
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;
token = (*alst)->content;
token->type = TK_N_WORD;
token->type = TK_WORD;
if ((state = get_state_global(lexer)))
{
lexer->state = state;
return (lexer_lex(alst, lexer));
}
if ((state = get_state_redir(lexer)))
{
lexer->state = state;

View file

@ -22,13 +22,13 @@ char *stack_to_prompt(t_list *stack)
if (top == BACKSLASH)
return ("> ");
else if (top == QUOTE)
return ("quote >");
return ("quote> ");
else if (top == DQUOTE)
return ("dquote >");
return ("dquote> ");
else if (top == BQUOTE)
return ("bquote >");
else if (top == SUBSHELL)
return ("subsh >");
return ("bquote> ");
else if (top == PAREN)
return ("subsh> ");
else
return (" > ");
return ("error> ");
}

View file

@ -71,7 +71,7 @@ char *ft_read_stdin(void)
ft_print(ret);
else if (ret == 10)
return (STR);
/* else if (ft_isascii(ret) == 0) */
/* ft_read_it(ret, &POS, &STR); */
else if (ft_isascii(ret) == 0)
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) */
/* { */
/* int i; */
static void ft_read_it_3(char **str, char t[5], size_t *pos, int *j)
{
int i;
/* i = 0; */
/* while (i < 4 && t[i] == '\0') */
/* ++i; */
/* while (i < 4) */
/* { */
/* if (t[i] && ft_isprint(t[i])) */
/* { */
/* *str = ft_realloc_imput(*str, t[i], *pos); */
/* ++(*pos); */
/* ++(*j); */
/* } */
/* ++i; */
/* } */
/* } */
i = 0;
while (i < 4 && t[i] == '\0')
++i;
while (i < 4)
{
if (t[i] && ft_isprint(t[i]))
{
*str = ft_realloc_imput(*str, t[i], *pos);
++(*pos);
++(*j);
}
++i;
}
}
/* static void ft_read_it_2(int input, char t[5]) */
/* { */
/* t[3] = (input / ft_pow(256, 3)) ? (input / ft_pow(256, 3)) : '\0'; */
/* if (t[3]) */
/* input = input % ft_pow(256, 3); */
/* t[2] = (input / ft_pow(256, 2)) ? (input / ft_pow(256, 2)) : '\0'; */
/* if (t[2]) */
/* input = input % ft_pow(256, 2); */
/* t[1] = (input / ft_pow(256, 1)) ? (input / ft_pow(256, 1)) : '\0'; */
/* if (t[1]) */
/* input = input % ft_pow(256, 1); */
/* t[0] = (input / ft_pow(256, 0)) ? (input / ft_pow(256, 0)) : '\0'; */
/* if (t[0]) */
/* input = input % ft_pow(256, 0); */
/* t[4] = '\0'; */
/* } */
static void ft_read_it_2(int input, char t[5])
{
t[3] = (input / ft_pow(256, 3)) ? (input / ft_pow(256, 3)) : '\0';
if (t[3])
input = input % ft_pow(256, 3);
t[2] = (input / ft_pow(256, 2)) ? (input / ft_pow(256, 2)) : '\0';
if (t[2])
input = input % ft_pow(256, 2);
t[1] = (input / ft_pow(256, 1)) ? (input / ft_pow(256, 1)) : '\0';
if (t[1])
input = input % ft_pow(256, 1);
t[0] = (input / ft_pow(256, 0)) ? (input / ft_pow(256, 0)) : '\0';
if (t[0])
input = input % ft_pow(256, 0);
t[4] = '\0';
}
/* void ft_read_it(int input, size_t *pos, char **str) */
/* { */
/* int j; */
/* char t[5]; */
/* size_t pos_tmp; */
void ft_read_it(int input, size_t *pos, char **str)
{
int j;
char t[5];
size_t pos_tmp;
/* j = 0; */
/* pos_tmp = *pos; */
/* if (input == TOUCHE_DELETE || input < 0 || input == 892427035 || */
/* input == 126 || input == 993090331 || input == 925981467 || */
/* input == 21298 || input == 892427035 || input == 8270395 || input == */
/* 942758683 || input == 993090331 || input == 18489 || input == 17977) */
/* return ; */
/* ft_read_it_2(input, t); */
/* ft_read_it_3(str, t, pos, &j); */
/* *pos = pos_tmp; */
/* ft_current_str((*str), *pos); */
/* ft_get_next_str((*str), pos); */
/* ft_putnc('\b', *pos - (pos_tmp + j)); */
/* *pos = (pos_tmp + j); */
/* } */
j = 0;
pos_tmp = *pos;
if (input == TOUCHE_DELETE || input < 0 || input == 892427035 ||
input == 126 || input == 993090331 || input == 925981467 ||
input == 21298 || input == 892427035 || input == 8270395 || input ==
942758683 || input == 993090331 || input == 18489 || input == 17977)
return ;
ft_read_it_2(input, t);
ft_read_it_3(str, t, pos, &j);
*pos = pos_tmp;
ft_current_str((*str), *pos);
ft_get_next_str((*str), pos);
ft_putnc('\b', *pos - (pos_tmp + j));
*pos = (pos_tmp + j);
}

View file

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