aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-06-18 11:29:56 +0200
committerCharles <sircharlesaze@gmail.com>2020-06-18 11:29:56 +0200
commit3b21eea3ff3c803aa6f07c3a5bd048795c586b46 (patch)
tree79c35af8a6572bc4c76ad75a77091767964d6043
parentf4a8ff23a590dad1b43a2e92df5c5c6b8951976a (diff)
downloadminishell-3b21eea3ff3c803aa6f07c3a5bd048795c586b46.tar.gz
minishell-3b21eea3ff3c803aa6f07c3a5bd048795c586b46.tar.bz2
minishell-3b21eea3ff3c803aa6f07c3a5bd048795c586b46.zip
Fixing parse_expr and parse_op to work with parenthesis
-rw-r--r--src/main.c20
-rwxr-xr-xsrc/parse/parse.c24
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 <cacharle@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <nahaddac@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}
-// <cmd> ::= ...
-// <op> ::= <cmd> <sep> <op> | <op>
+// <cmd> ::= (<string> | <redir>)+
+// <op> ::= <expr> <sep> <op> | <expr>
+// <expr> ::= '(' <op> ')' | <cmd>
+
+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);
}