From 5590af97a476e963de9ab327c72853420398622f Mon Sep 17 00:00:00 2001 From: Antoine Riard Date: Thu, 9 Mar 2017 16:06:55 +0100 Subject: [PATCH] correction grammar + bug func declaration + error syntax better --- 42sh/includes/types.h | 4 +++- 42sh/sample/func/func01.sh | 2 +- 42sh/src/main/main.c | 6 ++++-- 42sh/src/parser/add_cmd.c | 4 ++-- 42sh/src/parser/aggregate_sym.c | 5 ++++- 42sh/src/parser/error_syntax.c | 18 +++++++++--------- 42sh/src/parser/eval_sym.c | 28 +++++++++++++++++++++++++++- 42sh/src/parser/read_stack.c | 6 +++++- 8 files changed, 55 insertions(+), 18 deletions(-) diff --git a/42sh/includes/types.h b/42sh/includes/types.h index bb719de7..f7543b97 100644 --- a/42sh/includes/types.h +++ b/42sh/includes/types.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 17:11:48 by jhalford #+# #+# */ -/* Updated: 2017/03/09 14:34:12 by jhalford ### ########.fr */ +/* Updated: 2017/03/09 15:16:47 by ariard ### ########.fr */ /* Updated: 2017/03/07 18:35:11 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -186,6 +186,8 @@ enum e_sym FOR_WORDLIST, PATTERN_CASE, FUNC_NAME, + OPEN_FUNC, + CLOSE_FUNC, CLOSE_LIST, MATH, MATH_PLUS, diff --git a/42sh/sample/func/func01.sh b/42sh/sample/func/func01.sh index b60f425b..4bb930ef 100644 --- a/42sh/sample/func/func01.sh +++ b/42sh/sample/func/func01.sh @@ -1,3 +1,3 @@ -hello () ( +hello() ( echo HELLO ) diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index 737c63d0..f70022c2 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/06 18:40:58 by jhalford #+# #+# */ -/* Updated: 2017/03/09 14:28:51 by jhalford ### ########.fr */ +/* Updated: 2017/03/09 16:03:50 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,6 +28,7 @@ int handle_instruction(int fd) ast = NULL; while (1) { + if ((ret = readline(fd, get_lexer_stack(lexer) || parser.state == UNDEFINED || lexer.state == HEREDOC, &str))) { @@ -69,7 +70,7 @@ int handle_instruction(int fd) error_syntax(&token, &parser, &ast); } DG("Before execution:"); -// btree_print(STDBUG, ast, &ft_putast); + btree_print(STDBUG, ast, &ft_putast); if (ft_exec(&ast)) return (1); instruction_free(&token, &parser, &ast); @@ -122,6 +123,7 @@ int main(int ac, char **av) SH_HAS_JOBC(data_singleton()->opts)?"ON":"OFF", fd); while (handle_instruction(fd) == 0) { + DG(); // lexer_clean; // parser_clean; ; diff --git a/42sh/src/parser/add_cmd.c b/42sh/src/parser/add_cmd.c index f7c8f491..64e1931d 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/03/08 16:19:23 by ariard ### ########.fr */ +/* Updated: 2017/03/09 16:04:46 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -71,7 +71,7 @@ int add_cmd(t_btree **ast, t_list **lst) int i; i = -1; - while (++i < 14) + while (++i < 17) if (g_distrostree[i].test(ast, lst) == 1) { DG("add : %d", i); diff --git a/42sh/src/parser/aggregate_sym.c b/42sh/src/parser/aggregate_sym.c index 3d4add4a..15cb05c2 100644 --- a/42sh/src/parser/aggregate_sym.c +++ b/42sh/src/parser/aggregate_sym.c @@ -23,8 +23,8 @@ t_aggrematch g_aggrematch[] = {TK_DSEMI, PIPE_SEMI_SEQUENCE, PIPE_SEQUENCE, PIPE_SEMI_SEQUENCE}, {TK_PAREN_OPEN, TK_IN, PATTERN_CASE, 0}, {TK_PAREN_OPEN, CASE_LIST_NS, PATTERN_CASE, 0}, - {TK_PAREN_OPEN, CMD_SUPERIOR, FUNC_NAME, CMD_SUPERIOR}, {TK_PAREN_OPEN, TK_PAREN_OPEN, MATH, TK_PAREN_OPEN}, + {TK_PAREN_OPEN, CMD_SUPERIOR, OPEN_FUNC, 0}, {TK_ASSIGNEMENT_WORD, CMD_PREFIX,CMD_PREFIX, 0}, {TK_PIPE, CMD_SUPERIOR, SEQUENCE, CMD_SUPERIOR}, {TK_PIPE, PIPE_SEMI_SEQUENCE, SEQUENCE, PIPE_SEMI_SEQUENCE}, @@ -45,6 +45,8 @@ t_aggrematch g_aggrematch[] = {TK_PAREN_CLOSE, COMPOUND_LIST, SUBSHELL, TK_PAREN_OPEN}, {TK_PAREN_CLOSE, CMD_SUPERIOR, SUBSHELL, TK_PAREN_OPEN}, {TK_PAREN_CLOSE, PIPE_SEMI_SEQUENCE, SUBSHELL, TK_PAREN_OPEN}, + {TK_PAREN_CLOSE, OPEN_FUNC, CLOSE_FUNC, OPEN_FUNC}, + {CLOSE_FUNC, CMD_SUPERIOR, FUNC_NAME, CMD_SUPERIOR}, {TK_RBRACE, COMPOUND_LIST, BRACE_CLAUSE, TK_LBRACE}, {TK_RBRACE, CMD_SUPERIOR, BRACE_CLAUSE, TK_LBRACE}, {TK_RBRACE, PIPE_SEMI_SEQUENCE, BRACE_CLAUSE, TK_LBRACE}, @@ -206,6 +208,7 @@ t_aggrematch g_aggrematch[] = {CLOSE_LIST, FUNC_NAME, FUNCTION_DEFINITION, FUNC_NAME}, {SUBSHELL, ALL, COMPOUND_COMMAND, 0}, {BRACE_CLAUSE, ALL, COMPOUND_COMMAND, 0}, + {COMPOUND_COMMAND, FUNC_NAME, COMMAND, FUNC_NAME}, {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}, diff --git a/42sh/src/parser/error_syntax.c b/42sh/src/parser/error_syntax.c index e3ebe5e4..b642dc2e 100644 --- a/42sh/src/parser/error_syntax.c +++ b/42sh/src/parser/error_syntax.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/09 20:15:35 by ariard #+# #+# */ -/* Updated: 2017/03/06 18:07:06 by ariard ### ########.fr */ +/* Updated: 2017/03/09 15:44:56 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -57,26 +57,26 @@ int error_syntax(t_list **lst, t_parser *parser, { t_token *token; int i; - int temp; - + token = (*lst)->content; i = 0; - temp = 0; + while (g_errormatch[i].token) { if (g_errormatch[i].token == token->type) { ft_putstr_fd("syntax error near unexpected token `", 2); ft_putstr_fd(g_errormatch[i].error, 2); - ft_putstr_fd("'\n", 2); - temp = 1; - break ; + ft_putstr_fd("'\n", 2); + instruction_free(lst, parser, ast); + return (0); } i++; } + ft_putstr_fd("syntax error near unexpected token`", 2); + ft_putstr_fd(token->data, 2); + ft_putstr_fd("'\n", 2); instruction_free(lst, parser, ast); - if (temp == 0) - ft_putstr_fd("grammar error, notify ariard", 2); return (0); } diff --git a/42sh/src/parser/eval_sym.c b/42sh/src/parser/eval_sym.c index 9d90a741..16af3095 100644 --- a/42sh/src/parser/eval_sym.c +++ b/42sh/src/parser/eval_sym.c @@ -214,6 +214,7 @@ t_stackmatch g_stackmatch[] = {TK_IF, SEQUENCE}, // watch ! {TK_IF, TK_WHILE}, + {TK_IF, FUNC_NAME}, {TK_IF, TK_UNTIL}, {TK_IF, TK_IF}, {TK_IF, TK_DO}, @@ -255,6 +256,7 @@ t_stackmatch g_stackmatch[] = {TK_CASE, TK_THEN}, {TK_CASE, TK_PAREN_CLOSE}, {TK_CASE, TK_WHILE}, + {TK_CASE, FUNC_NAME}, {TK_CASE, TK_UNTIL}, {TK_CASE, TK_IF}, {TK_CASE, TK_ELIF}, @@ -285,6 +287,7 @@ t_stackmatch g_stackmatch[] = {TK_WHILE, TK_DO}, {TK_WHILE, TK_PAREN_CLOSE}, {TK_WHILE, TK_WHILE}, + {TK_WHILE, FUNC_NAME}, {TK_WHILE, COMPOUND_LIST}, {TK_WHILE, CASE_LIST_NS}, {TK_WHILE, TK_IF}, @@ -306,6 +309,7 @@ t_stackmatch g_stackmatch[] = {TK_UNTIL, TK_DO}, {TK_UNTIL, TK_PAREN_CLOSE}, {TK_UNTIL, TK_WHILE}, + {TK_UNTIL, FUNC_NAME}, {TK_UNTIL, COMPOUND_LIST}, {TK_UNTIL, CASE_LIST_NS}, {TK_UNTIL, TK_IF}, @@ -328,6 +332,7 @@ t_stackmatch g_stackmatch[] = {TK_FOR, TK_DO}, {TK_FOR, TK_PAREN_CLOSE}, {TK_FOR, TK_WHILE}, + {TK_FOR, FUNC_NAME}, {TK_FOR, COMPOUND_LIST}, {TK_FOR, CASE_LIST_NS}, {TK_FOR, TK_IF}, @@ -347,6 +352,7 @@ t_stackmatch g_stackmatch[] = // watch ! {TK_LBRACE, AND_OR_MAJOR}, {TK_LBRACE, TK_WHILE}, + {TK_LBRACE, FUNC_NAME}, {TK_LBRACE, TK_UNTIL}, {TK_LBRACE, TK_DO}, {TK_LBRACE, TK_PAREN_CLOSE}, @@ -408,9 +414,11 @@ t_stackmatch g_stackmatch[] = {TK_PAREN_OPEN, SEPARATOR_OP}, {TK_PAREN_OPEN, NEWLINE_LIST}, {TK_PAREN_OPEN, SEQUENCE}, + {TK_PAREN_OPEN, FUNC_NAME}, // watch ! {TK_PAREN_OPEN, AND_OR_MAJOR}, {TK_PAREN_OPEN, TK_WHILE}, + {TK_PAREN_OPEN, FUNC_NAME}, {TK_PAREN_OPEN, TK_UNTIL}, {TK_PAREN_OPEN, TK_DO}, {TK_PAREN_OPEN, TK_PAREN_CLOSE}, @@ -423,6 +431,7 @@ t_stackmatch g_stackmatch[] = {TK_PAREN_OPEN, COMPLETE_CONDITION}, {TK_PAREN_OPEN, TK_IN}, {TK_PAREN_OPEN, CMD_SUPERIOR}, + {OPEN_FUNC, CMD_SUPERIOR}, {SEQUENTIAL_SEP, NAME}, {SEQUENTIAL_SEP, IN}, {SEQUENTIAL_SEP, WORDLIST}, @@ -431,7 +440,7 @@ t_stackmatch g_stackmatch[] = {END_COMMAND, PIPE_SEMI_SEQUENCE}, {END_COMMAND, AND_OR_MAJOR}, {END_COMMAND, TK_WHILE}, - {END_COMMAND, TK_WHILE}, + {END_COMMAND, FUNC_NAME}, {END_COMMAND, TK_UNTIL}, {END_COMMAND, TK_DO}, {END_COMMAND, TK_PAREN_CLOSE}, @@ -500,6 +509,7 @@ t_stackmatch g_stackmatch[] = {TK_PAREN_CLOSE, PATTERN}, {TK_PAREN_CLOSE, COMPOUND_LIST}, {TK_PAREN_CLOSE, FUNC_NAME}, + {TK_PAREN_CLOSE, OPEN_FUNC}, {TK_RBRACE, MATH}, {TK_RBRACE, MATH_PLUS}, {TK_RBRACE, TK_SEMI}, @@ -530,6 +540,7 @@ t_stackmatch g_stackmatch[] = {NEWLINE_LIST, FOR_WORDLIST}, {NEWLINE_LIST, TK_IN}, {NEWLINE_LIST, TK_WHILE}, + {NEWLINE_LIST, FUNC_NAME}, {NEWLINE_LIST, TK_UNTIL}, {NEWLINE_LIST, TK_IF}, {NEWLINE_LIST, TK_ELIF}, @@ -635,6 +646,7 @@ t_stackmatch g_stackmatch[] = // watch ! {CMD_NAME, AND_OR_MAJOR}, {CMD_NAME, TK_WHILE}, + {CMD_NAME, FUNC_NAME}, {CMD_NAME, TK_UNTIL}, {CMD_NAME, TK_DO}, {CMD_NAME, TK_PAREN_CLOSE}, @@ -647,6 +659,7 @@ t_stackmatch g_stackmatch[] = {CMD_NAME, COMPLETE_CONDITION}, {CMD_SUPERIOR, TK_WHILE}, + {CMD_SUPERIOR, FUNC_NAME}, {CMD_SUPERIOR, TK_UNTIL}, {CMD_SUPERIOR, TK_DO}, {CMD_SUPERIOR, TK_PAREN_CLOSE}, @@ -669,6 +682,8 @@ t_stackmatch g_stackmatch[] = // watch ! {CMD_SUPERIOR, AND_OR_MAJOR}, + {CLOSE_FUNC, CMD_SUPERIOR}, + {CLOSE_FUNC, OPEN_FUNC}, {MATH, LINEBREAK}, {MATH, NEWLINE_LIST}, {MATH, SEPARATOR}, @@ -708,6 +723,7 @@ t_stackmatch g_stackmatch[] = {DO_GROUP, NAME}, {DO_GROUP, SEQUENTIAL_SEP}, {LOOP, TK_WHILE}, + {LOOP, FUNC_NAME}, {LOOP, TK_UNTIL}, {CONDITION, LINEBREAK}, {CONDITION, TK_PAREN_OPEN}, @@ -761,6 +777,7 @@ t_stackmatch g_stackmatch[] = {UNTIL_CLAUSE, TK_DO}, {UNTIL_CLAUSE, TK_PAREN_CLOSE}, {UNTIL_CLAUSE, TK_WHILE}, + {UNTIL_CLAUSE, FUNC_NAME}, {UNTIL_CLAUSE, TK_UNTIL}, {UNTIL_CLAUSE, TK_IF}, {UNTIL_CLAUSE, TK_ELIF}, @@ -780,6 +797,7 @@ t_stackmatch g_stackmatch[] = {WHILE_CLAUSE, TK_DO}, {WHILE_CLAUSE, TK_PAREN_CLOSE}, {WHILE_CLAUSE, TK_WHILE}, + {WHILE_CLAUSE, FUNC_NAME}, {WHILE_CLAUSE, TK_UNTIL}, {WHILE_CLAUSE, TK_IF}, {WHILE_CLAUSE, TK_ELIF}, @@ -804,6 +822,7 @@ t_stackmatch g_stackmatch[] = {IF_CLAUSE, TK_DO}, {IF_CLAUSE, TK_PAREN_CLOSE}, {IF_CLAUSE, TK_WHILE}, + {IF_CLAUSE, FUNC_NAME}, {IF_CLAUSE, TK_UNTIL}, {IF_CLAUSE, TK_IF}, {IF_CLAUSE, TK_ELIF}, @@ -827,6 +846,7 @@ t_stackmatch g_stackmatch[] = {BRACE_CLAUSE, TK_DO}, {BRACE_CLAUSE, TK_PAREN_CLOSE}, {BRACE_CLAUSE, TK_WHILE}, + {BRACE_CLAUSE, FUNC_NAME}, {BRACE_CLAUSE, TK_UNTIL}, {BRACE_CLAUSE, TK_IF}, {BRACE_CLAUSE, TK_ELIF}, @@ -856,6 +876,7 @@ t_stackmatch g_stackmatch[] = {CASE_CLAUSE, CASE_LIST_NS}, {CASE_CLAUSE, TK_DO}, {CASE_CLAUSE, TK_WHILE}, + {CASE_CLAUSE, FUNC_NAME}, {CASE_CLAUSE, TK_UNTIL}, {CASE_CLAUSE, TK_IF}, {CASE_CLAUSE, TK_ELIF}, @@ -882,6 +903,7 @@ t_stackmatch g_stackmatch[] = {FOR_CLAUSE, TK_DO}, {FOR_CLAUSE, TK_PAREN_CLOSE}, {FOR_CLAUSE, TK_WHILE}, + {FOR_CLAUSE, FUNC_NAME}, {FOR_CLAUSE, TK_UNTIL}, {FOR_CLAUSE, TK_IF}, {FOR_CLAUSE, TK_ELIF}, @@ -895,6 +917,7 @@ t_stackmatch g_stackmatch[] = {COMPOUND_LIST, TK_PAREN_CLOSE}, {COMPOUND_LIST, TK_LBRACE}, {COMPOUND_LIST, TK_WHILE}, + {COMPOUND_LIST, FUNC_NAME}, {COMPOUND_LIST, TK_UNTIL}, {COMPOUND_LIST, TK_ELIF}, {COMPOUND_LIST, TK_ELSE}, @@ -917,6 +940,7 @@ t_stackmatch g_stackmatch[] = {SUBSHELL, TK_DO}, {SUBSHELL, TK_PAREN_CLOSE}, {SUBSHELL, TK_WHILE}, + {SUBSHELL, FUNC_NAME}, {SUBSHELL, TK_UNTIL}, {SUBSHELL, TK_IF}, {SUBSHELL, TK_ELIF}, @@ -939,6 +963,7 @@ t_stackmatch g_stackmatch[] = {COMPOUND_COMMAND, TK_DO}, {COMPOUND_COMMAND, TK_PAREN_CLOSE}, {COMPOUND_COMMAND, TK_WHILE}, + {COMPOUND_COMMAND, FUNC_NAME}, {COMPOUND_COMMAND, TK_UNTIL}, {COMPOUND_COMMAND, TK_IF}, {COMPOUND_COMMAND, TK_ELIF}, @@ -978,6 +1003,7 @@ t_stackmatch g_stackmatch[] = {AND_OR_MINOR, COMPLETE_COMMANDS}, {AND_OR_MINOR, AND_OR_MAJOR}, {PIPE_SEQUENCE, TK_WHILE}, + {PIPE_SEQUENCE, FUNC_NAME}, {PIPE_SEQUENCE, TK_UNTIL}, {PIPE_SEQUENCE, TK_DO}, {PIPE_SEQUENCE, TK_PAREN_CLOSE}, diff --git a/42sh/src/parser/read_stack.c b/42sh/src/parser/read_stack.c index 0e272f80..c25ebb3a 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/03/08 17:39:50 by ariard ### ########.fr */ +/* Updated: 2017/03/09 15:25:25 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,10 @@ char *read_state(t_sym current) { + if (current == OPEN_FUNC) + return ("OPEN_FUNC"); + if (current == CLOSE_FUNC) + return ("CLOSE_FUNC"); if (current == HEREDOCDATA) return ("HEREDOCDATA"); if (current == TERMINUS)