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 00000000..747572ce Binary files /dev/null and b/42sh/src/parser/.produce_sym.c.swn differ 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)