diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index 88606518..e75da56e 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -48,7 +48,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,8 +57,9 @@ int handle_instruction(int fd) continue ; if (parser.state == SUCCESS) break ; - else if (parser.state == ERROR) - return (error_syntax(&token)); + else if (parser.state == ERROR) + error_syntax(&token); + token = NULL; } DG("succesful parsing:"); // btree_print(STDBUG, ast, &ft_putast); diff --git a/42sh/src/parser/aggregate_sym.c b/42sh/src/parser/aggregate_sym.c index b4beb401..788623aa 100644 --- a/42sh/src/parser/aggregate_sym.c +++ b/42sh/src/parser/aggregate_sym.c @@ -55,6 +55,7 @@ t_aggrematch g_aggrematch[] = {LINEBREAK, CMD_SUPERIOR, SEPARATOR_OP, 0}, {LINEBREAK, PIPE_SEMI_SEQUENCE, PIPE_SEQUENCE, PIPE_SEMI_SEQUENCE}, {LINEBREAK, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST}, + {LINEBREAK, COMPLETE_COMMANDS, PROGRAM, LINEBREAK}, {NEWLINE_LIST, CMD_NAME, CMD_SUPERIOR, CMD_NAME}, {NEWLINE_LIST, TK_DO, TK_DO, TK_DO}, {NEWLINE_LIST, TK_IN, TK_IN, TK_IN}, @@ -72,6 +73,8 @@ t_aggrematch g_aggrematch[] = {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}, //to check {IO_HERE, TK_IO_NUMBER, IO_REDIRECT, TK_IO_NUMBER}, @@ -96,6 +99,7 @@ t_aggrematch g_aggrematch[] = {IO_REDIRECT, CMD_WORD, CMD_SUFFIX, 0}, {IO_REDIRECT, CMD_PREFIX, CMD_PREFIX, CMD_PREFIX}, {IO_REDIRECT, LINEBREAK, CMD_PREFIX, 0}, + {IO_REDIRECT, COMPLETE_COMMANDS, CMD_PREFIX, 0}, {IO_REDIRECT, TK_BANG, CMD_PREFIX, 0}, {IO_REDIRECT, SEPARATOR_OP, CMD_PREFIX, 0}, {IO_REDIRECT, NEWLINE_LIST, CMD_PREFIX, 0}, @@ -105,6 +109,7 @@ t_aggrematch g_aggrematch[] = {CMD_SUFFIX, CMD_SUPERIOR, SIMPLE_COMMAND, CMD_SUPERIOR}, //to abstract {CMD_PREFIX, LINEBREAK, SIMPLE_COMMAND, 0}, + {CMD_PREFIX, COMPLETE_COMMANDS, SIMPLE_COMMAND, 0}, {CMD_PREFIX, TK_BANG, SIMPLE_COMMAND, 0}, {CMD_PREFIX, SEPARATOR_OP, SIMPLE_COMMAND, 0}, {CMD_PREFIX, NEWLINE_LIST, SIMPLE_COMMAND, 0}, @@ -112,6 +117,7 @@ t_aggrematch g_aggrematch[] = {CMD_WORD, CMD_PREFIX, SIMPLE_COMMAND, CMD_PREFIX}, //to check {CMD_NAME, LINEBREAK, CMD_SUPERIOR, 0}, + {CMD_NAME, COMPLETE_COMMANDS, CMD_SUPERIOR, 0}, {CMD_NAME, TK_BANG, CMD_SUPERIOR, 0}, {CMD_NAME, SEPARATOR_OP, CMD_SUPERIOR, 0}, {CMD_NAME, NEWLINE_LIST, CMD_SUPERIOR, 0}, @@ -161,6 +167,7 @@ t_aggrematch g_aggrematch[] = {COMPOUND_COMMAND, ALL, COMMAND, 0}, {AND_OR_MINOR, PIPE_SEMI_SEQUENCE, AND_OR_MAJOR, PIPE_SEMI_SEQUENCE}, {AND_OR_MINOR, LINEBREAK, AND_OR_MAJOR, 0}, + {AND_OR_MINOR, COMPLETE_COMMANDS, AND_OR_MAJOR, 0}, {AND_OR_MINOR, AND_OR_MAJOR, AND_OR_MAJOR, 0}, {COMMAND, PIPE_SEMI_SEQUENCE, PIPE_SEMI_SEQUENCE, PIPE_SEMI_SEQUENCE}, {COMMAND, COMPOUND_LIST, PIPE_SEMI_SEQUENCE, 0}, @@ -175,12 +182,18 @@ t_aggrematch g_aggrematch[] = {COMMAND, SEPARATOR_OP, PIPE_SEMI_SEQUENCE, 0}, {COMMAND, NEWLINE_LIST, PIPE_SEMI_SEQUENCE, 0}, {COMMAND, LINEBREAK, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, COMPLETE_COMMANDS, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, AND_OR_MAJOR, 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, AND_OR_MAJOR, LIST, AND_OR_MAJOR}, + {END_COMMAND, TK_WHILE, PIPE_SEQUENCE, 0}, {END_COMMAND, TK_WHILE, PIPE_SEQUENCE, 0}, {END_COMMAND, TK_UNTIL, PIPE_SEQUENCE, 0}, {END_COMMAND, LINEBREAK, PIPE_SEQUENCE, 0}, + {END_COMMAND, COMPLETE_COMMANDS, PIPE_SEQUENCE, 0}, + {END_COMMAND, TK_DO, PIPE_SEQUENCE, 0}, {END_COMMAND, TK_DO, PIPE_SEQUENCE, 0}, {END_COMMAND, TK_IF, PIPE_SEQUENCE, 0}, {END_COMMAND, TK_ELIF, PIPE_SEQUENCE, 0}, @@ -194,6 +207,7 @@ t_aggrematch g_aggrematch[] = {PIPE_SEQUENCE, SEPARATOR_OP, PIPELINE, 0}, {PIPE_SEQUENCE, NEWLINE_LIST, PIPELINE, 0}, {PIPE_SEQUENCE, LINEBREAK, PIPELINE, 0}, + {PIPE_SEQUENCE, COMPLETE_COMMANDS, PIPELINE, 0}, {PIPE_SEQUENCE, AND_OR_MAJOR, PIPELINE, 0}, {PIPE_SEQUENCE, TK_DO, PIPELINE, 0}, {PIPE_SEQUENCE, TK_IF, PIPELINE, 0}, @@ -211,6 +225,7 @@ t_aggrematch g_aggrematch[] = {PIPELINE, TK_ELSE, AND_OR, 0}, {PIPELINE, COMPOUND_LIST, AND_OR, 0}, {PIPELINE, LINEBREAK, AND_OR, 0}, + {PIPELINE, COMPLETE_COMMANDS, AND_OR, 0}, // {PIPELINE, LINEBREAK, AND_OR, AND_OR}, {PIPELINE, SEPARATOR_OP, AND_OR, 0}, {PIPELINE, COMPLETE_CONDITION, AND_OR, 0}, @@ -228,11 +243,14 @@ t_aggrematch g_aggrematch[] = {AND_OR, SEPARATOR_OP, LIST, LIST}, {AND_OR, NEWLINE_LIST, LIST, 0}, {AND_OR, LINEBREAK, LIST, 0}, + {AND_OR, COMPLETE_COMMANDS, LIST, 0}, {LIST, NEWLINE_LIST, COMPLETE_COMMAND, 0}, {LIST, LINEBREAK, COMPLETE_COMMAND, 0}, + {LIST, COMPLETE_COMMANDS, COMPLETE_COMMAND, 0}, {COMPLETE_COMMAND, NEWLINE_LIST, COMPLETE_COMMANDS, COMPLETE_COMMANDS}, {COMPLETE_COMMAND, LINEBREAK, COMPLETE_COMMANDS, 0}, - {COMPLETE_COMMANDS, LINEBREAK, PROGRAM, LINEBREAK}, + {COMPLETE_COMMAND, COMPLETE_COMMANDS, COMPLETE_COMMANDS, 0}, + {COMPLETE_COMMANDS, COMPLETE_COMMANDS, COMPLETE_COMMANDS, COMPLETE_COMMANDS}, {0, 0, 0, 0}, }; diff --git a/42sh/src/parser/error_syntax.c b/42sh/src/parser/error_syntax.c index ab5655ca..827807be 100644 --- a/42sh/src/parser/error_syntax.c +++ b/42sh/src/parser/error_syntax.c @@ -60,9 +60,9 @@ int error_syntax(t_list **lst) { if (g_errormatch[i].token == token->type) { - ft_putstr_fd("syntax error near unexpetcted token `", 2); + ft_putstr_fd("syntax error near unexpected token `", 2); ft_putstr_fd(g_errormatch[i].error, 2); - ft_putstr_fd("'", 2); + ft_putstr_fd("'\n", 2); return (1); } i++; diff --git a/42sh/src/parser/eval_sym.c b/42sh/src/parser/eval_sym.c index db4e1fcb..8bbcb499 100644 --- a/42sh/src/parser/eval_sym.c +++ b/42sh/src/parser/eval_sym.c @@ -18,6 +18,7 @@ t_stackmatch g_stackmatch[] = {TK_WORD, TK_CASE}, {TK_WORD, WORDLIST}, {TK_WORD, LINEBREAK}, + {TK_WORD, COMPLETE_COMMANDS}, {TK_ASSIGNEMENT_WORD, CMD_PREFIX}, {TK_IO_NUMBER, REDIRECT_LIST}, {TK_IO_NUMBER, CMD_SUFFIX}, @@ -25,6 +26,7 @@ t_stackmatch g_stackmatch[] = {TK_IO_NUMBER, CMD_NAME}, {TK_IO_NUMBER, CMD_WORD}, {TK_IO_NUMBER, LINEBREAK}, + {TK_IO_NUMBER, COMPLETE_COMMANDS}, {TK_IO_NUMBER, TK_BANG}, {TK_IO_NUMBER, SEPARATOR_OP}, {TK_IO_NUMBER, NEWLINE_LIST}, @@ -37,6 +39,7 @@ t_stackmatch g_stackmatch[] = {TK_OR_IF, CMD_SUPERIOR}, {TK_OR_IF, AND_OR}, {TK_DSEMI, LINEBREAK}, + {TK_DSEMI, COMPLETE_COMMANDS}, {TK_DSEMI, COMPOUND_LIST}, {TK_LESS, TK_IO_NUMBER}, {TK_LESS, REDIRECT_LIST}, @@ -45,6 +48,7 @@ t_stackmatch g_stackmatch[] = {TK_LESS, CMD_WORD}, {TK_LESS, CMD_NAME}, {TK_LESS, LINEBREAK}, + {TK_LESS, COMPLETE_COMMANDS}, {TK_LESS, TK_BANG}, {TK_LESS, SEPARATOR_OP}, {TK_LESS, NEWLINE_LIST}, @@ -58,6 +62,7 @@ t_stackmatch g_stackmatch[] = {TK_GREAT, CMD_WORD}, {TK_GREAT, CMD_NAME}, {TK_GREAT, LINEBREAK}, + {TK_GREAT, COMPLETE_COMMANDS}, {TK_GREAT, TK_BANG}, {TK_GREAT, SEPARATOR_OP}, {TK_GREAT, NEWLINE_LIST}, @@ -73,6 +78,7 @@ t_stackmatch g_stackmatch[] = {TK_DLESS, CMD_WORD}, {TK_DLESS, CMD_NAME}, {TK_DLESS, LINEBREAK}, + {TK_DLESS, COMPLETE_COMMANDS}, {TK_DLESS, TK_BANG}, {TK_DLESS, SEPARATOR_OP}, {TK_DLESS, NEWLINE_LIST}, @@ -87,6 +93,8 @@ t_stackmatch g_stackmatch[] = {TK_DLESSDASH, CMD_WORD}, {TK_DLESSDASH, CMD_NAME}, {TK_DLESSDASH, LINEBREAK}, + {TK_DLESSDASH, COMPLETE_COMMANDS}, + {TK_DLESSDASH, TK_BANG}, {TK_DLESSDASH, TK_BANG}, {TK_DLESSDASH, SEPARATOR_OP}, {TK_DLESSDASH, NEWLINE_LIST}, @@ -101,6 +109,8 @@ t_stackmatch g_stackmatch[] = {TK_DGREAT, CMD_WORD}, {TK_DGREAT, CMD_NAME}, {TK_DGREAT, LINEBREAK}, + {TK_DGREAT, COMPLETE_COMMANDS}, + {TK_DGREAT, TK_BANG}, {TK_DGREAT, TK_BANG}, {TK_DGREAT, SEPARATOR_OP}, {TK_DGREAT, NEWLINE_LIST}, @@ -115,6 +125,8 @@ t_stackmatch g_stackmatch[] = {TK_LESSAND, CMD_WORD}, {TK_LESSAND, CMD_NAME}, {TK_LESSAND, LINEBREAK}, + {TK_LESSAND, COMPLETE_COMMANDS}, + {TK_LESSAND, TK_BANG}, {TK_LESSAND, TK_BANG}, {TK_LESSAND, SEPARATOR_OP}, {TK_LESSAND, NEWLINE_LIST}, @@ -129,6 +141,8 @@ t_stackmatch g_stackmatch[] = {TK_GREATAND, CMD_WORD}, {TK_GREATAND, CMD_NAME}, {TK_GREATAND, LINEBREAK}, + {TK_GREATAND, COMPLETE_COMMANDS}, + {TK_LESSAND, TK_BANG}, {TK_GREATAND, TK_BANG}, {TK_GREATAND, SEPARATOR_OP}, {TK_GREATAND, NEWLINE_LIST}, @@ -143,6 +157,8 @@ t_stackmatch g_stackmatch[] = {TK_LESSGREAT, CMD_WORD}, {TK_LESSGREAT, CMD_NAME}, {TK_LESSGREAT, LINEBREAK}, + {TK_LESSGREAT, COMPLETE_COMMANDS}, + {TK_LESSGREAT, TK_BANG}, {TK_LESSGREAT, TK_BANG}, {TK_LESSGREAT, SEPARATOR_OP}, {TK_LESSGREAT, NEWLINE_LIST}, @@ -157,6 +173,8 @@ t_stackmatch g_stackmatch[] = {TK_CLOBBER, CMD_WORD}, {TK_CLOBBER, CMD_NAME}, {TK_CLOBBER, LINEBREAK}, + {TK_CLOBBER, COMPLETE_COMMANDS}, + {TK_CLOBBER, TK_BANG}, {TK_CLOBBER, TK_BANG}, {TK_CLOBBER, SEPARATOR_OP}, {TK_CLOBBER, NEWLINE_LIST}, @@ -165,6 +183,8 @@ t_stackmatch g_stackmatch[] = {TK_CLOBBER, AND_OR_MAJOR}, {TK_IF, LINEBREAK}, + {TK_IF, COMPLETE_COMMANDS}, + {TK_IF, TK_BANG}, {TK_IF, TK_BANG}, {TK_IF, SEPARATOR_OP}, {TK_IF, NEWLINE_LIST}, @@ -199,6 +219,8 @@ t_stackmatch g_stackmatch[] = {TK_DONE, COMPOUND_LIST}, {TK_DONE, END_COMMAND}, {TK_CASE, LINEBREAK}, + {TK_CASE, COMPLETE_COMMANDS}, + {TK_CASE, TK_BANG}, {TK_CASE, TK_BANG}, {TK_CASE, NEWLINE_LIST}, {TK_CASE, SEPARATOR_OP}, @@ -208,6 +230,8 @@ t_stackmatch g_stackmatch[] = {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}, @@ -220,6 +244,8 @@ t_stackmatch g_stackmatch[] = {TK_WHILE, TK_THEN}, {TK_WHILE, COMPLETE_CONDITION}, {TK_UNTIL, LINEBREAK}, + {TK_UNTIL, COMPLETE_COMMANDS}, + {TK_UNTIL, TK_BANG}, {TK_UNTIL, TK_BANG}, {TK_UNTIL, SEPARATOR_OP}, {TK_UNTIL, NEWLINE_LIST}, @@ -232,17 +258,23 @@ t_stackmatch g_stackmatch[] = {TK_UNTIL, TK_THEN}, {TK_UNTIL, COMPLETE_CONDITION}, {TK_FOR, LINEBREAK}, + {TK_FOR, COMPLETE_COMMANDS}, + {TK_FOR, TK_BANG}, {TK_FOR, TK_BANG}, {TK_FOR, SEPARATOR_OP}, {TK_FOR, NEWLINE_LIST}, {TK_FOR, PIPE_SEMI_SEQUENCE}, {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}, {TK_RBRACE, COMPOUND_LIST}, {TK_BANG, LINEBREAK}, + {TK_BANG, COMPLETE_COMMANDS}, + {TK_BANG, SEPARATOR_OP}, {TK_BANG, SEPARATOR_OP}, {TK_BANG, NEWLINE_LIST}, {TK_IN, LINEBREAK}, @@ -260,6 +292,8 @@ t_stackmatch g_stackmatch[] = {TK_PAREN_OPEN, FNAME}, {TK_PAREN_OPEN, CASE_LIST}, {TK_PAREN_OPEN, LINEBREAK}, + {TK_PAREN_OPEN, COMPLETE_COMMANDS}, + {TK_PAREN_OPEN, TK_BANG}, {TK_PAREN_OPEN, TK_BANG}, {TK_PAREN_OPEN, SEPARATOR_OP}, {TK_PAREN_OPEN, NEWLINE_LIST}, @@ -271,6 +305,8 @@ t_stackmatch g_stackmatch[] = {SEQUENTIAL_SEP, IN}, {SEQUENTIAL_SEP, WORDLIST}, {END_COMMAND, PIPE_SEMI_SEQUENCE}, + {END_COMMAND, AND_OR_MAJOR}, + {END_COMMAND, TK_WHILE}, {END_COMMAND, TK_WHILE}, {END_COMMAND, TK_UNTIL}, {END_COMMAND, TK_DO}, @@ -279,6 +315,8 @@ t_stackmatch g_stackmatch[] = {END_COMMAND, TK_ELIF}, {END_COMMAND, TK_ELSE}, {END_COMMAND, LINEBREAK}, + {END_COMMAND, COMPLETE_COMMANDS}, + {END_COMMAND, COMPOUND_LIST}, {END_COMMAND, COMPOUND_LIST}, {END_COMMAND, COMPLETE_CONDITION}, {SEPARATOR, CMD_SUPERIOR}, @@ -291,6 +329,8 @@ t_stackmatch g_stackmatch[] = {SEPARATOR_OP, COMPOUND_LIST}, {SEPARATOR_OP, PIPE_SEMI_SEQUENCE}, {LINEBREAK, TK_SEMI}, + {LINEBREAK, END_COMMAND}, + {LINEBREAK, SEPARATOR_OP}, {LINEBREAK, SEPARATOR_OP}, {LINEBREAK, TK_PAREN_CLOSE}, {LINEBREAK, WORD}, @@ -322,6 +362,8 @@ t_stackmatch g_stackmatch[] = {NEWLINE_LIST, COMPLETE_COMMANDS}, {NEWLINE_LIST, COMPLETE_CONDITION}, {NEWLINE_LIST, CONDITION}, + {NEWLINE_LIST, LINEBREAK}, + {HERE_END, TK_DLESS}, {HERE_END, TK_DLESS}, {HERE_END, TK_DLESSDASH}, {IO_HERE, TK_IO_NUMBER}, @@ -332,6 +374,8 @@ t_stackmatch g_stackmatch[] = {IO_HERE, CMD_WORD}, {IO_HERE, CMD_NAME}, {IO_HERE, LINEBREAK}, + {IO_HERE, COMPLETE_COMMANDS}, + {IO_HERE, TK_BANG}, {IO_HERE, TK_BANG}, {IO_HERE, SEPARATOR_OP}, {IO_HERE, NEWLINE_LIST}, @@ -351,6 +395,8 @@ t_stackmatch g_stackmatch[] = {IO_FILE, CMD_WORD}, {IO_FILE, CMD_NAME}, {IO_FILE, LINEBREAK}, + {IO_FILE, COMPLETE_COMMANDS}, + {IO_FILE, TK_BANG}, {IO_FILE, TK_BANG}, {IO_FILE, SEPARATOR_OP}, {IO_FILE, NEWLINE_LIST}, @@ -362,6 +408,8 @@ t_stackmatch g_stackmatch[] = {IO_REDIRECT, CMD_WORD}, {IO_REDIRECT, CMD_NAME}, {IO_REDIRECT, LINEBREAK}, + {IO_REDIRECT, COMPLETE_COMMANDS}, + {IO_REDIRECT, TK_BANG}, {IO_REDIRECT, TK_BANG}, {IO_REDIRECT, SEPARATOR_OP}, {IO_REDIRECT, NEWLINE_LIST}, @@ -371,13 +419,17 @@ t_stackmatch g_stackmatch[] = {CMD_SUFFIX, CMD_NAME}, {CMD_SUFFIX, CMD_SUPERIOR}, {CMD_PREFIX, LINEBREAK}, + {CMD_PREFIX, COMPLETE_COMMANDS}, + {CMD_PREFIX, TK_BANG}, {CMD_PREFIX, TK_BANG}, {CMD_PREFIX, SEPARATOR_OP}, {CMD_PREFIX, NEWLINE_LIST}, {CMD_PREFIX, PIPE_SEMI_SEQUENCE}, {CMD_WORD, CMD_PREFIX}, + {CMD_NAME, COMPLETE_COMMANDS}, {CMD_NAME, LINEBREAK}, {CMD_NAME, TK_BANG}, + {CMD_NAME, TK_BANG}, {CMD_NAME, SEPARATOR_OP}, {CMD_NAME, NEWLINE_LIST}, {CMD_NAME, PIPE_SEMI_SEQUENCE}, @@ -401,7 +453,9 @@ t_stackmatch g_stackmatch[] = {CMD_SUPERIOR, TK_ELSE}, {CMD_SUPERIOR, COMPOUND_LIST}, {CMD_SUPERIOR, COMPLETE_CONDITION}, - {CMD_SUPERIOR, LINEBREAK,}, + {CMD_SUPERIOR, LINEBREAK}, + {CMD_SUPERIOR, COMPLETE_COMMANDS}, + {CMD_SUPERIOR, TK_BANG}, {CMD_SUPERIOR, TK_BANG}, {CMD_SUPERIOR, SEPARATOR_OP}, {CMD_SUPERIOR, NEWLINE_LIST}, @@ -419,6 +473,8 @@ t_stackmatch g_stackmatch[] = {SIMPLE_COMMAND, COMPOUND_LIST}, {SIMPLE_COMMAND, COMPLETE_CONDITION}, {SIMPLE_COMMAND, LINEBREAK}, + {SIMPLE_COMMAND, COMPLETE_COMMANDS}, + {SIMPLE_COMMAND, TK_BANG}, {SIMPLE_COMMAND, TK_BANG}, {SIMPLE_COMMAND, SEPARATOR_OP}, {SIMPLE_COMMAND, NEWLINE_LIST}, @@ -431,27 +487,39 @@ t_stackmatch g_stackmatch[] = {LOOP, TK_WHILE}, {LOOP, TK_UNTIL}, {CONDITION, LINEBREAK}, + {CONDITION, COMPLETE_COMMANDS}, + {CONDITION, COMPOUND_LIST}, {CONDITION, COMPOUND_LIST}, {CONDITION, COMPLETE_CONDITION}, {COMPLETE_CONDITION, LINEBREAK}, + {COMPLETE_CONDITION, COMPLETE_COMMANDS}, + {COMPLETE_CONDITION, COMPLETE_CONDITION}, {COMPLETE_CONDITION, COMPLETE_CONDITION}, {BRACE_GROUP, LINEBREAK}, + {BRACE_GROUP, COMPLETE_COMMANDS}, + {BRACE_GROUP, TK_BANG}, {BRACE_GROUP, TK_BANG}, {BRACE_GROUP, SEPARATOR_OP}, {BRACE_GROUP, NEWLINE_LIST}, {BRACE_GROUP, PIPE_SEMI_SEQUENCE}, {FNAME, LINEBREAK}, + {FNAME, COMPLETE_COMMANDS}, + {FNAME, TK_BANG}, {FNAME, TK_BANG}, {FNAME, SEPARATOR_OP}, {FNAME, NEWLINE_LIST}, {FNAME, PIPE_SEMI_SEQUENCE}, {FUNCTION_BODY, FUNC}, {FUNCTION_DEFINITION, LINEBREAK}, + {FUNCTION_DEFINITION, COMPLETE_COMMANDS}, + {FUNCTION_DEFINITION, TK_BANG}, {FUNCTION_DEFINITION, TK_BANG}, {FUNCTION_DEFINITION, SEPARATOR_OP}, {FUNCTION_DEFINITION, NEWLINE_LIST}, {FUNCTION_DEFINITION, PIPE_SEMI_SEQUENCE}, {UNTIL_CLAUSE, LINEBREAK}, + {UNTIL_CLAUSE, COMPLETE_COMMANDS}, + {UNTIL_CLAUSE, TK_BANG}, {UNTIL_CLAUSE, TK_BANG}, {UNTIL_CLAUSE, SEPARATOR_OP}, {UNTIL_CLAUSE, NEWLINE_LIST}, @@ -466,6 +534,8 @@ t_stackmatch g_stackmatch[] = {UNTIL_CLAUSE, COMPOUND_LIST}, {UNTIL_CLAUSE, COMPLETE_CONDITION}, {WHILE_CLAUSE, LINEBREAK}, + {WHILE_CLAUSE, COMPLETE_COMMANDS}, + {WHILE_CLAUSE, TK_BANG}, {WHILE_CLAUSE, TK_BANG}, {WHILE_CLAUSE, SEPARATOR_OP}, {WHILE_CLAUSE, NEWLINE_LIST}, @@ -482,6 +552,8 @@ t_stackmatch g_stackmatch[] = // {ELSE_PART, COMPOUND_LIST}, // {ELSE_PART, COMPLETE_CONDITION}, {IF_CLAUSE, LINEBREAK}, + {IF_CLAUSE, COMPLETE_COMMANDS}, + {IF_CLAUSE, TK_BANG}, {IF_CLAUSE, TK_BANG}, {IF_CLAUSE, SEPARATOR_OP}, {IF_CLAUSE, NEWLINE_LIST}, @@ -508,6 +580,8 @@ t_stackmatch g_stackmatch[] = {CASE_LIST, LINEBREAK}, {CASE_LIST_NS, LINEBREAK}, {CASE_CLAUSE, LINEBREAK}, + {CASE_CLAUSE, COMPLETE_COMMANDS}, + {CASE_CLAUSE, TK_BANG}, {CASE_CLAUSE, TK_BANG}, {CASE_CLAUSE, SEPARATOR_OP}, {CASE_CLAUSE, NEWLINE_LIST}, @@ -516,11 +590,15 @@ t_stackmatch g_stackmatch[] = {IN, LINEBREAK}, {NAME, TK_FOR}, {FOR_CLAUSE, LINEBREAK}, + {FOR_CLAUSE, COMPLETE_COMMANDS}, + {FOR_CLAUSE, TK_BANG}, {FOR_CLAUSE, TK_BANG}, {FOR_CLAUSE, SEPARATOR_OP}, {FOR_CLAUSE, NEWLINE_LIST}, {FOR_CLAUSE, PIPE_SEMI_SEQUENCE}, {TERM, LINEBREAK}, + {TERM, COMPLETE_COMMANDS}, + {COMPOUND_LIST, TK_DO}, {COMPOUND_LIST, TK_DO}, {COMPOUND_LIST, TK_LBRACE}, {COMPOUND_LIST, TK_WHILE}, @@ -533,11 +611,15 @@ t_stackmatch g_stackmatch[] = {COMPOUND_LIST, COMPOUND_LIST}, {COMPOUND_LIST, COMPLETE_CONDITION}, {SUBSHELL, LINEBREAK}, + {SUBSHELL, COMPLETE_COMMANDS}, + {SUBSHELL, TK_BANG}, {SUBSHELL, TK_BANG}, {SUBSHELL, SEPARATOR_OP}, {SUBSHELL, NEWLINE_LIST}, {SUBSHELL, PIPE_SEMI_SEQUENCE}, {COMPOUND_COMMAND, LINEBREAK}, + {COMPOUND_COMMAND, COMPLETE_COMMANDS}, + {COMPOUND_COMMAND, TK_BANG}, {COMPOUND_COMMAND, TK_BANG}, {COMPOUND_COMMAND, SEPARATOR_OP}, {COMPOUND_COMMAND, NEWLINE_LIST}, @@ -555,6 +637,8 @@ t_stackmatch g_stackmatch[] = {COMMAND, TK_WHILE}, {COMMAND, TK_UNTIL}, {COMMAND, LINEBREAK}, + {COMMAND, COMPLETE_COMMANDS}, + {COMMAND, TK_DO}, {COMMAND, TK_DO}, {COMMAND, TK_IF}, {COMMAND, TK_ELIF}, @@ -569,6 +653,8 @@ t_stackmatch g_stackmatch[] = {COMMAND, AND_OR_MAJOR}, {AND_OR_MINOR, PIPE_SEMI_SEQUENCE}, {AND_OR_MINOR, LINEBREAK}, + {AND_OR_MINOR, COMPLETE_COMMANDS}, + {AND_OR_MINOR, AND_OR_MAJOR}, {AND_OR_MINOR, AND_OR_MAJOR}, {PIPE_SEQUENCE, TK_WHILE}, {PIPE_SEQUENCE, TK_UNTIL}, @@ -580,6 +666,8 @@ t_stackmatch g_stackmatch[] = {PIPE_SEQUENCE, COMPOUND_LIST}, {PIPE_SEQUENCE, COMPLETE_CONDITION}, {PIPE_SEQUENCE, LINEBREAK}, + {PIPE_SEQUENCE, COMPLETE_COMMANDS}, + {PIPE_SEQUENCE, TK_BANG}, {PIPE_SEQUENCE, TK_BANG}, {PIPE_SEQUENCE, SEPARATOR_OP}, {PIPE_SEQUENCE, NEWLINE_LIST}, @@ -594,6 +682,8 @@ t_stackmatch g_stackmatch[] = {PIPE_SEMI_SEQUENCE, COMPOUND_LIST}, {PIPE_SEMI_SEQUENCE, COMPLETE_CONDITION}, {PIPE_SEMI_SEQUENCE, LINEBREAK}, + {PIPE_SEMI_SEQUENCE, COMPLETE_COMMANDS}, + {PIPE_SEMI_SEQUENCE, TK_BANG}, {PIPE_SEMI_SEQUENCE, TK_BANG}, {PIPE_SEMI_SEQUENCE, SEPARATOR_OP}, {PIPE_SEMI_SEQUENCE, NEWLINE_LIST}, @@ -608,10 +698,14 @@ t_stackmatch g_stackmatch[] = {PIPELINE, COMPOUND_LIST}, {PIPELINE, COMPLETE_CONDITION}, {PIPELINE, LINEBREAK}, + {PIPELINE, COMPLETE_COMMANDS}, + {PIPELINE, SEPARATOR_OP}, {PIPELINE, SEPARATOR_OP}, {PIPELINE, NEWLINE_LIST}, {PIPELINE, AND_OR_MAJOR}, {AND_OR_MAJOR, LINEBREAK}, + {AND_OR_MAJOR, COMPLETE_COMMANDS}, + {AND_OR_MAJOR, AND_OR_MAJOR}, {AND_OR_MAJOR, AND_OR_MAJOR}, {AND_OR, TK_DO}, {AND_OR, TK_WHILE}, @@ -623,13 +717,18 @@ t_stackmatch g_stackmatch[] = {AND_OR, COMPOUND_LIST}, {AND_OR, COMPLETE_CONDITION}, {AND_OR, LINEBREAK}, + {AND_OR, COMPLETE_COMMANDS}, + {AND_OR, SEPARATOR_OP}, {AND_OR, SEPARATOR_OP}, {AND_OR, NEWLINE_LIST}, {LIST, LINEBREAK}, + {LIST, COMPLETE_COMMANDS}, {LIST, NEWLINE_LIST}, {COMPLETE_COMMAND, LINEBREAK}, + {COMPLETE_COMMAND, COMPLETE_COMMANDS}, {COMPLETE_COMMAND, NEWLINE_LIST}, {COMPLETE_COMMANDS, LINEBREAK}, + {COMPLETE_COMMANDS, COMPLETE_COMMANDS}, {0, 0}, }; diff --git a/42sh/src/parser/ft_parse.c b/42sh/src/parser/ft_parse.c index f54351ed..42f0b249 100644 --- a/42sh/src/parser/ft_parse.c +++ b/42sh/src/parser/ft_parse.c @@ -21,7 +21,8 @@ static void insert_linebreak(t_list **lst) static int end_instruction(t_sym sym) { - if (sym == CMD_SUPERIOR || sym == PIPE_SEMI_SEQUENCE) + if (sym == CMD_SUPERIOR || sym == PIPE_SEMI_SEQUENCE + || sym == COMPLETE_COMMANDS || sym == END_COMMAND) return (1); return (0); } @@ -29,6 +30,8 @@ static int end_instruction(t_sym sym) int ft_parse(t_btree **ast, t_list **token, t_parser *parser) { (void)ast; + if (parser->state == SUCCESS || parser->state == ERROR) + parser_init(parser); while (*token) { produce_sym(*parser->stack, parser->new_sym, token); @@ -49,7 +52,6 @@ int ft_parse(t_btree **ast, t_list **token, t_parser *parser) // build_tree(ast, token); // btree_print(STDBUG, *ast, &ft_putast); if ((end_instruction(*parser->stack) && !(*token)->next)) - /* || *parser->stack == PROGRAM) */ insert_linebreak(token); else ft_lst_delif(token, (*token)->content, &ft_addrcmp, &token_free); diff --git a/42sh/src/parser/produce_sym.c b/42sh/src/parser/produce_sym.c index 9164cb58..9722088f 100644 --- a/42sh/src/parser/produce_sym.c +++ b/42sh/src/parser/produce_sym.c @@ -46,6 +46,7 @@ t_prodmatch g_prodmatch[] = {TK_WORD, TK_IN, PATTERN}, {TK_WORD, CASE_LIST, PATTERN}, {TK_WORD, TK_PAREN_OPEN, PATTERN}, + {TK_WORD, COMPLETE_COMMANDS, CMD_NAME}, {TK_ASSIGNEMENT_WORD, LINEBREAK, CMD_PREFIX}, {TK_ASSIGNEMENT_WORD, TK_BANG, CMD_PREFIX}, {TK_ASSIGNEMENT_WORD, SEPARATOR_OP, CMD_PREFIX}, diff --git a/42sh/test.sh b/42sh/test.sh new file mode 100644 index 00000000..b113c751 --- /dev/null +++ b/42sh/test.sh @@ -0,0 +1,2 @@ +> > +ls | cat