aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornass1pro <nass1pro@gmail.com>2020-06-14 15:52:25 +0200
committernass1pro <nass1pro@gmail.com>2020-06-14 15:52:25 +0200
commitb5710182b87b17c14cabb5f178f0516ff7676177 (patch)
treed8783a63e43b774e6f2f27f6aa20e5b67718fcc7
parent26ddbd7146f65a2cf100713f422a9ab5b1890620 (diff)
downloadminishell-b5710182b87b17c14cabb5f178f0516ff7676177.tar.gz
minishell-b5710182b87b17c14cabb5f178f0516ff7676177.tar.bz2
minishell-b5710182b87b17c14cabb5f178f0516ff7676177.zip
Added parse cmd draft
-rw-r--r--include/parser.h11
-rw-r--r--src/lexer/lexer.c9
-rw-r--r--src/main.c195
-rw-r--r--src/parse/cmd_parse.c3
-rw-r--r--src/parse/parse.c49
5 files changed, 160 insertions, 107 deletions
diff --git a/include/parser.h b/include/parser.h
index 80d039b..c81abee 100644
--- a/include/parser.h
+++ b/include/parser.h
@@ -34,15 +34,16 @@
*/
/*
-** lexer.c
+** parse.c
*/
-// char **lexer(char *input);
+t_ret *parse(t_ftlst *input);
+t_ast *parse_cmd(t_ast *ast, t_ftlst *ret);
+
/*
-** parse.c
+** cmd_parse.c
*/
-
-t_ret *parse(t_ftlst *input);
+int parse_cmd_str_true_fale(enum e_token_tag tag);
#endif
diff --git a/src/lexer/lexer.c b/src/lexer/lexer.c
index 29cea9c..04d7edb 100644
--- a/src/lexer/lexer.c
+++ b/src/lexer/lexer.c
@@ -109,8 +109,8 @@ enum e_token_tag token_str_or_cote(t_token *lst_token)
{
if(lst_token->content[i] == '\'')
{
- lst_token->tag = TAG_STR_SINGLE;
- return(token_verif_stick(lst_token));
+ return (lst_token->tag = TAG_STR_SINGLE);
+ //return(token_verif_stick(lst_token));
}
if(lst_token->content[i] == '"')
{
@@ -136,7 +136,7 @@ t_token *push_token_enum_and_trim(t_token *lst_token)
{
lst_token->tag = token_str_or_cote(lst_token);
}
- /* printf("%s-, %d\n",lst_token->content, (int)lst_token->tag); */
+ //printf("%s-, %d\n",lst_token->content, (int)lst_token->tag);
return (lst_token);
}
@@ -173,6 +173,5 @@ t_ftlst *lexer(char *input)
return(0);
*lst = create_token_list(input, lst);
/* i = ft_lstsize(*lst); */
- free(lst);
- return (0);
+ return (*lst);
}
diff --git a/src/main.c b/src/main.c
index 5d3e9d8..14da075 100644
--- a/src/main.c
+++ b/src/main.c
@@ -20,103 +20,108 @@
#include "lexer.h"
#include "parser.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); */
- /* ft_htdestroy(path, free); */
- /* ms_glob("src#<{(|"); */
- /* char *j = ms_glob("|)}>#*.c"); */
- /* printf("%s\n", j); */
- /* free(j); */
- t_ftvec *v = ft_vecnew(32);
- ft_vecpush(v, token_new(TAG_STR, "$TERM$LFS$TERM$TERM."));
- ft_vecpush(v, token_new(TAG_STR, "$$LFS$TERM$TERM."));
- ft_vecpush(v, token_new(TAG_STR, "*/*.c$TERM"));
- ft_vecpush(v, token_new(TAG_STR, "src/*.c include/*.h"));
- ft_vecpush(v, token_new(TAG_STR, "$A$B"));
- ft_vecpush(v, token_new(TAG_STR, "\\$TERM"));
- ft_vecpush(v, token_new(TAG_STR, "$TER\\M"));
- ft_vecpush(v, token_new(TAG_STR, "\\\\"));
- ft_vecpush(v, token_new(TAG_STR_SINGLE, "''''$TEST\\TEST"));
- ft_vecpush(v, token_new(TAG_STR_DOUBLE, ",$TEST,$B,"));
- ft_vecpush(v, token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"));
- ft_vecpush(v, token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"));
- ft_vecpush(v, token_new(TAG_STR_DOUBLE , "$TEST"));
- ft_vecpush(v, token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"));
- ft_vecpush(v, token_new(TAG_STR_SINGLE, "$TEST"));
- char **as = preprocess(v, env);
- char **tmp = as;
- while (*as != NULL)
- puts(*as++);
- ft_split_destroy(tmp);
- 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); */
+// /* ft_htdestroy(path, free); */
+// /* ms_glob("src#<{(|"); */
+// /* char *j = ms_glob("|)}>#*.c"); */
+// /* printf("%s\n", j); */
+// /* free(j); */
+// t_ftvec *v = ft_vecnew(32);
+// ft_vecpush(v, token_new(TAG_STR, "$TERM$LFS$TERM$TERM."));
+// ft_vecpush(v, token_new(TAG_STR, "$$LFS$TERM$TERM."));
+// ft_vecpush(v, token_new(TAG_STR, "*/*.c$TERM"));
+// ft_vecpush(v, token_new(TAG_STR, "src/*.c include/*.h"));
+// ft_vecpush(v, token_new(TAG_STR, "$A$B"));
+// ft_vecpush(v, token_new(TAG_STR, "\\$TERM"));
+// ft_vecpush(v, token_new(TAG_STR, "$TER\\M"));
+// ft_vecpush(v, token_new(TAG_STR, "\\\\"));
+// ft_vecpush(v, token_new(TAG_STR_SINGLE, "''''$TEST\\TEST"));
+// ft_vecpush(v, token_new(TAG_STR_DOUBLE, ",$TEST,$B,"));
+// ft_vecpush(v, token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"));
+// ft_vecpush(v, token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"));
+// ft_vecpush(v, token_new(TAG_STR_DOUBLE , "$TEST"));
+// ft_vecpush(v, token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"));
+// ft_vecpush(v, token_new(TAG_STR_SINGLE, "$TEST"));
+// char **as = preprocess(v, env);
+// char **tmp = as;
+// while (*as != NULL)
+// puts(*as++);
+// ft_split_destroy(tmp);
+// ft_vecdestroy(env, free);
+// return (0);
+// }
/////////////////////////////////////////////////////////////////////////////////////////
// lexer main
/////////////////////////////////////////////////////////////////////////////////////////
-/* int main(void) */
-/* { */
-/* char *input; */
-/* */
-/* if (!(input = malloc(sizeof(char) * ft_strlen(argv[1]) + 1))) */
-/* return(0); */
-/* ft_strlcpy(input, argv[1], ft_strlen(argv[1]) + 1); */
-/* */
-/* lexer(input); */
-/* exit(0); */
-/* return (0); */
-/* } */
+int main(int argc, char **argv)
+{
+ char *input;
+ t_ftlst *lst;
+
+ 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);
+
+ lst = lexer(input);
+ parse(lst);
+ free(input);
+ exit(0);
+ return (0);
+}
diff --git a/src/parse/cmd_parse.c b/src/parse/cmd_parse.c
new file mode 100644
index 0000000..78ce593
--- /dev/null
+++ b/src/parse/cmd_parse.c
@@ -0,0 +1,3 @@
+
+
+#include "parser.h"
diff --git a/src/parse/parse.c b/src/parse/parse.c
index 92797c8..a3e9526 100644
--- a/src/parse/parse.c
+++ b/src/parse/parse.c
@@ -4,16 +4,61 @@
*/
#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)
+int parse_cmd_str_true_fale(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(rest->data);
+ ft_lstpush_back(&ast->cmd_argv, (void *)new);
+ }
+ return (ast);
+}
-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;
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_fale(tag))
+ ret->ast = parse_cmd(ret->ast, ret->rest);
+ 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;
+ }
+ free(ret->ast);
return NULL;
}