From f6aefd77395d73381caf38c57adcc15d5fb7ef9d Mon Sep 17 00:00:00 2001 From: "ariard@student.42.fr" Date: Sun, 19 Feb 2017 19:32:45 +0100 Subject: [PATCH] grammar if then elif part one --- 42sh/Makefile | 3 +- 42sh/includes/.parser.h.swn | Bin 20480 -> 0 bytes 42sh/includes/parser.h | 4 ++- 42sh/sample/if.sh | 20 ++++++------ 42sh/src/parser/.eval_sym.c.swn | Bin 28672 -> 0 bytes 42sh/src/parser/add_cmd.c | 6 ++-- 42sh/src/parser/add_condition.c | 56 ++++++++++++++++++++++++++++++++ 42sh/src/parser/add_loop.c | 6 ++-- 42sh/src/parser/add_sep.c | 2 +- 42sh/src/parser/aggregate_sym.c | 33 ++++++++++++++++--- 42sh/src/parser/build_tree.c | 6 +++- 42sh/src/parser/eval_sym.c | 6 ++-- 42sh/src/parser/ft_parse.c | 7 ++-- 42sh/src/parser/produce_sym.c | 9 ++++- 42sh/src/parser/read_stack.c | 10 +++++- 15 files changed, 137 insertions(+), 31 deletions(-) delete mode 100644 42sh/includes/.parser.h.swn delete mode 100644 42sh/src/parser/.eval_sym.c.swn create mode 100644 42sh/src/parser/add_condition.c diff --git a/42sh/Makefile b/42sh/Makefile index 2012337d..1f930775 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -200,7 +200,8 @@ parser/tree_wrapper.c\ parser/add_sep.c\ parser/add_cmd.c\ parser/add_file.c\ -parser/add_loop.c +parser/add_loop.c\ +parser/add_condition.c SRCS = $(addprefix $(SRC_DIR), $(SRC_BASE)) OBJS = $(addprefix $(OBJ_DIR), $(SRC_BASE:.c=.o)) diff --git a/42sh/includes/.parser.h.swn b/42sh/includes/.parser.h.swn deleted file mode 100644 index da1db700233da91d73f0d43480a6fea46ebc891d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 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 ZcC-$@f7=lkaD#PTOzAzN7b+U3{Tpt5EEE6$ diff --git a/42sh/includes/parser.h b/42sh/includes/parser.h index c453cc6f..8414d270 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/19 16:29:14 by ariard ### ########.fr */ +/* Updated: 2017/02/19 18:43:02 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -214,8 +214,10 @@ 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 add_condition_cmd(t_btree **ast, t_list **lst); int isloop(t_btree **ast); int isdir(t_btree **ast); +int iscondition(t_btree **ast); int join_ast(t_btree **ast, t_btree **new_node); int gen_node(t_btree **ast); diff --git a/42sh/sample/if.sh b/42sh/sample/if.sh index cfbccc74..7e2b40d0 100644 --- a/42sh/sample/if.sh +++ b/42sh/sample/if.sh @@ -1,13 +1,13 @@ -while ls -do if ls then - echo hello -else - while ls - do - echo hello world - pwd - done + pwd +elif ls +then + pwd +elif ls +then + pwd +else ls +then + pwd fi -done diff --git a/42sh/src/parser/.eval_sym.c.swn b/42sh/src/parser/.eval_sym.c.swn deleted file mode 100644 index 4b984d382a708a47b2e30f23a24f0881405bfa0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28672 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 EFBnD8+W-In diff --git a/42sh/src/parser/add_cmd.c b/42sh/src/parser/add_cmd.c index 9c89439f..b7a5217e 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/19 17:41:59 by ariard ### ########.fr */ +/* Updated: 2017/02/19 18:46:04 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,7 +25,9 @@ int add_cmd(t_btree **ast, t_list **lst) return (add_file(ast, lst)); else if (isloop(ast)) return (add_loop_cmd(ast, lst)); - else if ((node = (*ast)->item)->type != TK_DO) + else if (iscondition(ast)) + return (add_condition_cmd(ast, lst)); + else if ((node = (*ast)->item)->type != TK_DO && node->type != TK_THEN) return (add_cmd(&(*ast)->right, lst)); my_tab = NULL; token = (*lst)->content; diff --git a/42sh/src/parser/add_condition.c b/42sh/src/parser/add_condition.c new file mode 100644 index 00000000..c4279323 --- /dev/null +++ b/42sh/src/parser/add_condition.c @@ -0,0 +1,56 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* add_condition.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/19 18:12:52 by ariard #+# #+# */ +/* Updated: 2017/02/19 18:46:01 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "parser.h" + +int iscondition(t_btree **ast) +{ + t_astnode *node; + + node = NULL; + if (*ast) + { + node = (*ast)->item; + if ((node->type == TK_NEWLINE || node->type == TK_SEMI + || node->type == TK_AMP) && iscondition(&(*ast)->right) == 1) + return (1); + if ((node->type == TK_IF || node->type == TK_ELIF) + && node->full == 1) + return (2); + if ((node->type == TK_IF || node->type == TK_ELIF) + && node->full == 0) + return (1); + } + return (0); +} + +int add_condition_cmd(t_btree **ast, t_list **lst) +{ + t_token *token; + t_astnode *node; + + token = (*lst)->content; + node = (*ast)->item; + if (token->type == TK_IF && node->type == TK_IF) + node->nest++; + if (token->type == TK_FI && node->type == TK_IF && node->nest > 0) + node->nest--; + else if (token->type == TK_FI && node->type == TK_IF && node->nest == 0) + return ((node->full = 1)); + if (token->type == TK_THEN) + return (add_cmd(&(*ast)->right, lst)); + else if (!(*ast)->right && iscondition(&(*ast)->left) != 2) + return (add_cmd(&(*ast)->left, lst)); + else + return (add_cmd(&(*ast)->right, lst)); + return (0); +} diff --git a/42sh/src/parser/add_loop.c b/42sh/src/parser/add_loop.c index b6446d8c..6a82ae1f 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/19 17:52:52 by ariard ### ########.fr */ +/* Updated: 2017/02/19 18:38:25 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,8 +21,8 @@ int isloop(t_btree **ast) { node = (*ast)->item; DG("TEST LOOP"); - if ((node->type == TK_NEWLINE || node->type == TK_SEMI || - node->type == TK_AMP) && (isloop(&(*ast)->right) == 1)) + if ((node->type == TK_NEWLINE || node->type == TK_SEMI + || node->type == TK_AMP) && isloop(&(*ast)->right) == 1) return (1); if (node->type == TK_WHILE && node->full == 1) { diff --git a/42sh/src/parser/add_sep.c b/42sh/src/parser/add_sep.c index 2f4b9cb4..ed591f3a 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/19 17:51:51 by ariard ### ########.fr */ +/* Updated: 2017/02/19 18:46:06 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/parser/aggregate_sym.c b/42sh/src/parser/aggregate_sym.c index cc54a891..506be68a 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/19 17:35:28 by ariard ### ########.fr */ +/* Updated: 2017/02/19 19:32:24 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,6 +21,7 @@ t_aggrematch g_aggrematch[] = {TK_PIPE, CMD_SUPERIOR, SIMPLE_COMMAND, CMD_SUPERIOR}, {TK_FI, ELSE_PART, IF_CLAUSE, TK_IF}, {TK_FI, COMPOUND_LIST, IF_CLAUSE, TK_IF}, + {TK_FI, CMD_SUPERIOR, IF_CLAUSE, TK_IF}, {TK_DONE, CMD_SUPERIOR, DO_GROUP, TK_DO}, {TK_DONE, COMPOUND_LIST, DO_GROUP, TK_DO}, //Esac ? @@ -52,6 +53,10 @@ t_aggrematch g_aggrematch[] = {LINEBREAK, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST}, {NEWLINE_LIST, CMD_NAME, CMD_SUPERIOR, CMD_NAME}, {NEWLINE_LIST, TK_DO, TK_DO, TK_DO}, + {NEWLINE_LIST, TK_THEN, TK_THEN, TK_THEN}, + {NEWLINE_LIST, TK_IF, TK_IF, TK_IF}, + {NEWLINE_LIST, TK_ELIF, TK_ELIF, TK_ELIF}, + {NEWLINE_LIST, TK_ELSE, TK_ELSE, TK_ELSE}, {NEWLINE_LIST, TK_WHILE, TK_WHILE, TK_WHILE}, {NEWLINE_LIST, NEWLINE_LIST, NEWLINE_LIST, NEWLINE}, {NEWLINE_LIST, NAME, SEQUENTIAL_SEP, 0}, @@ -104,6 +109,9 @@ t_aggrematch g_aggrematch[] = {CMD_NAME, NEWLINE_LIST, CMD_SUPERIOR, 0}, {CMD_NAME, TK_WHILE, CMD_SUPERIOR, 0}, {CMD_NAME, TK_DO, CMD_SUPERIOR, 0}, + {CMD_NAME, TK_IF, CMD_SUPERIOR, 0}, + {CMD_NAME, TK_ELIF, CMD_SUPERIOR, 0}, + {CMD_NAME, TK_THEN, 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}, @@ -143,6 +151,9 @@ t_aggrematch g_aggrematch[] = {COMMAND, COMPOUND_LIST, PIPE_SEMI_SEQUENCE, 0}, {COMMAND, TK_WHILE, PIPE_SEMI_SEQUENCE, 0}, {COMMAND, TK_DO, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, TK_IF, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, TK_THEN, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, TK_ELIF, 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}, @@ -152,6 +163,9 @@ t_aggrematch g_aggrematch[] = {END_COMMAND, TK_WHILE, PIPE_SEQUENCE, 0}, {END_COMMAND, LINEBREAK, PIPE_SEQUENCE, 0}, {END_COMMAND, TK_DO, PIPE_SEQUENCE, 0}, + {END_COMMAND, TK_IF, PIPE_SEQUENCE, 0}, + {END_COMMAND, TK_ELIF, PIPE_SEQUENCE, 0}, + {END_COMMAND, TK_THEN, PIPE_SEQUENCE, 0}, {END_COMMAND, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST}, {PIPE_SEQUENCE, TK_WHILE, PIPELINE, 0}, {PIPE_SEQUENCE, TK_BANG, PIPELINE, TK_BANG}, @@ -160,9 +174,15 @@ t_aggrematch g_aggrematch[] = {PIPE_SEQUENCE, LINEBREAK, PIPELINE, 0}, {PIPE_SEQUENCE, AND_OR_MAJOR, PIPELINE, 0}, {PIPE_SEQUENCE, TK_DO, PIPELINE, 0}, + {PIPE_SEQUENCE, TK_IF, PIPELINE, 0}, + {PIPE_SEQUENCE, TK_ELIF, PIPELINE, 0}, + {PIPE_SEQUENCE, TK_THEN, PIPELINE, 0}, {PIPE_SEQUENCE, COMPOUND_LIST, PIPELINE, 0}, {PIPELINE, TK_WHILE, AND_OR, 0}, {PIPELINE, TK_DO, AND_OR, 0}, + {PIPELINE, TK_IF, AND_OR, 0}, + {PIPELINE, TK_ELIF, AND_OR, 0}, + {PIPELINE, TK_THEN, AND_OR, 0}, {PIPELINE, COMPOUND_LIST, AND_OR, 0}, {PIPELINE, LINEBREAK, AND_OR, 0}, // {PIPELINE, LINEBREAK, AND_OR, AND_OR}, @@ -171,6 +191,9 @@ t_aggrematch g_aggrematch[] = {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, TK_IF, COMPOUND_LIST, 0}, + {AND_OR, TK_ELIF, COMPOUND_LIST, 0}, + {AND_OR, TK_THEN, COMPOUND_LIST, 0}, {AND_OR, COMPOUND_LIST, COMPOUND_LIST, 0}, {AND_OR, SEPARATOR_OP, LIST, LIST}, {AND_OR, NEWLINE_LIST, LIST, 0}, @@ -188,20 +211,20 @@ int aggregate_sym(t_sym **stack, t_sym *new_sym, t_parstate *state) int i; i = 0; -// DG("aggregate head %s && sym %s", -// read_state(**stack), read_state(*new_sym)); + DG("aggregate head %s && sym %s", + read_state(**stack), read_state(*new_sym)); while (g_aggrematch[i].top) { if (*new_sym == g_aggrematch[i].top && MATCH_STACK(**stack, g_aggrematch[i].under)) { -// DG("MATCH : %s", read_state(g_aggrematch[i].new_sym)); + DG("MATCH : %s", read_state(g_aggrematch[i].new_sym)); *new_sym = g_aggrematch[i].new_sym; if (g_aggrematch[i].erase_sym) { pop_stack(stack, g_aggrematch[i].erase_sym); -// DG("stack after pop: %s", read_state(**stack)); + DG("stack after pop: %s", read_state(**stack)); } if (eval_sym(**stack, *new_sym)) return ((*state = ERROR)); diff --git a/42sh/src/parser/build_tree.c b/42sh/src/parser/build_tree.c index 53221db5..d4497c29 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/19 17:34:55 by ariard ### ########.fr */ +/* Updated: 2017/02/19 18:40:15 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,6 +24,10 @@ t_treematch g_treematch[] = {TK_WHILE, &add_cmd}, {TK_DO, &add_cmd}, {TK_DONE, &add_cmd}, + {TK_IF, &add_cmd}, + {TK_ELIF, &add_cmd}, + {TK_THEN, &add_cmd}, + {TK_FI, &add_cmd}, {TK_NEWLINE, &add_sep}, {0, NULL}, }; diff --git a/42sh/src/parser/eval_sym.c b/42sh/src/parser/eval_sym.c index 02dfd106..79770694 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/19 17:43:42 by ariard ### ########.fr */ +/* Updated: 2017/02/19 19:31:38 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -175,6 +175,8 @@ t_stackmatch g_stackmatch[] = {TK_ELIF, COMPOUND_LIST}, {TK_FI, ELSE_PART}, {TK_FI, COMPOUND_LIST}, + {TK_FI, CMD_SUPERIOR}, + {TK_FI, END_COMMAND}, {TK_DO, CMD_SUPERIOR}, {TK_DO, COMPOUND_LIST}, {TK_DO, NAME}, @@ -502,7 +504,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 e1d746b6..54349019 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/19 17:32:56 by ariard ### ########.fr */ +/* Updated: 2017/02/19 18:41:29 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,6 +33,7 @@ int ft_parse2(t_btree **ast, t_list **token) t_sym *stack; t_parstate state; + (void)ast; state = UNDEFINED; new_sym = ft_memalloc(sizeof(t_sym)); stack = ft_memalloc(sizeof(t_sym) * 1000); @@ -56,8 +57,8 @@ int ft_parse2(t_btree **ast, t_list **token) return (error_syntax(token)); if (state == SUCCESS) ft_putstr("success"); - build_tree(ast, token); - btree_print(STDBUG, *ast, &ft_putast); +// build_tree(ast, token); +// btree_print(STDBUG, *ast, &ft_putast); if ((end_instruction(*stack) && !(*token)->next) || *stack == PROGRAM) insert_linebreak(token); else diff --git a/42sh/src/parser/produce_sym.c b/42sh/src/parser/produce_sym.c index d896e8d9..1773e115 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/19 17:35:31 by ariard ### ########.fr */ +/* Updated: 2017/02/19 19:31:40 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,6 +31,9 @@ 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, TK_IF, CMD_NAME}, + {TK_N_WORD, TK_THEN, CMD_NAME}, + {TK_N_WORD, TK_ELIF, CMD_NAME}, {TK_N_WORD, COMPOUND_LIST, CMD_NAME}, {TK_N_WORD, NEWLINE_LIST, CMD_NAME}, @@ -51,6 +54,10 @@ t_prodmatch g_prodmatch[] = {TK_NAME, TK_FOR, NAME}, {TK_NEWLINE, TK_DO, NEWLINE_LIST}, {TK_NEWLINE, TK_WHILE, NEWLINE_LIST}, + {TK_NEWLINE, TK_IF, NEWLINE_LIST}, + {TK_NEWLINE, TK_FI, NEWLINE_LIST}, + {TK_NEWLINE, TK_ELIF, NEWLINE_LIST}, + {TK_NEWLINE, TK_ELSE, NEWLINE_LIST}, {TK_NEWLINE, CMD_NAME, NEWLINE_LIST}, {TK_NEWLINE, COMPLETE_COMMANDS, NEWLINE_LIST}, {TK_NEWLINE, LINEBREAK, NEWLINE_LIST}, diff --git a/42sh/src/parser/read_stack.c b/42sh/src/parser/read_stack.c index 822bb0bb..a943423b 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/18 20:03:24 by ariard ### ########.fr */ +/* Updated: 2017/02/19 19:31:42 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,14 @@ char *read_state(t_sym current) { + if (current == TK_FI) + return ("TK_FI"); + if (current == TK_IF) + return ("TK_IF"); + if (current == TK_ELIF) + return ("TK_ELIF"); + if (current == TK_THEN) + return ("TK_THEN"); if (current == COMPOUND_COMMAND) return ("COMPOUND_COMMAND"); if (current == WHILE_CLAUSE)