From 96e439b6520c7e6df2ea5bedfef22e12acbd4365 Mon Sep 17 00:00:00 2001 From: "ariard@student.42.fr" Date: Fri, 17 Feb 2017 23:43:44 +0100 Subject: [PATCH] parsing while simple ok --- 42sh/Makefile | 3 +- 42sh/file1 | 2 + 42sh/includes/parser.h | 7 ++- 42sh/sample/dir.sh | 1 + 42sh/sample/while.sh | 5 +- 42sh/src/glob/lib_perso/ft_ld_back.c | 2 +- 42sh/src/glob/lib_perso/ft_ld_pushback.c | 2 +- 42sh/src/main/ft_putast.c | 4 +- 42sh/src/main/shell_script.c | 4 +- 42sh/src/parser/.eval_sym.c.swn | Bin 28672 -> 0 bytes 42sh/src/parser/.read_stack.c.swn | Bin 20480 -> 20480 bytes 42sh/src/parser/add_cmd.c | 18 +++++-- 42sh/src/parser/add_file.c | 2 +- 42sh/src/parser/add_loop.c | 59 +++++++++++++++++++++++ 42sh/src/parser/add_sep.c | 7 ++- 42sh/src/parser/aggregate_sym.c | 21 ++++++-- 42sh/src/parser/build_tree.c | 9 ++-- 42sh/src/parser/eval_sym.c | 22 ++++++++- 42sh/src/parser/ft_parse.c | 3 +- 42sh/src/parser/produce_sym.c | 5 +- 42sh/src/parser/read_stack.c | 8 ++- 42sh/src/parser/tree_wrapper.c | 3 +- 22 files changed, 158 insertions(+), 29 deletions(-) create mode 100644 42sh/sample/dir.sh delete mode 100644 42sh/src/parser/.eval_sym.c.swn create mode 100644 42sh/src/parser/add_loop.c diff --git a/42sh/Makefile b/42sh/Makefile index a60aa4ea..2012337d 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -199,7 +199,8 @@ parser/build_tree.c\ parser/tree_wrapper.c\ parser/add_sep.c\ parser/add_cmd.c\ -parser/add_file.c +parser/add_file.c\ +parser/add_loop.c SRCS = $(addprefix $(SRC_DIR), $(SRC_BASE)) OBJS = $(addprefix $(OBJ_DIR), $(SRC_BASE:.c=.o)) diff --git a/42sh/file1 b/42sh/file1 index e75bc531..3e9b5839 100644 --- a/42sh/file1 +++ b/42sh/file1 @@ -1,3 +1,4 @@ +42sh Makefile blind.text debug @@ -5,6 +6,7 @@ file1 grammar includes libft +objs pdf sample script.sh diff --git a/42sh/includes/parser.h b/42sh/includes/parser.h index d40032d1..1be71b53 100644 --- a/42sh/includes/parser.h +++ b/42sh/includes/parser.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/01 12:15:54 by jhalford #+# #+# */ -/* Updated: 2017/02/17 18:49:28 by ariard ### ########.fr */ +/* Updated: 2017/02/17 23:18:23 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -120,6 +120,7 @@ enum e_sym CMD_SUPERIOR, AND_OR_MAJOR, AND_OR_MINOR, + END_COMMAND, ALL = 200, }; @@ -201,6 +202,9 @@ int build_tree(t_btree **ast, t_list **lst); int add_sep(t_btree **ast, t_list **lst); int add_cmd(t_btree **ast, t_list **lst); int add_file(t_btree **ast, t_list **lst); +int add_loop_cmd(t_btree **ast, t_list **lst); +int add_loop_sep(t_btree **ast, t_list **lst); +int isloop(t_btree **ast); int isdir(t_btree **ast); int join_ast(t_btree **ast, t_btree **new_node); @@ -245,6 +249,7 @@ union u_astdata t_ld *token; char **sstr; char *str; + int loop; }; struct s_astnode diff --git a/42sh/sample/dir.sh b/42sh/sample/dir.sh new file mode 100644 index 00000000..f413e465 --- /dev/null +++ b/42sh/sample/dir.sh @@ -0,0 +1 @@ +file1 +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/16 16:23:26 by wescande #+# #+# */ -/* Updated: 2017/01/05 14:16:53 by wescande ### ########.fr */ +/* Updated: 2017/02/17 23:31:05 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/glob/lib_perso/ft_ld_pushback.c b/42sh/src/glob/lib_perso/ft_ld_pushback.c index 25a1d019..5ec29624 100644 --- a/42sh/src/glob/lib_perso/ft_ld_pushback.c +++ b/42sh/src/glob/lib_perso/ft_ld_pushback.c @@ -6,7 +6,7 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/16 15:59:38 by wescande #+# #+# */ -/* Updated: 2017/01/05 14:17:40 by wescande ### ########.fr */ +/* Updated: 2017/02/17 23:33:37 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/main/ft_putast.c b/42sh/src/main/ft_putast.c index 2b5e4e7b..c4d1f46c 100644 --- a/42sh/src/main/ft_putast.c +++ b/42sh/src/main/ft_putast.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/14 18:18:04 by jhalford #+# #+# */ -/* Updated: 2017/02/06 20:37:16 by ariard ### ########.fr */ +/* Updated: 2017/02/17 23:41:26 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,6 +20,8 @@ char *ft_putast(void *nodein) t_type type; }; node = nodein; + if (node->type == TK_DO) + return ("TK_DO"); if (node->type == TK_AMP) return (" & "); else if (node->type == TK_N_WORD) diff --git a/42sh/src/main/shell_script.c b/42sh/src/main/shell_script.c index d7273002..5b907c72 100644 --- a/42sh/src/main/shell_script.c +++ b/42sh/src/main/shell_script.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/22 23:06:34 by ariard #+# #+# */ -/* Updated: 2017/02/17 17:22:03 by ariard ### ########.fr */ +/* Updated: 2017/02/17 23:27:06 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,7 +31,7 @@ int shell_script() token_print(token); if (ft_parse2(&ast, &token)) return (1); - btree_print(STDBUG, ast, &ft_putast); +// btree_print(STDBUG, ast, &ft_putast); // if (ft_exec(&ast)) // return (1); ast = NULL; diff --git a/42sh/src/parser/.eval_sym.c.swn b/42sh/src/parser/.eval_sym.c.swn deleted file mode 100644 index 4e796003c942536ebc1b2c15270f3fc07d31994a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28672 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 Ym`J-LM-6eTGH~COU0hUTbL6a*-y#mPs{jB1 delta 1068 zcmXZaeMnPL7{~Evy0w?oJ0nBXauPz|+l*ySNegS1VT#d*FoMqn=}krJpCL6HP23TaFTN&7B#;B(Kpm*;TqIp-G$8UjH>`hMrm zE!B?Ve5cUtA_En7b{{KpNLQ;oNRKFnWooiL)8JJL?U~j^(HdH-R&VcD67v^}+(L93 zWsXXJPJ&1h!hHP*Jyvmz{v4W73pcWnfLWW!6owE)I}V`+E@U7MKdd6}FoYgl!b$9d z2L)E~OA3Q|i^x}u;y$`@76;%#E)+z}B9nNEn>dfdsD%sZm}kq=7{wqi<2ZI<16E-P z{+L+PMLt8v4Yc7X>QIU-*f0|>@*X;FqaDrIhGMKlGQx43 z9(44q=Fx@IXhI#2Z0A z$Rk9rm~H-Ve|i6a*LZ;^h}H}$TBE&PQNNW{`5O;%Cj6exmZNjMvAN%=n~cr5PTz(j zs6i1jV8X8?*1&W0qXRzdfE&wUL?}^Y9FGyi1^5yPLIZ=1$UzF`NaZv}prIQ9G@%-W zNW~n9{DNWJ#YLRJc9dcTObC(4F=)7o0KD)Z+eQ!)7|fE!Pk4oU=*AiBK?QQL6bqy= zgb6&v6||rZYmo&rW=P}&o}mYwXhA*P$Ur=PMx!}}m*_ +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/15 20:49:15 by ariard #+# #+# */ -/* Updated: 2017/02/17 17:46:18 by ariard ### ########.fr */ +/* Updated: 2017/02/17 23:40:13 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,18 +18,26 @@ int add_cmd(t_btree **ast, t_list **lst) t_astnode *node; char **my_tab; + DG("add cmd"); if (!*ast) gen_node(ast); else if (isdir(ast)) - return (add_file(ast, lst)); + return (add_file(ast, lst)); + else if (isloop(ast)) + return (add_loop_cmd(ast, lst)); else return (add_cmd(&(*ast)->right, lst)); + DG("insert data cmd"); my_tab = NULL; token = (*lst)->content; node = (*ast)->item; node->type = token->type; - my_tab = ft_sstradd(my_tab, token->data); - my_tab = ft_sstradd(my_tab, (char *)token->esc); - ft_ld_pushback(&node->data.token, my_tab); + if (token->type == TK_N_WORD) + { + my_tab = ft_sstradd(my_tab, token->data); + my_tab = ft_sstradd(my_tab, (char *)token->esc); +// ft_ld_pushback(&node->data.token, my_tab); + DG("still alive"); + } return (0); } diff --git a/42sh/src/parser/add_file.c b/42sh/src/parser/add_file.c index 1eed2a89..23660275 100644 --- a/42sh/src/parser/add_file.c +++ b/42sh/src/parser/add_file.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/17 16:39:05 by ariard #+# #+# */ -/* Updated: 2017/02/17 17:19:35 by ariard ### ########.fr */ +/* Updated: 2017/02/17 23:24:01 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/parser/add_loop.c b/42sh/src/parser/add_loop.c new file mode 100644 index 00000000..2709e6f6 --- /dev/null +++ b/42sh/src/parser/add_loop.c @@ -0,0 +1,59 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* add_loop.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/17 22:17:14 by ariard #+# #+# */ +/* Updated: 2017/02/17 23:38:25 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "parser.h" + +int isloop(t_btree **ast) +{ + t_astnode *node; + + node = NULL; + if (*ast) + { + DG("end isloop"); + node = (*ast)->item; + if (node->data.loop == 1) + return (2); + if (node->type == TK_WHILE) + return (1); + } + return (0); +} + +int add_loop_cmd(t_btree **ast, t_list **lst) +{ + t_token *token; + t_astnode *node; + + DG("add loop cmd"); + token = (*lst)->content; + node = (*ast)->item; + if (token->type == TK_DONE) + return ((node->data.loop = 1)); + else if (token->type == TK_DO) + return (add_cmd(&(*ast)->right, lst)); + else if (!(*ast)->right && isloop(&(*ast)->left) != 2) + return (add_cmd(&(*ast)->left, lst)); + else + return (add_cmd(&(*ast)->right, lst)); + return (0); +} + +int add_loop_sep(t_btree **ast, t_list **lst) +{ + DG("add loop sep"); + if (!(*ast)->right) + return (add_sep(&(*ast)->left, lst)); + else + return (add_sep(&(*ast)->right, lst)); + return (0); +} diff --git a/42sh/src/parser/add_sep.c b/42sh/src/parser/add_sep.c index 3bbf1028..a7cb461a 100644 --- a/42sh/src/parser/add_sep.c +++ b/42sh/src/parser/add_sep.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/15 19:12:07 by ariard #+# #+# */ -/* Updated: 2017/02/17 17:09:31 by ariard ### ########.fr */ +/* Updated: 2017/02/17 23:34:43 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,6 +18,9 @@ int add_sep(t_btree **ast, t_list **lst) t_astnode *node; t_btree *new_node; + DG("add sep"); + if (isloop(&(*ast)->right) == 1 || isloop(ast)) + return (add_loop_sep(ast, lst)); new_node = NULL; gen_node(&new_node); join_ast(ast, &new_node); @@ -25,4 +28,4 @@ int add_sep(t_btree **ast, t_list **lst) node = (new_node)->item; node->type = token->type; return (0); -} +} diff --git a/42sh/src/parser/aggregate_sym.c b/42sh/src/parser/aggregate_sym.c index 3f0a83d2..3315be3c 100644 --- a/42sh/src/parser/aggregate_sym.c +++ b/42sh/src/parser/aggregate_sym.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/09 17:39:18 by ariard #+# #+# */ -/* Updated: 2017/02/17 19:48:12 by ariard ### ########.fr */ +/* Updated: 2017/02/17 21:35:09 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -34,7 +34,7 @@ t_aggrematch g_aggrematch[] = //watch this {SEPARATOR_OP, CMD_SUPERIOR, SEPARATOR, 0}, {SEPARATOR_OP, COMPOUND_LIST, SEPARATOR, 0}, - {SEPARATOR, CMD_SUPERIOR, SIMPLE_COMMAND, CMD_SUPERIOR}, + {SEPARATOR, CMD_SUPERIOR, END_COMMAND, CMD_SUPERIOR}, {SEPARATOR, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST}, {LINEBREAK, SEPARATOR_OP, SEPARATOR, SEPARATOR_OP}, {LINEBREAK, TK_SEMI, SEQUENTIAL_SEP, TK_SEMI}, @@ -47,7 +47,7 @@ t_aggrematch g_aggrematch[] = {LINEBREAK, COMPLETE_COMMANDS, PROGRAM, LINEBREAK}, {LINEBREAK, TK_PIPE, PIPE_SEMI_SEQUENCE, PIPE_SEQUENCE}, {LINEBREAK, COMPLETE_COMMANDS, PROGRAM, LINEBREAK}, - {LINEBREAK, CMD_SUPERIOR, SIMPLE_COMMAND, CMD_SUPERIOR}, + {LINEBREAK, CMD_SUPERIOR, SEPARATOR_OP, 0}, {LINEBREAK, PIPE_SEMI_SEQUENCE, PIPE_SEQUENCE, PIPE_SEMI_SEQUENCE}, {LINEBREAK, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST}, {NEWLINE_LIST, CMD_NAME, CMD_SUPERIOR, CMD_NAME}, @@ -102,6 +102,8 @@ t_aggrematch g_aggrematch[] = {CMD_NAME, SEPARATOR_OP, CMD_SUPERIOR, 0}, {CMD_NAME, NEWLINE_LIST, CMD_SUPERIOR, 0}, {CMD_NAME, TK_WHILE, CMD_SUPERIOR, 0}, + {CMD_NAME, TK_DO, CMD_SUPERIOR, 0}, + {CMD_NAME, COMPOUND_LIST, CMD_SUPERIOR, 0}, {CMD_NAME, TK_PIPE, CMD_SUPERIOR, 0}, {CMD_NAME, PIPE_SEMI_SEQUENCE, CMD_SUPERIOR, 0}, {CMD_NAME, AND_OR_MAJOR, CMD_SUPERIOR, 0}, @@ -130,31 +132,44 @@ t_aggrematch g_aggrematch[] = {TERM, LINEBREAK, COMPOUND_LIST, LINEBREAK}, {COMPOUND_LIST, TK_ELSE, ELSE_PART, TK_ELSE}, {COMPOUND_LIST, TK_THEN, ELSE_PART, TK_ELIF}, + {COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST}, {SUBSHELL, ALL, COMPOUND_COMMAND, 0}, {COMPOUND_COMMAND, ALL, COMMAND, 0}, {AND_OR_MINOR, PIPE_SEMI_SEQUENCE, AND_OR_MAJOR, PIPE_SEMI_SEQUENCE}, {AND_OR_MINOR, LINEBREAK, AND_OR_MAJOR, 0}, {AND_OR_MINOR, AND_OR_MAJOR, AND_OR_MAJOR, 0}, {COMMAND, PIPE_SEMI_SEQUENCE, PIPE_SEMI_SEQUENCE, PIPE_SEMI_SEQUENCE}, + {COMMAND, COMPOUND_LIST, PIPE_SEMI_SEQUENCE, 0}, {COMMAND, TK_WHILE, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, TK_DO, PIPE_SEMI_SEQUENCE, 0}, {COMMAND, TK_BANG, PIPE_SEMI_SEQUENCE, 0}, {COMMAND, SEPARATOR_OP, PIPE_SEMI_SEQUENCE, 0}, {COMMAND, NEWLINE_LIST, PIPE_SEMI_SEQUENCE, 0}, {COMMAND, LINEBREAK, PIPE_SEMI_SEQUENCE, 0}, {COMMAND, AND_OR_MAJOR, PIPE_SEMI_SEQUENCE, 0}, + {END_COMMAND, PIPE_SEMI_SEQUENCE, PIPE_SEQUENCE, PIPE_SEMI_SEQUENCE}, + {END_COMMAND, TK_WHILE, PIPE_SEQUENCE, 0}, + {END_COMMAND, LINEBREAK, PIPE_SEQUENCE, 0}, + {END_COMMAND, TK_DO, PIPE_SEQUENCE, 0}, {PIPE_SEQUENCE, TK_WHILE, PIPELINE, 0}, {PIPE_SEQUENCE, TK_BANG, PIPELINE, TK_BANG}, {PIPE_SEQUENCE, SEPARATOR_OP, PIPELINE, 0}, {PIPE_SEQUENCE, NEWLINE_LIST, PIPELINE, 0}, {PIPE_SEQUENCE, LINEBREAK, PIPELINE, 0}, {PIPE_SEQUENCE, AND_OR_MAJOR, PIPELINE, 0}, + {PIPE_SEQUENCE, TK_DO, PIPELINE, 0}, + {PIPE_SEQUENCE, COMPOUND_LIST, PIPELINE, 0}, {PIPELINE, TK_WHILE, AND_OR, 0}, + {PIPELINE, TK_DO, AND_OR, 0}, + {PIPELINE, COMPOUND_LIST, AND_OR, 0}, {PIPELINE, LINEBREAK, AND_OR, 0}, // {PIPELINE, LINEBREAK, AND_OR, AND_OR}, {PIPELINE, SEPARATOR_OP, AND_OR, 0}, {PIPELINE, AND_OR_MAJOR, AND_OR, AND_OR_MAJOR}, {AND_OR_MAJOR, AND_OR_MAJOR, AND_OR_MAJOR, AND_OR_MAJOR}, + {AND_OR, TK_DO, COMPOUND_LIST, 0}, {AND_OR, TK_WHILE, COMPOUND_LIST, 0}, + {AND_OR, COMPOUND_LIST, COMPOUND_LIST, 0}, {AND_OR, SEPARATOR_OP, LIST, LIST}, {AND_OR, NEWLINE_LIST, LIST, 0}, {AND_OR, LINEBREAK, LIST, 0}, diff --git a/42sh/src/parser/build_tree.c b/42sh/src/parser/build_tree.c index 43f5bb4b..df2a2152 100644 --- a/42sh/src/parser/build_tree.c +++ b/42sh/src/parser/build_tree.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/15 18:32:59 by ariard #+# #+# */ -/* Updated: 2017/02/17 18:48:56 by ariard ### ########.fr */ +/* Updated: 2017/02/17 23:34:15 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,6 +21,9 @@ t_treematch g_treematch[] = {TK_LESS, &add_sep}, {TK_OR_IF, &add_sep}, {TK_AND_IF, &add_sep}, + {TK_WHILE, &add_cmd}, + {TK_DO, &add_cmd}, + {TK_DONE, &add_cmd}, {0, NULL}, }; @@ -36,8 +39,8 @@ int build_tree(t_btree **ast, t_list **lst) if (g_treematch[i].type == token->type) { -// DG("func TK : '%s' TK : '%s'", -// read_state(g_treematch[i].type) ,read_state(token->type)); + DG("func TK : '%s' TK : '%s'", + read_state(g_treematch[i].type) ,read_state(token->type)); return (g_treematch[i].add(ast, lst)); } i++; diff --git a/42sh/src/parser/eval_sym.c b/42sh/src/parser/eval_sym.c index 709f9a91..77833aa1 100644 --- a/42sh/src/parser/eval_sym.c +++ b/42sh/src/parser/eval_sym.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/09 16:26:30 by ariard #+# #+# */ -/* Updated: 2017/02/17 19:43:28 by ariard ### ########.fr */ +/* Updated: 2017/02/17 21:35:11 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -181,6 +181,7 @@ t_stackmatch g_stackmatch[] = {TK_DO, SEQUENTIAL_SEP}, {TK_DONE, CMD_SUPERIOR}, {TK_DONE, COMPOUND_LIST}, + {TK_DONE, END_COMMAND}, {TK_CASE, LINEBREAK}, {TK_CASE, TK_BANG}, {TK_CASE, NEWLINE_LIST}, @@ -238,6 +239,10 @@ t_stackmatch g_stackmatch[] = {SEQUENTIAL_SEP, NAME}, {SEQUENTIAL_SEP, IN}, {SEQUENTIAL_SEP, WORDLIST}, + {END_COMMAND, PIPE_SEMI_SEQUENCE}, + {END_COMMAND, TK_WHILE}, + {END_COMMAND, TK_DO}, + {END_COMMAND, LINEBREAK}, {SEPARATOR, CMD_SUPERIOR}, {SEPARATOR, TERM}, {SEPARATOR, COMPOUND_LIST}, @@ -328,9 +333,11 @@ t_stackmatch g_stackmatch[] = {CMD_NAME, AND_OR_MAJOR}, {CMD_NAME, TK_WHILE}, {CMD_NAME, TK_DO}, + {CMD_NAME, COMPOUND_LIST}, {CMD_SUPERIOR, TK_WHILE}, {CMD_SUPERIOR, TK_DO}, + {CMD_SUPERIOR, COMPOUND_LIST}, {CMD_SUPERIOR, LINEBREAK,}, {CMD_SUPERIOR, TK_BANG}, {CMD_SUPERIOR, SEPARATOR_OP}, @@ -340,6 +347,8 @@ t_stackmatch g_stackmatch[] = {CMD_SUPERIOR, AND_OR_MAJOR}, {SIMPLE_COMMAND, TK_WHILE}, + {SIMPLE_COMMAND, TK_DO}, + {SIMPLE_COMMAND, COMPOUND_LIST}, {SIMPLE_COMMAND, LINEBREAK}, {SIMPLE_COMMAND, TK_BANG}, {SIMPLE_COMMAND, SEPARATOR_OP}, @@ -414,6 +423,7 @@ t_stackmatch g_stackmatch[] = {COMPOUND_LIST, TK_ELIF}, {COMPOUND_LIST, TK_ELSE}, {COMPOUND_LIST, TK_IF}, + {COMPOUND_LIST, COMPOUND_LIST}, {SUBSHELL, LINEBREAK}, {SUBSHELL, TK_BANG}, {SUBSHELL, SEPARATOR_OP}, @@ -427,6 +437,8 @@ t_stackmatch g_stackmatch[] = {COMPOUND_COMMAND, FUNC}, {COMMAND, TK_WHILE}, {COMMAND, LINEBREAK}, + {COMMAND, TK_DO}, + {COMMAND, COMPOUND_LIST}, {COMMAND, TK_BANG}, {COMMAND, SEPARATOR_OP}, {COMMAND, NEWLINE_LIST}, @@ -436,25 +448,33 @@ t_stackmatch g_stackmatch[] = {AND_OR_MINOR, LINEBREAK}, {AND_OR_MINOR, AND_OR_MAJOR}, {PIPE_SEQUENCE, TK_WHILE}, + {PIPE_SEQUENCE, TK_DO}, + {PIPE_SEQUENCE, COMPOUND_LIST}, {PIPE_SEQUENCE, LINEBREAK}, {PIPE_SEQUENCE, TK_BANG}, {PIPE_SEQUENCE, SEPARATOR_OP}, {PIPE_SEQUENCE, NEWLINE_LIST}, {PIPE_SEQUENCE, AND_OR_MAJOR}, {PIPE_SEMI_SEQUENCE, TK_WHILE}, + {PIPE_SEMI_SEQUENCE, TK_DO}, + {PIPE_SEMI_SEQUENCE, COMPOUND_LIST}, {PIPE_SEMI_SEQUENCE, LINEBREAK}, {PIPE_SEMI_SEQUENCE, TK_BANG}, {PIPE_SEMI_SEQUENCE, SEPARATOR_OP}, {PIPE_SEMI_SEQUENCE, NEWLINE_LIST}, {PIPE_SEMI_SEQUENCE, AND_OR_MAJOR}, {PIPELINE, TK_WHILE}, + {PIPELINE, TK_DO}, + {PIPELINE, COMPOUND_LIST}, {PIPELINE, LINEBREAK}, {PIPELINE, SEPARATOR_OP}, {PIPELINE, NEWLINE_LIST}, {PIPELINE, AND_OR_MAJOR}, {AND_OR_MAJOR, LINEBREAK}, {AND_OR_MAJOR, AND_OR_MAJOR}, + {AND_OR, TK_DO}, {AND_OR, TK_WHILE}, + {AND_OR, COMPOUND_LIST}, {AND_OR, LINEBREAK}, {AND_OR, SEPARATOR_OP}, {AND_OR, NEWLINE_LIST}, diff --git a/42sh/src/parser/ft_parse.c b/42sh/src/parser/ft_parse.c index 7e00865d..f56dd3fb 100644 --- a/42sh/src/parser/ft_parse.c +++ b/42sh/src/parser/ft_parse.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/09 14:30:22 by ariard #+# #+# */ -/* Updated: 2017/02/17 19:48:01 by ariard ### ########.fr */ +/* Updated: 2017/02/17 23:39:18 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -57,6 +57,7 @@ int ft_parse2(t_btree **ast, t_list **token) if (state == SUCCESS) ft_putstr("success"); build_tree(ast, token); + btree_print(STDBUG, *ast, &ft_putast); if (end_instruction(*stack) && !(*token)->next) insert_linebreak(token); else diff --git a/42sh/src/parser/produce_sym.c b/42sh/src/parser/produce_sym.c index 6b70555f..af01c929 100644 --- a/42sh/src/parser/produce_sym.c +++ b/42sh/src/parser/produce_sym.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/09 17:58:34 by ariard #+# #+# */ -/* Updated: 2017/02/17 19:48:06 by ariard ### ########.fr */ +/* Updated: 2017/02/17 21:29:20 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,6 +31,7 @@ t_prodmatch g_prodmatch[] = {TK_N_WORD, AND_OR_MAJOR, CMD_NAME}, {TK_N_WORD, TK_WHILE, CMD_NAME}, {TK_N_WORD, TK_DO, CMD_NAME}, + {TK_N_WORD, COMPOUND_LIST, CMD_NAME}, {TK_N_WORD, NEWLINE_LIST, CMD_NAME}, {TK_N_WORD, TK_BANG, CMD_NAME}, @@ -58,11 +59,9 @@ t_prodmatch g_prodmatch[] = {TK_SEMI, CMD_SUPERIOR, SEPARATOR_OP}, {TK_SEMI, TERM, SEPARATOR_OP}, {TK_SEMI, LIST, SEPARATOR_OP}, - {TK_SEMI, COMPOUND_LIST, SEPARATOR_OP}, {TK_AMP, CMD_SUPERIOR, SEPARATOR_OP}, {TK_AMP, TERM, SEPARATOR_OP}, {TK_AMP, LIST, SEPARATOR_OP}, - {TK_AMP, COMPOUND_LIST, SEPARATOR_OP}, {0, 0, 0}, }; diff --git a/42sh/src/parser/read_stack.c b/42sh/src/parser/read_stack.c index 893f9f94..8068646c 100644 --- a/42sh/src/parser/read_stack.c +++ b/42sh/src/parser/read_stack.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/09 15:32:10 by ariard #+# #+# */ -/* Updated: 2017/02/17 19:40:45 by ariard ### ########.fr */ +/* Updated: 2017/02/17 23:40:50 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,12 @@ char *read_state(t_sym current) { + if (current == TK_DONE) + return ("DONE"); + if (current == TK_DO) + return ("TK_DO"); + if (current == END_COMMAND) + return ("END_COMMAND"); if (current == SEQUENTIAL_SEP) return ("SEQUENTIAL_SEP"); if (current == SEPARATOR) diff --git a/42sh/src/parser/tree_wrapper.c b/42sh/src/parser/tree_wrapper.c index 56235151..6d3d6d36 100644 --- a/42sh/src/parser/tree_wrapper.c +++ b/42sh/src/parser/tree_wrapper.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/15 18:57:44 by ariard #+# #+# */ -/* Updated: 2017/02/17 17:19:41 by ariard ### ########.fr */ +/* Updated: 2017/02/17 23:38:47 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,6 +28,7 @@ int gen_node(t_btree **ast) *ast = btree_create_node(&item, sizeof(item)); ((t_astnode *)(*ast)->item)->data.token = NULL; ((t_astnode *)(*ast)->item)->data.redir.word.word = NULL; + ((t_astnode *)(*ast)->item)->data.loop = 0; } return (0); }