From 597afe06d099aaea255487ef04bfcdb58061cdf9 Mon Sep 17 00:00:00 2001 From: "ariard@student.42.fr" Date: Mon, 20 Feb 2017 18:17:37 +0100 Subject: [PATCH] nesting condition ok --- 42sh/sample/if/01_if_easy.sh | 13 ++++++------- 42sh/src/parser/.produce_sym.c.swn | Bin 0 -> 20480 bytes 42sh/src/parser/add_cmd.c | 2 +- 42sh/src/parser/add_condition.c | 4 ++-- 42sh/src/parser/add_loop.c | 2 +- 42sh/src/parser/add_sep.c | 2 +- 42sh/src/parser/aggregate_sym.c | 3 ++- 42sh/src/parser/build_tree.c | 2 +- 42sh/src/parser/eval_sym.c | 8 ++++++-- 42sh/src/parser/ft_parse.c | 7 ++++++- 42sh/src/parser/produce_sym.c | 2 +- 42sh/src/parser/read_stack.c | 4 +++- 12 files changed, 30 insertions(+), 19 deletions(-) create mode 100644 42sh/src/parser/.produce_sym.c.swn diff --git a/42sh/sample/if/01_if_easy.sh b/42sh/sample/if/01_if_easy.sh index cc8f6b09..8d5a9525 100644 --- a/42sh/sample/if/01_if_easy.sh +++ b/42sh/sample/if/01_if_easy.sh @@ -1,10 +1,9 @@ if ls then - pwd -elif ls -then - pwd -elif ls -then - pwd + if ls + then + pwd + else pwd + fi +else ls fi diff --git a/42sh/src/parser/.produce_sym.c.swn b/42sh/src/parser/.produce_sym.c.swn new file mode 100644 index 0000000000000000000000000000000000000000..747572ce8e1c984c0e4916f253c6dbb69b3f304f GIT binary patch literal 20480 zcmeI2OKclO7{{lirCsO)@sJP*X`0a1v0dA70!^K!)Unsew)WcC4rx^t<2nv;n>v=g zQHj#f3y2GF;32gL34tg=>VZ>H54|9S5U2uypaQN1dME;khs3S?XCKZwvDa>?cu3#2 zzpU5u-*3M8@6LL6XATD*Qxbg87hqWKVC*w~cK?-AoGCvsmamrb)k#s{ycGMZeZk6r zZy@NKsyaxYHUj!n)!8G(f>!en1Z&g&TD9P>|6_Eqv z!1XyWr%i1i+`#&SeR@~#>E6umx^w*cVvw2~AP2|+a)2Bl2gm_(fE*wP{?`s@l`eJ? zEx5&O#i+SnwQRlG+`ivj?_E~jWp1xC*Vf~^703LVR^$LVKn{=tl2aj*eg*vQyXa3A<&17lBtZQ#;+#-0Vw zfC`ueX^;Xwunt_gov{zWo8SaE0Q$iuaP>CEJ_c`q6W|~i0{4L5B*wl1=fEqV2GYO- zuHhxax8OW@9!!C~zy(%;FV`}52Gl?p^nkVC$6Fcu2%H7afhWK&a4-0E4PzIu|_*=N!#iYnW9iM(VPZirYoAtk-V;L(r_brFOv+x zFn76UYFh91-G$k*RxE2n43(EPI8Z_wT27Zql3QO7u?40V+NPekG~t|4yO$dqR%68W zOsS@Ew_XWji-@@p@N)5g(Tl1Uviox3M9RzKN+#>&895bBhqK9aE}264QgK#JCmf0+ ziD)h}o|4l_GTmI3krRrSr<9bO6Cd&C(Q#Rg$WH3kIT_JfCI$D}E=J>2c_OZ;$Rd(d zqe@mus$On>mlM@nCfIa|R9w!=x$D^>Ij%qO-OAzTD-qr+dYrSWb-6gR@Ke=V zuo>$7-TN5e;X?ynIYf%Q;z%T9+=%W;9(_H7FLCwsa#Z zN%kAfLwp$b;-zw7W^S^`yNx-&zUgkp{BGP&-K>SX{UYE^T&#fOl}X%bPlk9f(6_@M z2>OEo-ZvNu^o0UJet4c6)0=G-_w@8&3xD+mlcUWtD_{h-!VLifJ9*!Z&_jcv{(+_e zd5=d#v{q&~eq&AcAei|Nf$*swZYki%e8_6nE~9ySY8nn-Su8+~5s{}E-3n;CarYHEhzCi?6EcM62V-Rg>@3DIRVZYI#3!+!{BH$Z7GK{q z0^Y2C;zpnRGX`oxhtR#-&%u@7(vwsEseohF{X;)+Raue#&5Bw zRPuOGqJOjx!P;NMEe#J3>CgXPW1RjF#`DGVzcs)A8$92i2dBUh5CIQ@HDERP6LSIn z0KbFt;C=8mcnzEeC&38V0v-Sx!Oy7UD)<1r4o(5R-W#@xb|eSL0djyGAP2|+a)2Bl k2gm_(;6LI3P1-f)OV literal 0 HcmV?d00001 diff --git a/42sh/src/parser/add_cmd.c b/42sh/src/parser/add_cmd.c index 01e2ab7b..74f17a8c 100644 --- a/42sh/src/parser/add_cmd.c +++ b/42sh/src/parser/add_cmd.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/15 20:49:15 by ariard #+# #+# */ -/* Updated: 2017/02/20 17:03:15 by ariard ### ########.fr */ +/* Updated: 2017/02/20 18:08:21 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/parser/add_condition.c b/42sh/src/parser/add_condition.c index ff7c7914..4b4dc908 100644 --- a/42sh/src/parser/add_condition.c +++ b/42sh/src/parser/add_condition.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/19 18:12:52 by ariard #+# #+# */ -/* Updated: 2017/02/20 17:23:25 by ariard ### ########.fr */ +/* Updated: 2017/02/20 18:17:26 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,7 +24,7 @@ int iscondition(t_btree **ast, t_list **lst) node = (*ast)->item; if ((node->type == TK_IF || iscondition(&(*ast)->right, lst)) && (token->type == TK_ELIF || token->type == TK_ELSE) - && node->full == 0) + && node->nest == 0) return (2); if ((node->type == TK_IF || node->type == TK_ELIF || node->type == TK_ELSE) && node->full == 0) diff --git a/42sh/src/parser/add_loop.c b/42sh/src/parser/add_loop.c index 17eb4f5d..465f66cb 100644 --- a/42sh/src/parser/add_loop.c +++ b/42sh/src/parser/add_loop.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/17 22:17:14 by ariard #+# #+# */ -/* Updated: 2017/02/20 17:18:49 by ariard ### ########.fr */ +/* Updated: 2017/02/20 17:46:39 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/parser/add_sep.c b/42sh/src/parser/add_sep.c index 59335fbf..e9243154 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/20 17:07:16 by ariard ### ########.fr */ +/* Updated: 2017/02/20 17:46:54 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/parser/aggregate_sym.c b/42sh/src/parser/aggregate_sym.c index 1d176325..c4b7d367 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/20 16:10:21 by ariard ### ########.fr */ +/* Updated: 2017/02/20 18:03:21 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -172,6 +172,7 @@ t_aggrematch g_aggrematch[] = {COMMAND, NEWLINE_LIST, PIPE_SEMI_SEQUENCE, 0}, {COMMAND, LINEBREAK, PIPE_SEMI_SEQUENCE, 0}, {COMMAND, AND_OR_MAJOR, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, COMPLETE_CONDITION, 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}, diff --git a/42sh/src/parser/build_tree.c b/42sh/src/parser/build_tree.c index 9b3c6bd4..5a0a87cb 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/20 17:23:48 by ariard ### ########.fr */ +/* Updated: 2017/02/20 17:46:48 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/parser/eval_sym.c b/42sh/src/parser/eval_sym.c index 677e0bb8..72b9015a 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/20 16:10:06 by ariard ### ########.fr */ +/* Updated: 2017/02/20 18:03:18 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -175,6 +175,7 @@ t_stackmatch g_stackmatch[] = {TK_IF, TK_DO}, {TK_IF, TK_ELIF}, {TK_IF, TK_THEN}, + {TK_IF, COMPLETE_CONDITION}, {TK_IF, COMPOUND_LIST}, {TK_THEN, CONDITION}, {TK_THEN, COMPOUND_LIST}, @@ -416,7 +417,9 @@ t_stackmatch g_stackmatch[] = {LOOP, TK_UNTIL}, {CONDITION, LINEBREAK}, {CONDITION, COMPOUND_LIST}, + {CONDITION, COMPLETE_CONDITION}, {COMPLETE_CONDITION, LINEBREAK}, + {COMPLETE_CONDITION, COMPLETE_CONDITION}, {BRACE_GROUP, LINEBREAK}, {BRACE_GROUP, TK_BANG}, {BRACE_GROUP, SEPARATOR_OP}, @@ -466,6 +469,7 @@ t_stackmatch g_stackmatch[] = {IF_CLAUSE, TK_ELSE}, {IF_CLAUSE, COMPOUND_LIST}, {IF_CLAUSE, COMPLETE_COMMAND}, + {IF_CLAUSE, COMPLETE_CONDITION}, {PATTERN, TK_PAREN_OPEN}, {PATTERN, CASE_LIST}, @@ -600,7 +604,7 @@ int eval_sym(t_sym stack, t_sym new_sym) { int i; -// DG("eval head %s && sym %s", read_state(stack), read_state(new_sym)); + DG("eval head %s && sym %s", read_state(stack), read_state(new_sym)); i = 0; while (g_stackmatch[i].top) { diff --git a/42sh/src/parser/ft_parse.c b/42sh/src/parser/ft_parse.c index 09329b2d..317c5a00 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/20 16:32:27 by ariard ### ########.fr */ +/* Updated: 2017/02/20 18:16:44 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -63,5 +63,10 @@ int ft_parse2(t_btree **ast, t_list **token) else ft_lst_delif(token, (*token)->content, &ft_addrcmp, &token_free); } + if (state == UNDEFINED) + { + ft_putstr("syntax error: unexpected end of file\n"); + return (0); + } return (0); } diff --git a/42sh/src/parser/produce_sym.c b/42sh/src/parser/produce_sym.c index f1c6bf0b..0c78928c 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/20 16:09:54 by ariard ### ########.fr */ +/* Updated: 2017/02/20 18:01:02 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/parser/read_stack.c b/42sh/src/parser/read_stack.c index fa73330d..3dd67cd2 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/20 16:09:16 by ariard ### ########.fr */ +/* Updated: 2017/02/20 18:03:26 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,8 @@ char *read_state(t_sym current) { + if (current == IF_CLAUSE) + return ("IF_CLAUSE"); if (current == CONDITION) return ("CONDITION"); if (current == COMPLETE_CONDITION)