From 3b21eea3ff3c803aa6f07c3a5bd048795c586b46 Mon Sep 17 00:00:00 2001 From: Charles Date: Thu, 18 Jun 2020 11:29:56 +0200 Subject: Fixing parse_expr and parse_op to work with parenthesis --- src/main.c | 20 ++++++++++++++------ src/parse/parse.c | 24 ++++++++++++------------ 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/main.c b/src/main.c index 533c9a5..e3391bf 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/28 11:45:44 by cacharle #+# #+# */ -/* Updated: 2020/06/17 22:11:31 by charles ### ########.fr */ +/* Updated: 2020/06/18 11:26:02 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -48,23 +48,31 @@ void ast_print(int level, t_ast *ast) if (ast->tag == AST_CMD) { print_level(level); - printf("[ "); + printf("cmd: [ "); ft_lstiter(ast->cmd_argv, token_put); + printf(" ] redirs: ["); + ft_lstiter(ast->redirs, token_put); printf(" ]"); } else { + /* print_level(level); */ + /* printf("SEP: %d\n", ast->op.sep); */ print_level(level); - printf("SEP: %d\n", ast->op.sep); + printf("{\n"); print_level(level); - printf("left:\n"); + printf(" left:\n"); ast_print(level + 1, ast->op.left); printf("\n"); print_level(level); - printf("right:\n"); + printf(" right:\n"); ast_print(level + 1, ast->op.right); + + printf("\n"); + print_level(level); + printf("}\n"); } } @@ -82,7 +90,7 @@ int main(int argc, char **argv, char **envp) //printf("%s\n", argv[2]); t_ftlst *lex_out = lexer(ft_strdup(argv[2])); - ft_lstiter(lex_out, token_debug); + /* ft_lstiter(lex_out, token_debug); */ t_ret *parser_out = parse(lex_out); ast_print(0, parser_out->ast); diff --git a/src/parse/parse.c b/src/parse/parse.c index 7217fdb..f49f1f3 100755 --- a/src/parse/parse.c +++ b/src/parse/parse.c @@ -6,7 +6,7 @@ /* By: nahaddac +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/06/17 18:09:04 by nahaddac #+# #+# */ -/* Updated: 2020/06/17 23:00:29 by charles ### ########.fr */ +/* Updated: 2020/06/18 11:29:09 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -75,8 +75,11 @@ t_ret *parse_cmd(t_ftlst *input) return ret_wrap_ast(ast, input); } -// ::= ... -// ::= | +// ::= ( | )+ +// ::= | +// ::= '(' ')' | + +t_ret *parse_expr(t_ftlst *input); t_ret *parse_op(t_ftlst *input) { @@ -85,10 +88,10 @@ t_ret *parse_op(t_ftlst *input) t_ret *right_ret; enum e_token_tag sep_tag; - left_ret = parse_cmd(input); + left_ret = parse_expr(input); input = left_ret->rest; - if (input == NULL) //((t_token*)input->data)->tag & TAG_IS_SEP) + if (input == NULL || ((t_token*)input->data)->tag == TAG_PARENT_CLOSE) return ret_wrap_ast(left_ret->ast, input); sep_tag = ((t_token*)input->data)->tag; @@ -105,24 +108,21 @@ t_ret *parse_op(t_ftlst *input) t_ret *parse_expr(t_ftlst *input) { - t_ret *tmp; + t_ret *tmp; enum e_token_tag tag; - tag = input->data->tag; + tag = ((t_token*)input->data)->tag; if (tag == TAG_PARENT_OPEN) { - tmp = parse_expr(input->next); + tmp = parse_op(input->next); input = tmp->rest; - tag = input->data->tag; + tag = ((t_token*)input->data)->tag; if (tag != TAG_PARENT_CLOSE) return (NULL); input = input->next; tmp->rest = input; return tmp; } - tmp = parse_op(input); - if (tmp->unexpected != NULL) - return tmp; return parse_cmd(input); } -- cgit