diff --git a/42sh/includes/.parser.h.swn b/42sh/includes/.parser.h.swn deleted file mode 100644 index 8b6d42c5..00000000 Binary files a/42sh/includes/.parser.h.swn and /dev/null differ diff --git a/42sh/includes/parser.h b/42sh/includes/parser.h index 2d66ee99..d40032d1 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 17:11:45 by ariard ### ########.fr */ +/* Updated: 2017/02/17 18:49:28 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/sample/while.sh b/42sh/sample/while.sh index 4dd61c2f..fe11d2e0 100644 --- a/42sh/sample/while.sh +++ b/42sh/sample/while.sh @@ -1,28 +1 @@ -while ls -do - while ls - do - while ls - do - while ls - do - while ls - do - while ls - do - echo hello - done - done - done - done - done - ls - while ls - do - while ls - do - echo world - done - done - pwd -done +ls | cat | cat | cat | cat | cat diff --git a/42sh/sample/yale1.sh b/42sh/sample/yale1.sh index 05752234..8b137891 100644 --- a/42sh/sample/yale1.sh +++ b/42sh/sample/yale1.sh @@ -1 +1 @@ -< file1 ls | cat | cat | ls > file2 + diff --git a/42sh/src/lexer/ft_lexer.c b/42sh/src/lexer/ft_lexer.c index 2063e7dd..54c390d0 100644 --- a/42sh/src/lexer/ft_lexer.c +++ b/42sh/src/lexer/ft_lexer.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/02 15:30:59 by jhalford #+# #+# */ -/* Updated: 2017/02/10 01:24:32 by ariard ### ########.fr */ +/* Updated: 2017/02/17 17:28:32 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,8 +21,8 @@ int ft_lexer(t_list **alst, char **command) ret = 1; else if (ft_tokenize(alst, *command, DEFAULT)) ret = 1; -// else if (ft_post_tokenize(alst, command)) -// ret = 1; + else if (ft_post_tokenize(alst, command)) + ret = 1; ft_strdel(command); return (ret); } diff --git a/42sh/src/lexer/ft_post_tokenize.c b/42sh/src/lexer/ft_post_tokenize.c index f951fe2b..dfb0b406 100644 --- a/42sh/src/lexer/ft_post_tokenize.c +++ b/42sh/src/lexer/ft_post_tokenize.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/11 16:11:11 by jhalford #+# #+# */ -/* Updated: 2017/02/04 15:54:27 by ariard ### ########.fr */ +/* Updated: 2017/02/17 17:28:15 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,12 +14,13 @@ int ft_post_tokenize(t_list **alst, char **str) { - int ret; - t_flag tk; +// int ret; +// t_flag tk; + (void)str; // token_print(*alst); get_reserved_words(alst); - while ((ret = reduce_parens(alst, *str))) +/* while ((ret = reduce_parens(alst, *str))) if (ret == -1) { ft_dprintf(2, "{red}%s: parse error near '('{eoc}\n", SHELL_NAME); @@ -38,5 +39,5 @@ int ft_post_tokenize(t_list **alst, char **str) return (-1); } DG("new command from bquotes: '%s'", *str); - return (0); +*/ return (0); } diff --git a/42sh/src/lexer/ft_tokenize.c b/42sh/src/lexer/ft_tokenize.c index 26b35eca..54b6a9cc 100644 --- a/42sh/src/lexer/ft_tokenize.c +++ b/42sh/src/lexer/ft_tokenize.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/10 13:37:11 by jhalford #+# #+# */ -/* Updated: 2017/02/09 21:55:06 by ariard ### ########.fr */ +/* Updated: 2017/02/17 17:28:23 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/lexer/get_reserved_words.c b/42sh/src/lexer/get_reserved_words.c index 8e05c32c..d09cf09e 100644 --- a/42sh/src/lexer/get_reserved_words.c +++ b/42sh/src/lexer/get_reserved_words.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/26 00:07:05 by ariard #+# #+# */ -/* Updated: 2017/02/10 01:13:35 by ariard ### ########.fr */ +/* Updated: 2017/02/17 17:30:54 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,7 +21,7 @@ int get_reserved_words(t_list **alst) temp = *alst; previous_token = NULL; while (temp) - { + { token = temp->content; if (!previous_token || (previous_token->type & RW_SEP)) { diff --git a/42sh/src/main/shell_script.c b/42sh/src/main/shell_script.c index 2d2829b0..d7273002 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/15 20:58:03 by ariard ### ########.fr */ +/* Updated: 2017/02/17 17:22:03 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/parser/.eval_sym.c.swn b/42sh/src/parser/.eval_sym.c.swn new file mode 100644 index 00000000..4e796003 Binary files /dev/null and b/42sh/src/parser/.eval_sym.c.swn differ diff --git a/42sh/src/parser/.read_stack.c.swn b/42sh/src/parser/.read_stack.c.swn new file mode 100644 index 00000000..d4ee5d04 Binary files /dev/null and b/42sh/src/parser/.read_stack.c.swn differ diff --git a/42sh/src/parser/add_cmd.c b/42sh/src/parser/add_cmd.c index 2ad670f7..1c21999e 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/17 16:52:22 by ariard ### ########.fr */ +/* Updated: 2017/02/17 17:46:18 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/parser/add_file.c b/42sh/src/parser/add_file.c index 4eed48cc..1eed2a89 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:14:52 by ariard ### ########.fr */ +/* Updated: 2017/02/17 17:19:35 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/parser/aggregate_sym.c b/42sh/src/parser/aggregate_sym.c index 2b1458bc..3f0a83d2 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 17:05:00 by ariard ### ########.fr */ +/* Updated: 2017/02/17 19:48:12 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,9 +19,10 @@ t_aggrematch g_aggrematch[] = {TK_WORD, WORDLIST, WORDLIST, 0}, {TK_ASSIGNEMENT_WORD, CMD_PREFIX,CMD_PREFIX, 0}, {TK_PIPE, CMD_SUPERIOR, SIMPLE_COMMAND, CMD_SUPERIOR}, - {TK_FI, ELSE_PART, IF_CLAUSE, IF}, - {TK_FI, COMPOUND_LIST, IF_CLAUSE, IF}, - {TK_DONE, COMPOUND_LIST, DO_GROUP, DO}, + {TK_FI, ELSE_PART, IF_CLAUSE, TK_IF}, + {TK_FI, COMPOUND_LIST, IF_CLAUSE, TK_IF}, + {TK_DONE, CMD_SUPERIOR, DO_GROUP, TK_DO}, + {TK_DONE, COMPOUND_LIST, DO_GROUP, TK_DO}, //Esac ? {TK_ESAC, CASE_LIST, CASE_CLAUSE, TK_CASE}, {TK_ESAC, CASE_LIST_NS, CASE_CLAUSE, TK_CASE}, @@ -31,7 +32,10 @@ t_aggrematch g_aggrematch[] = {TK_AND_IF, CMD_SUPERIOR, AND_OR_MINOR, CMD_SUPERIOR}, {TK_OR_IF, CMD_SUPERIOR, AND_OR_MINOR, CMD_SUPERIOR}, //watch this - {SEPARATOR, COMPOUND_LIST, COMPOUND_LIST, 0}, + {SEPARATOR_OP, CMD_SUPERIOR, SEPARATOR, 0}, + {SEPARATOR_OP, COMPOUND_LIST, SEPARATOR, 0}, + {SEPARATOR, CMD_SUPERIOR, SIMPLE_COMMAND, CMD_SUPERIOR}, + {SEPARATOR, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST}, {LINEBREAK, SEPARATOR_OP, SEPARATOR, SEPARATOR_OP}, {LINEBREAK, TK_SEMI, SEQUENTIAL_SEP, TK_SEMI}, @@ -45,6 +49,9 @@ t_aggrematch g_aggrematch[] = {LINEBREAK, COMPLETE_COMMANDS, PROGRAM, LINEBREAK}, {LINEBREAK, CMD_SUPERIOR, SIMPLE_COMMAND, CMD_SUPERIOR}, {LINEBREAK, PIPE_SEMI_SEQUENCE, PIPE_SEQUENCE, PIPE_SEMI_SEQUENCE}, + {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, NEWLINE_LIST, NEWLINE_LIST, NEWLINE}, {NEWLINE_LIST, NAME, SEQUENTIAL_SEP, 0}, {NEWLINE_LIST, IN, SEQUENTIAL_SEP, 0}, @@ -94,18 +101,20 @@ t_aggrematch g_aggrematch[] = {CMD_NAME, TK_BANG, CMD_SUPERIOR, 0}, {CMD_NAME, SEPARATOR_OP, CMD_SUPERIOR, 0}, {CMD_NAME, NEWLINE_LIST, CMD_SUPERIOR, 0}, + {CMD_NAME, TK_WHILE, 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}, {SIMPLE_COMMAND, ALL, COMMAND, 0}, {DO_GROUP, NAME, FOR_CLAUSE, TK_FOR}, {DO_GROUP, SEQUENTIAL_SEP, FOR_CLAUSE, TK_FOR}, + {DO_GROUP, CMD_SUPERIOR, LOOP, CMD_SUPERIOR}, {DO_GROUP, COMPOUND_LIST, LOOP, COMPOUND_LIST}, - {LOOP, WHILE, WHILE_CLAUSE, WHILE}, - {LOOP, TK_UNTIL, UNTIL_CLAUSE, TK_UNTIL}, {BRACE_GROUP, ALL, COMPOUND_COMMAND, 0}, {FUNCTION_BODY, FUNC, FUNCTION_DEFINITION, 0}, {FUNCTION_DEFINITION, ALL, COMMAND, 0}, + {LOOP, TK_WHILE, WHILE_CLAUSE, TK_WHILE}, + {LOOP, TK_UNTIL, UNTIL_CLAUSE, TK_UNTIL}, {UNTIL_CLAUSE, ALL, COMPOUND_COMMAND, 0}, {WHILE_CLAUSE, ALL, COMPOUND_COMMAND, 0}, {ELSE_PART, COMPOUND_LIST, ELSE_PART, TK_ELIF}, @@ -126,22 +135,26 @@ t_aggrematch g_aggrematch[] = {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_SEQUENCE, PIPE_SEMI_SEQUENCE}, + {COMMAND, PIPE_SEMI_SEQUENCE, PIPE_SEMI_SEQUENCE, PIPE_SEMI_SEQUENCE}, + {COMMAND, TK_WHILE, 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}, + {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}, + {PIPELINE, TK_WHILE, 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_WHILE, COMPOUND_LIST, 0}, {AND_OR, SEPARATOR_OP, LIST, LIST}, {AND_OR, NEWLINE_LIST, LIST, 0}, {AND_OR, LINEBREAK, LIST, 0}, @@ -159,20 +172,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 8d1b1d64..43f5bb4b 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 16:39:38 by ariard ### ########.fr */ +/* Updated: 2017/02/17 18:48:56 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -36,8 +36,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 b27c1418..709f9a91 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 17:05:11 by ariard ### ########.fr */ +/* Updated: 2017/02/17 19:43:28 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -175,9 +175,11 @@ t_stackmatch g_stackmatch[] = {TK_ELIF, COMPOUND_LIST}, {TK_FI, ELSE_PART}, {TK_FI, COMPOUND_LIST}, + {TK_DO, CMD_SUPERIOR}, {TK_DO, COMPOUND_LIST}, {TK_DO, NAME}, {TK_DO, SEQUENTIAL_SEP}, + {TK_DONE, CMD_SUPERIOR}, {TK_DONE, COMPOUND_LIST}, {TK_CASE, LINEBREAK}, {TK_CASE, TK_BANG}, @@ -236,8 +238,10 @@ t_stackmatch g_stackmatch[] = {SEQUENTIAL_SEP, NAME}, {SEQUENTIAL_SEP, IN}, {SEQUENTIAL_SEP, WORDLIST}, + {SEPARATOR, CMD_SUPERIOR}, {SEPARATOR, TERM}, {SEPARATOR, COMPOUND_LIST}, + {SEPARATOR_OP, CMD_SUPERIOR}, {SEPARATOR_OP, LIST}, {SEPARATOR_OP, TERM}, {SEPARATOR_OP, COMPOUND_LIST}, @@ -253,6 +257,9 @@ t_stackmatch g_stackmatch[] = {LINEBREAK, COMPLETE_COMMANDS}, {LINEBREAK, CMD_SUPERIOR}, {LINEBREAK, PIPE_SEMI_SEQUENCE}, + {LINEBREAK, COMPOUND_LIST}, + {NEWLINE_LIST, TK_DO}, + {NEWLINE_LIST, CMD_NAME}, {NEWLINE_LIST, NEWLINE_LIST}, {NEWLINE_LIST, NAME}, {NEWLINE_LIST, IN}, @@ -319,7 +326,11 @@ t_stackmatch g_stackmatch[] = {CMD_NAME, NEWLINE_LIST}, {CMD_NAME, PIPE_SEMI_SEQUENCE}, {CMD_NAME, AND_OR_MAJOR}, + {CMD_NAME, TK_WHILE}, + {CMD_NAME, TK_DO}, + {CMD_SUPERIOR, TK_WHILE}, + {CMD_SUPERIOR, TK_DO}, {CMD_SUPERIOR, LINEBREAK,}, {CMD_SUPERIOR, TK_BANG}, {CMD_SUPERIOR, SEPARATOR_OP}, @@ -328,12 +339,14 @@ t_stackmatch g_stackmatch[] = {CMD_SUPERIOR, PIPE_SEMI_SEQUENCE}, {CMD_SUPERIOR, AND_OR_MAJOR}, + {SIMPLE_COMMAND, TK_WHILE}, {SIMPLE_COMMAND, LINEBREAK}, {SIMPLE_COMMAND, TK_BANG}, {SIMPLE_COMMAND, SEPARATOR_OP}, {SIMPLE_COMMAND, NEWLINE_LIST}, {SIMPLE_COMMAND, PIPE_SEMI_SEQUENCE}, {SIMPLE_COMMAND, AND_OR_MAJOR}, + {DO_GROUP, CMD_SUPERIOR}, {DO_GROUP, COMPOUND_LIST}, {DO_GROUP, NAME}, {DO_GROUP, SEQUENTIAL_SEP}, @@ -412,6 +425,7 @@ t_stackmatch g_stackmatch[] = {COMPOUND_COMMAND, NEWLINE_LIST}, {COMPOUND_COMMAND, PIPE_SEMI_SEQUENCE}, {COMPOUND_COMMAND, FUNC}, + {COMMAND, TK_WHILE}, {COMMAND, LINEBREAK}, {COMMAND, TK_BANG}, {COMMAND, SEPARATOR_OP}, @@ -421,22 +435,26 @@ t_stackmatch g_stackmatch[] = {AND_OR_MINOR, PIPE_SEMI_SEQUENCE}, {AND_OR_MINOR, LINEBREAK}, {AND_OR_MINOR, AND_OR_MAJOR}, + {PIPE_SEQUENCE, TK_WHILE}, {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, 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, LINEBREAK}, {PIPELINE, SEPARATOR_OP}, {PIPELINE, NEWLINE_LIST}, {PIPELINE, AND_OR_MAJOR}, {AND_OR_MAJOR, LINEBREAK}, {AND_OR_MAJOR, AND_OR_MAJOR}, + {AND_OR, TK_WHILE}, {AND_OR, LINEBREAK}, {AND_OR, SEPARATOR_OP}, {AND_OR, NEWLINE_LIST}, @@ -452,7 +470,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 d8dc831d..7e00865d 100644 --- a/42sh/src/parser/ft_parse.c +++ b/42sh/src/parser/ft_parse.c @@ -6,20 +6,33 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/09 14:30:22 by ariard #+# #+# */ -/* Updated: 2017/02/17 17:05:21 by ariard ### ########.fr */ +/* Updated: 2017/02/17 19:48:01 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ #include "parser.h" +static void insert_linebreak(t_list **lst) +{ + t_token *token; + + token = (*lst)->content; + token->type = LINEBREAK; +} + +static int end_instruction(t_sym sym) +{ + if (sym == CMD_SUPERIOR || sym == PIPE_SEMI_SEQUENCE) + return (1); + return (0); +} + int ft_parse2(t_btree **ast, t_list **token) { t_sym *new_sym; t_sym *stack; t_parstate state; -//to delete - (void)ast; state = UNDEFINED; new_sym = ft_memalloc(sizeof(t_sym)); stack = ft_memalloc(sizeof(t_sym) * 1000); @@ -27,11 +40,11 @@ int ft_parse2(t_btree **ast, t_list **token) while (*token) { produce_sym(*stack, new_sym, token); -// DG("new sym %s", read_state(*new_sym)); + DG("new sym %s", read_state(*new_sym)); if (eval_sym(*stack, *new_sym)) state = ERROR; else - { + { aggregate_sym(&stack, new_sym, &state); push_stack(++stack, *new_sym); } @@ -44,7 +57,10 @@ int ft_parse2(t_btree **ast, t_list **token) if (state == SUCCESS) ft_putstr("success"); build_tree(ast, token); - ft_lst_delif(token, (*token)->content, &ft_addrcmp, &token_free); + if (end_instruction(*stack) && !(*token)->next) + insert_linebreak(token); + else + ft_lst_delif(token, (*token)->content, &ft_addrcmp, &token_free); } return (0); } diff --git a/42sh/src/parser/produce_sym.c b/42sh/src/parser/produce_sym.c index c3405ea6..6b70555f 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 17:04:44 by ariard ### ########.fr */ +/* Updated: 2017/02/17 19:48:06 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,6 +29,8 @@ t_prodmatch g_prodmatch[] = {TK_N_WORD, TK_PIPE, CMD_NAME}, {TK_N_WORD, AND_OR, CMD_NAME}, {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, NEWLINE_LIST, CMD_NAME}, {TK_N_WORD, TK_BANG, CMD_NAME}, @@ -46,13 +48,18 @@ t_prodmatch g_prodmatch[] = {TK_NAME, SEPARATOR_OP, FNAME}, {TK_NAME, NEWLINE_LIST, FNAME}, {TK_NAME, TK_FOR, NAME}, + {TK_NEWLINE, TK_DO, NEWLINE_LIST}, + {TK_NEWLINE, CMD_NAME, NEWLINE_LIST}, {TK_NEWLINE, COMPLETE_COMMANDS, NEWLINE_LIST}, {TK_NEWLINE, LINEBREAK, NEWLINE_LIST}, {TK_NEWLINE, CMD_SUPERIOR, LINEBREAK}, {TK_NEWLINE, PIPE_SEMI_SEQUENCE, LINEBREAK}, + {TK_NEWLINE, COMPOUND_LIST, NEWLINE_LIST}, + {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}, diff --git a/42sh/src/parser/read_stack.c b/42sh/src/parser/read_stack.c index 89f4af57..893f9f94 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/13 22:40:40 by ariard ### ########.fr */ +/* Updated: 2017/02/17 19:40:45 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,26 @@ char *read_state(t_sym current) { + if (current == SEQUENTIAL_SEP) + return ("SEQUENTIAL_SEP"); + if (current == SEPARATOR) + return ("SEPARATOR"); + if (current == SEPARATOR_OP) + return ("SEPARATOR_OP"); + if (current == TERM) + return ("TERM"); + if (current == COMPOUND_LIST) + return ("COMPOUND_LIST"); + if (current == DO_GROUP) + return ("DO_GROUP"); + if (current == TK_NEWLINE) + return ("TK_NEWLINE"); + if (current == TK_WHILE) + return ("TK_WHILE"); + if (current == TK_DO) + return ("TK_DO"); + if (current == TK_DONE) + return ("TK_DONE"); if (current == AND_OR_MINOR) return("AND_OR_MINOR"); if (current == AND_OR_MAJOR) @@ -92,27 +112,9 @@ char *read_state(t_sym current) return ("TK_SEMI"); if (current == ALL) return ("ALL"); -/* if (current == NEWLINE_LIST) + if (current == NEWLINE_LIST) return ("NEWLINE_LIST"); - if (current == SYM_DLESS) - return ("DLESS"); - if (current == SYM_DGREAT) - return ("DGREAT"); - if (current == SYM_GREATAND) - return ("GREATAND"); -*/ if (current == TK_GREAT) - return ("GREAT"); - if (current == TK_LESS) - return ("LESS"); -/* if (current == SYM_LESSAND) - return ("LESSAND"); - if (current == SYM_LESS) - return ("LESS"); - if (current == SIMPLE_COMMAND) - return ("SIMPLE_COMMAND"); - if (current == PROGRAM) - return ("PROGRAM"); -*/ if (current == LINEBREAK) + if (current == LINEBREAK) return ("LINEBREAK"); if (current != 0) return ("NON-DEFINED"); diff --git a/42sh/src/parser/tree_wrapper.c b/42sh/src/parser/tree_wrapper.c index 0328eae4..56235151 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:14:34 by ariard ### ########.fr */ +/* Updated: 2017/02/17 17:19:41 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/test.sh b/42sh/test.sh index e69de29b..27c1ef0f 100644 --- a/42sh/test.sh +++ b/42sh/test.sh @@ -0,0 +1 @@ +ls |