diff options
| -rw-r--r-- | include/ast.h | 1 | ||||
| -rw-r--r-- | include/lexer.h | 2 | ||||
| -rw-r--r-- | include/parser.h | 11 | ||||
| -rw-r--r-- | src/ast.c | 5 | ||||
| -rw-r--r-- | src/lexer/lexer.c | 12 | ||||
| -rw-r--r-- | src/main.c | 244 | ||||
| -rwxr-xr-x | src/parse/cmd_parse.c | 31 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/parse/parse.c | 55 | ||||
| -rwxr-xr-x | src/parse/redir_parse.c | 27 |
9 files changed, 264 insertions, 124 deletions
diff --git a/include/ast.h b/include/ast.h index c508bd9..bcb5e11 100644 --- a/include/ast.h +++ b/include/ast.h @@ -32,6 +32,7 @@ struct s_ast; ** \param sep Type of separator */ + typedef struct s_line { struct s_ast *left; diff --git a/include/lexer.h b/include/lexer.h index 3acffb0..5886035 100644 --- a/include/lexer.h +++ b/include/lexer.h @@ -23,7 +23,7 @@ enum e_token_tag TAG_STICK = 1 << 12, TAG_IS_STR = TAG_STR | TAG_STR_SINGLE | TAG_STR_DOUBLE, - TAG_IS_REDIR = TAG_REDIR_IN | TAG_REDIR_OUT | TAG_REDIR_APPEND, + TAG_IS_REDIR = TAG_REDIR_IN | TAG_REDIR_OUT | TAG_REDIR_APPEND, }; typedef struct diff --git a/include/parser.h b/include/parser.h index 80d039b..2e6bae1 100644 --- a/include/parser.h +++ b/include/parser.h @@ -34,15 +34,14 @@ */ /* -** lexer.c -*/ - -// char **lexer(char *input); - -/* ** parse.c */ t_ret *parse(t_ftlst *input); +t_ast *parse_cmd(t_ast *ast, t_ftlst *ret); +t_ast *parse_redir(t_ast *ast, t_ftlst *rest); + +int parse_cmd_str_true_false(enum e_token_tag tag); +int parse_redir_true_false(enum e_token_tag tag); #endif @@ -6,7 +6,7 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/01 17:05:42 by charles #+# #+# */ -/* Updated: 2020/06/14 20:22:26 by charles ### ########.fr */ +/* Updated: 2020/06/15 13:01:20 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -48,7 +48,10 @@ void ast_destroy(t_ast *ast) return ; ft_lstdestroy(&ast->cmd_argv, (void (*)(void*))token_destroy); if (ast->tag == AST_CMD) + { + ft_lstdestroy(&ast->cmd_argv, (void (*)(void*))token_destroy); ft_lstdestroy(&ast->redirs, (void (*)(void*))token_destroy); + } else if (ast->tag == AST_LINE) { ast_destroy(ast->line.left); diff --git a/src/lexer/lexer.c b/src/lexer/lexer.c index 29cea9c..079d77d 100644 --- a/src/lexer/lexer.c +++ b/src/lexer/lexer.c @@ -109,7 +109,7 @@ enum e_token_tag token_str_or_cote(t_token *lst_token) { if(lst_token->content[i] == '\'') { - lst_token->tag = TAG_STR_SINGLE; + return (lst_token->tag = TAG_STR_SINGLE); return(token_verif_stick(lst_token)); } if(lst_token->content[i] == '"') @@ -132,11 +132,12 @@ t_token *push_token_enum_and_trim(t_token *lst_token) enum e_token_tag tk; tk = ret_token(lst_token->content, 0); + if (tk == 0) - { lst_token->tag = token_str_or_cote(lst_token); - } - /* printf("%s-, %d\n",lst_token->content, (int)lst_token->tag); */ + else + lst_token->tag = tk; + //printf("%s-, %d\n",lst_token->content, lst_token->tag); return (lst_token); } @@ -173,6 +174,5 @@ t_ftlst *lexer(char *input) return(0); *lst = create_token_list(input, lst); /* i = ft_lstsize(*lst); */ - free(lst); - return (0); + return (*lst); } @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/28 11:45:44 by cacharle #+# #+# */ -/* Updated: 2020/06/15 11:19:23 by charles ### ########.fr */ +/* Updated: 2020/06/15 13:12:21 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,136 +17,164 @@ #include "minishell.h" #include "ast.h" -/* #include "lexer.h" */ -/* #include "parser.h" */ +#include "lexer.h" +#include "parser.h" #include "eval.h" int main(int argc, char **argv, char **envp) { - (void)argc; - (void)argv; - /* (void)envp; */ t_path path; t_env env; - /* char *line; */ - /* int ret; */ + env = env_from_array(envp); path = path_update(NULL, env_search(env, "PATH")); - /* */ - /* t_ast *ast; */ - /* t_line line; */ - /* t_cmd cmd; */ - /* t_eval_state state; */ - /* */ - /* cmd.argv = ft_split("ls -l", ' '); */ - /* cmd.in = NULL; */ - /* cmd.out = NULL; */ - /* cmd.is_append = false; */ - /* */ - /* line.left = ast_new(TAG_CMD, &cmd); */ - /* line.right = NULL; */ - /* line.sep = SEP_END; */ - /* ast = ast_new(TAG_LINE, &line); */ - /* printf("%p\n", ast); */ - /* printf("%d\n", ast->tag); */ - /* printf("%p\n", ast->data.line.left); */ - /* printf("%p\n", ast->data.line.right); */ - /* printf("%d\n", ast->data.line.left->tag); */ - /* printf("%p\n", ast->data.line.left->data.cmd.argv); */ - /* printf("%s\n", ast->data.line.left->data.cmd.argv[0]); */ - /* printf("%s\n", ast->data.line.left->data.cmd.argv[1]); */ - /* state.pipe_in[0] = -1; */ - /* state.pipe_in[1] = -1; */ - /* state.pipe_out[0] = -1; */ - /* state.pipe_out[1] = -1; */ - /* state.path = path; */ - /* state.env = env; */ - /* t_io_frame frame; */ - /* io_frame_init(&frame); */ - /* printf("ret: %d %s\n", eval(&frame,&state, ast), strerror(errno)); */ - /* char buf[2048]; */ - /* printf("%s\n", getcwd(buf, 2048)); */ - /* builtin_env(NULL, state.env); */ - /* ast_destroy(ast); */ - /* while ((ret = ft_next_line(STDIN_FILENO, &line)) == 1) */ - /* { */ - /* if (eval(parse(line)) == -1) */ - /* continue ; // and display error */ - /* free(line); */ - /* } */ - /* free(line); */ - /* ms_glob("src#<{(|"); */ - /* char *j = ms_glob("|)}>#*.c"); */ - /* printf("%s\n", j); */ - /* free(j); */ - - t_ftlst *args = NULL; - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "echo"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "bonjour"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "je"))); */ - - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "cat"))); - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-e"))); - - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "ls"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-a"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-l"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$$LFS$TERM$TERM."))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "|)}>#*.c"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "src#<{(|.c include#<{(|.h"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$A$B"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\$TERM"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$TER\\M"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\\\"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "''''$TEST\\TEST"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE, ",$TEST,$B,"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE , "$TEST"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "$TEST"))); */ - - t_ftlst *redirs = NULL; - ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_IN, NULL))); - ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "bonjour"))); - ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_APPEND, NULL))); - ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "yo"))); - ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_OUT, NULL))); - ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "yo1"))); - t_ast *ast = ast_new(AST_CMD); - ast->cmd_argv = args; - ast->redirs = redirs; + if (argc == 3 && ft_strcmp(argv[1], "-c") == 0) + { + t_ftlst *lex_out = lexer(argv[2]); - printf("eval %d\n", eval_cmd(env, path, ast)); - ast_destroy(ast); + t_ret *parser_out = parse(lex_out); + int eval_out = eval_cmd(env, path, parser_out->ast); + (void)eval_out; + } - /* char **as = preprocess(l, env); */ - /* printf("%p\n", as); */ - /* printf("%p\n", *as); */ - /* char **tmp = as; */ - /* while (*as != NULL) */ - /* puts(*as++); */ - /* ft_split_destroy(tmp); */ ft_htdestroy(path, free); ft_vecdestroy(env, free); return (0); } +/* int main(int argc, char **argv, char **envp) */ +/* { */ +/* (void)argc; */ +/* (void)argv; */ +/* #<{(| (void)envp; |)}># */ +/* t_path path; */ +/* t_env env; */ +/* #<{(| char *line; |)}># */ +/* #<{(| int ret; |)}># */ +/* env = env_from_array(envp); */ +/* path = path_update(NULL, env_search(env, "PATH")); */ +/* #<{(| |)}># */ +/* #<{(| t_ast *ast; |)}># */ +/* #<{(| t_line line; |)}># */ +/* #<{(| t_cmd cmd; |)}># */ +/* #<{(| t_eval_state state; |)}># */ +/* #<{(| |)}># */ +/* #<{(| cmd.argv = ft_split("ls -l", ' '); |)}># */ +/* #<{(| cmd.in = NULL; |)}># */ +/* #<{(| cmd.out = NULL; |)}># */ +/* #<{(| cmd.is_append = false; |)}># */ +/* #<{(| |)}># */ +/* #<{(| line.left = ast_new(TAG_CMD, &cmd); |)}># */ +/* #<{(| line.right = NULL; |)}># */ +/* #<{(| line.sep = SEP_END; |)}># */ +/* #<{(| ast = ast_new(TAG_LINE, &line); |)}># */ +/* #<{(| printf("%p\n", ast); |)}># */ +/* #<{(| printf("%d\n", ast->tag); |)}># */ +/* #<{(| printf("%p\n", ast->data.line.left); |)}># */ +/* #<{(| printf("%p\n", ast->data.line.right); |)}># */ +/* #<{(| printf("%d\n", ast->data.line.left->tag); |)}># */ +/* #<{(| printf("%p\n", ast->data.line.left->data.cmd.argv); |)}># */ +/* #<{(| printf("%s\n", ast->data.line.left->data.cmd.argv[0]); |)}># */ +/* #<{(| printf("%s\n", ast->data.line.left->data.cmd.argv[1]); |)}># */ +/* #<{(| state.pipe_in[0] = -1; |)}># */ +/* #<{(| state.pipe_in[1] = -1; |)}># */ +/* #<{(| state.pipe_out[0] = -1; |)}># */ +/* #<{(| state.pipe_out[1] = -1; |)}># */ +/* #<{(| state.path = path; |)}># */ +/* #<{(| state.env = env; |)}># */ +/* #<{(| t_io_frame frame; |)}># */ +/* #<{(| io_frame_init(&frame); |)}># */ +/* #<{(| printf("ret: %d %s\n", eval(&frame,&state, ast), strerror(errno)); |)}># */ +/* #<{(| char buf[2048]; |)}># */ +/* #<{(| printf("%s\n", getcwd(buf, 2048)); |)}># */ +/* #<{(| builtin_env(NULL, state.env); |)}># */ +/* #<{(| ast_destroy(ast); |)}># */ +/* #<{(| while ((ret = ft_next_line(STDIN_FILENO, &line)) == 1) |)}># */ +/* #<{(| { |)}># */ +/* #<{(| if (eval(parse(line)) == -1) |)}># */ +/* #<{(| continue ; // and display error |)}># */ +/* #<{(| free(line); |)}># */ +/* #<{(| } |)}># */ +/* #<{(| free(line); |)}># */ +/* #<{(| ms_glob("src#<{(|"); |)}># */ +/* #<{(| char *j = ms_glob("|)}>#*.c"); |)}># */ +/* #<{(| printf("%s\n", j); |)}># */ +/* #<{(| free(j); |)}># */ +/* */ +/* t_ftlst *args = NULL; */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "echo"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "bonjour"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "je"))); |)}># */ +/* */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "cat"))); */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-e"))); */ +/* */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "ls"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-a"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-l"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$$LFS$TERM$TERM."))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "|)}>#*.c"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "src#<{(|.c include#<{(|.h"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$A$B"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\$TERM"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$TER\\M"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\\\"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "''''$TEST\\TEST"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE, ",$TEST,$B,"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE , "$TEST"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "$TEST"))); |)}># */ +/* */ +/* t_ftlst *redirs = NULL; */ +/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_IN, NULL))); */ +/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "bonjour"))); */ +/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_APPEND, NULL))); */ +/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "yo"))); */ +/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_OUT, NULL))); */ +/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "yo1"))); */ +/* */ +/* t_ast *ast = ast_new(AST_CMD); */ +/* ast->cmd_argv = args; */ +/* ast->redirs = redirs; */ +/* */ +/* printf("eval %d\n", eval_cmd(env, path, ast)); */ +/* ast_destroy(ast); */ +/* */ +/* */ +/* #<{(| char **as = preprocess(l, env); |)}># */ +/* #<{(| printf("%p\n", as); |)}># */ +/* #<{(| printf("%p\n", *as); |)}># */ +/* #<{(| char **tmp = as; |)}># */ +/* #<{(| while (*as != NULL) |)}># */ +/* #<{(| puts(*as++); |)}># */ +/* #<{(| ft_split_destroy(tmp); |)}># */ +/* ft_htdestroy(path, free); */ +/* ft_vecdestroy(env, free); */ +/* return (0); */ +/* } */ + ///////////////////////////////////////////////////////////////////////////////////////// // lexer main ///////////////////////////////////////////////////////////////////////////////////////// -/* int main(void) */ +/* int main(int argc, char **argv) */ /* { */ -/* char *input; */ +/* char *input; */ +/* t_ftlst *lst; */ /* */ -/* if (!(input = malloc(sizeof(char) * ft_strlen(argv[1]) + 1))) */ -/* return(0); */ -/* ft_strlcpy(input, argv[1], ft_strlen(argv[1]) + 1); */ +/* if (argv[1] == NULL) */ +/* return (0); */ +/* if (!(input = malloc(sizeof(char) * ft_strlen(argv[1]) + 1))) */ +/* return(0); */ +/* ft_strlcpy(input, argv[1], ft_strlen(argv[1]) + 1); */ /* */ -/* lexer(input); */ +/* lst = lexer(input); */ +/* parse(lst); */ +/* free(input); */ /* exit(0); */ -/* return (0); */ +/* return (0); */ /* } */ diff --git a/src/parse/cmd_parse.c b/src/parse/cmd_parse.c new file mode 100755 index 0000000..562cea3 --- /dev/null +++ b/src/parse/cmd_parse.c @@ -0,0 +1,31 @@ + + +#include "parser.h" + + +int parse_cmd_str_true_false(enum e_token_tag tag) +{ + if (tag & TAG_STR || tag & TAG_STR_DOUBLE || tag & TAG_STR_SINGLE) + return (1); + return(0); +} + + +t_ast *parse_cmd(t_ast *ast, t_ftlst *rest) +{ + t_ftlst *new; + + new = rest->data; + if (ast == NULL) + { + + ast = ast_new(AST_CMD); + ast->cmd_argv = ft_lstnew((t_token *)rest->data); + } + else + { + new = ft_lstnew((t_token *)rest->data); + ft_lstpush_back(&ast->cmd_argv, (void *)new); + } + return (ast); +} diff --git a/src/parse/parse.c b/src/parse/parse.c index 92797c8..a0d981f 100644..100755 --- a/src/parse/parse.c +++ b/src/parse/parse.c @@ -4,16 +4,67 @@ */ #include "parser.h" +#include "lexer.h" // stdio.h est deja include dans minishell.h temporairement // (comme ca on doit le retirer a un seul endroit a la fin) -t_ret *parse(t_ftlst *input) + +t_ret *parse(t_ftlst *input) { - t_ret *ret; + t_ret *ret; + /* t_ret *first; */ + enum e_token_tag tag; + int i = 0; if(!(ret = malloc(sizeof(t_ret) * 1))) return(NULL); ret->rest = input; + ret->ast = NULL; + ret->unexpected = NULL; + /* first = ret; */ + + while (ret->rest != NULL) + { + tag = ((t_token *)ret->rest->data)->tag; + if (parse_cmd_str_true_false(tag)) + { + ret->ast = parse_cmd(ret->ast, ret->rest); + } + else if (parse_redir_true_false(tag)) + { + ret->ast = parse_redir(ret->ast, ret->rest); + ret->rest = ret->rest->next; + if (ret->rest != NULL) + ret->ast = parse_redir(ret->ast, ret->rest); + /* printf("%s\n","ici" ); */ + ret->rest = ret->rest->next; + if (ret->rest != NULL) + { + tag = ((t_token *)ret->rest->data)->tag; + if(tag & TAG_IS_STR & TAG_STICK) + ret->ast = parse_redir(ret->ast, ret->rest); + } + } + if (ret->rest != NULL) + ret->rest = ret->rest->next; + } + while(ret->ast->cmd_argv != NULL) + { + /* printf("%s\n", ((t_token *)ret->ast->cmd_argv->data)->content); */ + ret->ast->cmd_argv = ret->ast->cmd_argv->next; + } + while(ret->ast->redirs != NULL) + { + if (i == 0) + { + /* printf("redir"); */ + i++; + } + /* printf("%s\n", ((t_token *)ret->ast->redirs->data)->content); */ + ret->ast->redirs = ret->ast->redirs->next; + } + /* ast_destroy(ret->ast); */ + /* ft_lstdestroy(&ret->rest, (void (*)(void*))token_destroy); */ return NULL; } diff --git a/src/parse/redir_parse.c b/src/parse/redir_parse.c new file mode 100755 index 0000000..bdcb3ab --- /dev/null +++ b/src/parse/redir_parse.c @@ -0,0 +1,27 @@ + +#include "parser.h" + +int parse_redir_true_false(enum e_token_tag tag) +{ + if (tag & TAG_IS_REDIR) + return (1); + return (0); +} + +t_ast *parse_redir(t_ast *ast, t_ftlst *rest) +{ + t_ftlst *new; + + new = rest->data; + if (ast == NULL) + { + ast = ast_new(AST_CMD); + ast->redirs = ft_lstnew((t_token *)rest->data); + } + else + { + new = ft_lstnew((t_token *)rest->data); + ft_lstpush_back(&ast->redirs, (void *)new); + } + return (ast); +} |
