diff --git a/42sh/includes/parser.h b/42sh/includes/parser.h index 503a37f9..66f9a5cd 100644 --- a/42sh/includes/parser.h +++ b/42sh/includes/parser.h @@ -126,6 +126,7 @@ enum e_sym END_COMMAND, CONDITION, COMPLETE_CONDITION, + FOR_WORDLIST, ALL = 200, }; diff --git a/42sh/src/lexer/get_reserved_words.c b/42sh/src/lexer/get_reserved_words.c index 84c2f493..0dc99e4b 100644 --- a/42sh/src/lexer/get_reserved_words.c +++ b/42sh/src/lexer/get_reserved_words.c @@ -49,11 +49,15 @@ int get_reserved_words(t_list **alst) token->type = TK_UNTIL; else if (ft_strncmp(token->data, "case", 4) == 0) token->type = TK_CASE; + else if (ft_strncmp(token->data, "for", 3) == 0) + token->type = TK_FOR; } } - if (ante_token && ante_token->type == TK_CASE + if (ante_token && (ante_token->type == TK_CASE || ante_token->type == TK_FOR) && ft_strncmp(token->data, "in", 2) == 0) token->type = TK_IN; + if (previous_token && previous_token->type == TK_FOR && token->type == TK_WORD) + token->type = TK_NAME; ante_token = previous_token; previous_token = token; temp = temp->next; diff --git a/42sh/src/lexer/insert_newline.c b/42sh/src/lexer/insert_newline.c index 1057c24e..ea17e055 100644 --- a/42sh/src/lexer/insert_newline.c +++ b/42sh/src/lexer/insert_newline.c @@ -16,6 +16,7 @@ int insert_newline(t_list **alst) { t_token *token; + DG("insert newline"); token = token_init(); token->type = TK_NEWLINE; ft_lsteadd(alst, ft_lstnew(token, sizeof(*token))); diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index e75da56e..5c98209b 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -30,7 +30,6 @@ int handle_instruction(int fd) DG("START: state=%i", parser.state); while (1) { - DG("get input"); if ((ret = readline(fd, get_lexer_stack(lexer), &str))) { if (ret == -1) @@ -48,7 +47,7 @@ int handle_instruction(int fd) if (get_lexer_stack(lexer)) continue ; lexer.state = DEFAULT; -// token_print(token); + token_print(token); if (get_reserved_words(&token)) return (1); if (insert_newline(&token)) @@ -57,7 +56,9 @@ int handle_instruction(int fd) continue ; if (parser.state == SUCCESS) break ; - else if (parser.state == ERROR) + else if (parser.state == ERROR && !SH_IS_INTERACTIVE(data_singleton()->opts)) + return (error_syntax(&token)); + else if (parser.state == ERROR) error_syntax(&token); token = NULL; } diff --git a/42sh/src/parser/aggregate_sym.c b/42sh/src/parser/aggregate_sym.c index 788623aa..06546c3b 100644 --- a/42sh/src/parser/aggregate_sym.c +++ b/42sh/src/parser/aggregate_sym.c @@ -16,7 +16,9 @@ t_aggrematch g_aggrematch[] = { {TK_WORD, CMD_SUFFIX, CMD_SUFFIX, 0}, {TK_WORD, TK_PIPE, PATTERN, 0}, - {TK_WORD, WORDLIST, WORDLIST, 0}, + {TK_WORD, TK_IN, FOR_WORDLIST, TK_IN}, + {TK_WORD, FOR_WORDLIST, FOR_WORDLIST, FOR_WORDLIST}, + {TK_SEMI, FOR_WORDLIST, SEQUENTIAL_SEP, 0}, {TK_ASSIGNEMENT_WORD, CMD_PREFIX,CMD_PREFIX, 0}, {TK_PIPE, CMD_SUPERIOR, SIMPLE_COMMAND, CMD_SUPERIOR}, {TK_FI, ELSE_PART, IF_CLAUSE, TK_IF}, @@ -57,6 +59,8 @@ t_aggrematch g_aggrematch[] = {LINEBREAK, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST}, {LINEBREAK, COMPLETE_COMMANDS, PROGRAM, LINEBREAK}, {NEWLINE_LIST, CMD_NAME, CMD_SUPERIOR, CMD_NAME}, + {NEWLINE_LIST, SEQUENTIAL_SEP, SEQUENTIAL_SEP, SEQUENTIAL_SEP}, + {NEWLINE_LIST, TK_DO, TK_DO, TK_DO}, {NEWLINE_LIST, TK_DO, TK_DO, TK_DO}, {NEWLINE_LIST, TK_IN, TK_IN, TK_IN}, {NEWLINE_LIST, TK_THEN, TK_THEN, TK_THEN}, @@ -68,13 +72,13 @@ t_aggrematch g_aggrematch[] = {NEWLINE_LIST, NEWLINE_LIST, NEWLINE_LIST, NEWLINE}, {NEWLINE_LIST, NAME, SEQUENTIAL_SEP, 0}, {NEWLINE_LIST, IN, SEQUENTIAL_SEP, 0}, - {NEWLINE_LIST, WORDLIST, SEQUENTIAL_SEP, 0}, {NEWLINE_LIST, TERM, SEPARATOR, 0}, {NEWLINE_LIST, COMPOUND_LIST, SEPARATOR, 0}, {NEWLINE_LIST, COMPLETE_CONDITION, COMPLETE_CONDITION, COMPLETE_CONDITION}, {NEWLINE_LIST, CONDITION, CONDITION, CONDITION}, {NEWLINE_LIST, COMPLETE_COMMANDS, LINEBREAK, 0}, {NEWLINE_LIST, LINEBREAK, PROGRAM, LINEBREAK}, + {NEWLINE_LIST, FOR_WORDLIST, SEQUENTIAL_SEP, 0}, //to check {IO_HERE, TK_IO_NUMBER, IO_REDIRECT, TK_IO_NUMBER}, @@ -135,6 +139,7 @@ t_aggrematch g_aggrematch[] = {CMD_NAME, AND_OR_MAJOR, CMD_SUPERIOR, 0}, {SIMPLE_COMMAND, ALL, COMMAND, 0}, {DO_GROUP, NAME, FOR_CLAUSE, TK_FOR}, + {DO_GROUP, IN, 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}, diff --git a/42sh/src/parser/eval_sym.c b/42sh/src/parser/eval_sym.c index 8bbcb499..bfb3137c 100644 --- a/42sh/src/parser/eval_sym.c +++ b/42sh/src/parser/eval_sym.c @@ -19,6 +19,8 @@ t_stackmatch g_stackmatch[] = {TK_WORD, WORDLIST}, {TK_WORD, LINEBREAK}, {TK_WORD, COMPLETE_COMMANDS}, + {TK_WORD, TK_IN}, + {TK_WORD, FOR_WORDLIST}, {TK_ASSIGNEMENT_WORD, CMD_PREFIX}, {TK_IO_NUMBER, REDIRECT_LIST}, {TK_IO_NUMBER, CMD_SUFFIX}, @@ -226,13 +228,13 @@ t_stackmatch g_stackmatch[] = {TK_CASE, SEPARATOR_OP}, {TK_CASE, PIPE_SEMI_SEQUENCE}, {TK_IN, TK_WORD}, + {TK_IN, NAME}, {TK_ESAC, CASE_LIST}, {TK_ESAC, CASE_LIST_NS}, {TK_ESAC, LINEBREAK}, {TK_WHILE, LINEBREAK}, {TK_WHILE, COMPLETE_COMMANDS}, {TK_WHILE, TK_BANG}, - {TK_WHILE, TK_BANG}, {TK_WHILE, SEPARATOR_OP}, {TK_WHILE, NEWLINE_LIST}, {TK_WHILE, PIPE_SEMI_SEQUENCE}, @@ -264,10 +266,16 @@ t_stackmatch g_stackmatch[] = {TK_FOR, SEPARATOR_OP}, {TK_FOR, NEWLINE_LIST}, {TK_FOR, PIPE_SEMI_SEQUENCE}, + {TK_FOR, TK_DO}, + {TK_FOR, TK_WHILE}, + {TK_FOR, COMPOUND_LIST}, + {TK_FOR, TK_IF}, + {TK_FOR, TK_ELIF}, + {TK_FOR, TK_THEN}, + {TK_FOR, COMPLETE_CONDITION}, {TK_LBRACE, LINEBREAK}, {TK_LBRACE, COMPLETE_COMMANDS}, {TK_LBRACE, TK_BANG}, - {TK_LBRACE, TK_BANG}, {TK_LBRACE, SEPARATOR_OP}, {TK_LBRACE, NEWLINE_LIST}, {TK_LBRACE, PIPE_SEMI_SEQUENCE}, @@ -285,6 +293,7 @@ t_stackmatch g_stackmatch[] = {TK_SEMI, TERM}, {TK_SEMI, CMD_NAME}, {TK_SEMI, PROGRAM}, + {TK_SEMI, FOR_WORDLIST}, {TK_AMP, LIST}, {TK_AMP, TERM}, {TK_PIPE, PATTERN}, @@ -345,6 +354,8 @@ t_stackmatch g_stackmatch[] = {LINEBREAK, COMPOUND_LIST}, {LINEBREAK, PROGRAM}, {NEWLINE_LIST, TK_DO}, + {NEWLINE_LIST, SEQUENTIAL_SEP}, + {NEWLINE_LIST, FOR_WORDLIST}, {NEWLINE_LIST, TK_IN}, {NEWLINE_LIST, TK_WHILE}, {NEWLINE_LIST, TK_UNTIL}, @@ -536,7 +547,6 @@ t_stackmatch g_stackmatch[] = {WHILE_CLAUSE, LINEBREAK}, {WHILE_CLAUSE, COMPLETE_COMMANDS}, {WHILE_CLAUSE, TK_BANG}, - {WHILE_CLAUSE, TK_BANG}, {WHILE_CLAUSE, SEPARATOR_OP}, {WHILE_CLAUSE, NEWLINE_LIST}, {WHILE_CLAUSE, PIPE_SEMI_SEQUENCE}, @@ -554,7 +564,6 @@ t_stackmatch g_stackmatch[] = {IF_CLAUSE, LINEBREAK}, {IF_CLAUSE, COMPLETE_COMMANDS}, {IF_CLAUSE, TK_BANG}, - {IF_CLAUSE, TK_BANG}, {IF_CLAUSE, SEPARATOR_OP}, {IF_CLAUSE, NEWLINE_LIST}, {IF_CLAUSE, PIPE_SEMI_SEQUENCE}, @@ -589,6 +598,7 @@ t_stackmatch g_stackmatch[] = {WORDLIST, IN}, {IN, LINEBREAK}, {NAME, TK_FOR}, + {FOR_WORDLIST, NAME}, {FOR_CLAUSE, LINEBREAK}, {FOR_CLAUSE, COMPLETE_COMMANDS}, {FOR_CLAUSE, TK_BANG}, @@ -596,6 +606,15 @@ t_stackmatch g_stackmatch[] = {FOR_CLAUSE, SEPARATOR_OP}, {FOR_CLAUSE, NEWLINE_LIST}, {FOR_CLAUSE, PIPE_SEMI_SEQUENCE}, + {FOR_CLAUSE, TK_DO}, + {FOR_CLAUSE, TK_WHILE}, + {FOR_CLAUSE, TK_UNTIL}, + {FOR_CLAUSE, TK_IF}, + {FOR_CLAUSE, TK_ELIF}, + {FOR_CLAUSE, TK_THEN}, + {FOR_CLAUSE, TK_ELSE}, + {FOR_CLAUSE, COMPOUND_LIST}, + {FOR_CLAUSE, COMPLETE_CONDITION}, {TERM, LINEBREAK}, {TERM, COMPLETE_COMMANDS}, {COMPOUND_LIST, TK_DO}, diff --git a/42sh/src/parser/produce_sym.c b/42sh/src/parser/produce_sym.c index 9722088f..75d3329a 100644 --- a/42sh/src/parser/produce_sym.c +++ b/42sh/src/parser/produce_sym.c @@ -43,7 +43,6 @@ t_prodmatch g_prodmatch[] = {TK_WORD, TK_BANG, CMD_NAME}, {TK_WORD, PIPE_SEMI_SEQUENCE, CMD_NAME}, {TK_WORD, SEPARATOR_OP, CMD_NAME}, - {TK_WORD, TK_IN, PATTERN}, {TK_WORD, CASE_LIST, PATTERN}, {TK_WORD, TK_PAREN_OPEN, PATTERN}, {TK_WORD, COMPLETE_COMMANDS, CMD_NAME}, @@ -73,6 +72,9 @@ t_prodmatch g_prodmatch[] = {TK_NEWLINE, COMPOUND_LIST, NEWLINE_LIST}, {TK_NEWLINE, COMPLETE_CONDITION, NEWLINE_LIST}, {TK_NEWLINE, CONDITION, NEWLINE_LIST}, + {TK_NEWLINE, FOR_WORDLIST, NEWLINE_LIST}, + {TK_NEWLINE, SEQUENTIAL_SEP, NEWLINE_LIST}, + {TK_SEMI, CMD_SUPERIOR, SEPARATOR_OP}, {TK_SEMI, CMD_SUPERIOR, SEPARATOR_OP}, {TK_SEMI, TERM, SEPARATOR_OP}, {TK_SEMI, LIST, SEPARATOR_OP}, diff --git a/42sh/src/parser/read_stack.c b/42sh/src/parser/read_stack.c index 2806b159..35b9399e 100644 --- a/42sh/src/parser/read_stack.c +++ b/42sh/src/parser/read_stack.c @@ -14,6 +14,16 @@ char *read_state(t_sym current) { + if (current == FOR_WORDLIST) + return ("FOR_WORDLIST"); + if (current == FOR_CLAUSE) + return ("FOR_CLAUSE"); + if (current == TK_NAME) + return ("TK_NAME"); + if (current == TK_FOR) + return ("FOR"); + if (current == NAME) + return ("NAME"); if (current == 0) return ("NULL"); if (current == PATTERN)