From 6c8c3ea792262ce98754b5a572952659d013d13e Mon Sep 17 00:00:00 2001 From: AntoHesse Date: Tue, 7 Mar 2017 02:09:33 +0100 Subject: [PATCH] parsing math ok --- 42sh/Makefile | 1 + 42sh/includes/parser.h | 2 ++ 42sh/includes/types.h | 3 +++ 42sh/src/main/ft_putast.c | 2 ++ 42sh/src/parser/add_cmd.c | 2 ++ 42sh/src/parser/add_math.c | 39 +++++++++++++++++++++++++++++++++ 42sh/src/parser/aggregate_sym.c | 10 ++++++++- 42sh/src/parser/eval_sym.c | 20 +++++++++++++++++ 42sh/src/parser/produce_sym.c | 3 +++ 9 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 42sh/src/parser/add_math.c diff --git a/42sh/Makefile b/42sh/Makefile index 08954103..fe951535 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -240,6 +240,7 @@ parser/add_sep.c\ parser/add_subshell.c\ parser/add_var.c\ parser/add_number.c\ +parser/add_math.c\ parser/aggregate_sym.c\ parser/build_tree.c\ parser/error_syntax.c\ diff --git a/42sh/includes/parser.h b/42sh/includes/parser.h index 16e97a50..69bf088f 100644 --- a/42sh/includes/parser.h +++ b/42sh/includes/parser.h @@ -144,6 +144,8 @@ int isdir_word(t_btree **ast, t_list **list); int isvar(t_btree **ast, t_list **list); int isnull(t_btree **ast, t_list **list); int isionumber(t_btree **ast, t_list **lst); +int ismath(t_btree **ast, t_list **lst); +int ismath_expr(t_btree **ast, t_list **lst); int join_ast(t_btree **ast, t_btree **new_node); int gen_node(t_btree **ast); diff --git a/42sh/includes/types.h b/42sh/includes/types.h index ddeed664..2af27fa4 100644 --- a/42sh/includes/types.h +++ b/42sh/includes/types.h @@ -160,6 +160,9 @@ enum e_sym PATTERN_CASE, FUNC_NAME, CLOSE_LIST, + MATH, + MATH_PLUS, + MATH_SUP, REDIR, CMD, ALL = 200, diff --git a/42sh/src/main/ft_putast.c b/42sh/src/main/ft_putast.c index 955f3da4..405104b6 100644 --- a/42sh/src/main/ft_putast.c +++ b/42sh/src/main/ft_putast.c @@ -17,6 +17,8 @@ char *ft_putast(void *nodein) t_astnode *node; node = nodein; + if (node->type == MATH) + return ("MATH"); if (node->type == TK_DSEMI) return ("TK_DSEMI"); if (node->type == WORDLIST) diff --git a/42sh/src/parser/add_cmd.c b/42sh/src/parser/add_cmd.c index b86635e1..0518acf6 100644 --- a/42sh/src/parser/add_cmd.c +++ b/42sh/src/parser/add_cmd.c @@ -25,6 +25,8 @@ t_distrostree g_distrostree[] = {&iscase_pattern, &add_pattern}, {&iscase_branch, &add_branch}, {&iscase, &add_case_cmd}, + {&ismath, &add_null}, + {&ismath_expr, &add_pattern}, {&issubshell, &add_subshell_cmd}, {&isfunc_name, &add_null}, {&isfunc, &add_func_cmd}, diff --git a/42sh/src/parser/add_math.c b/42sh/src/parser/add_math.c new file mode 100644 index 00000000..78a3f414 --- /dev/null +++ b/42sh/src/parser/add_math.c @@ -0,0 +1,39 @@ +#include "parser.h" + +int ismath(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_token *token; + + node = NULL; + token = (*lst)->content; + if (*ast) + { + node = (*ast)->item; + if (node->type == SUBSHELL && token->type == SUBSHELL) + { + node->type = MATH; + return (1); + } + if (node->type == MATH && token->type == TK_PAREN_CLOSE) + return (1); + } + return (0); +} + + +int ismath_expr(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_token *token; + + node = NULL; + token = (*lst)->content; + if (*ast) + { + node = (*ast)->item; + if (node->type == MATH && token->type == TK_WORD) + return (1); + } + return (0); +} diff --git a/42sh/src/parser/aggregate_sym.c b/42sh/src/parser/aggregate_sym.c index cb2617fb..25d6f683 100644 --- a/42sh/src/parser/aggregate_sym.c +++ b/42sh/src/parser/aggregate_sym.c @@ -17,12 +17,14 @@ t_aggrematch g_aggrematch[] = {TK_WORD, TK_PIPE, PATTERN, 0}, {TK_WORD, TK_IN, FOR_WORDLIST, TK_IN}, {TK_WORD, FOR_WORDLIST, FOR_WORDLIST, FOR_WORDLIST}, + {TK_WORD, MATH, MATH, MATH}, {TK_SEMI, FOR_WORDLIST, SEQUENTIAL_SEP, 0}, {TK_DSEMI, CMD_SUPERIOR, PIPE_SEQUENCE, CMD_SUPERIOR}, {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_ASSIGNEMENT_WORD, CMD_PREFIX,CMD_PREFIX, 0}, {TK_PIPE, CMD_SUPERIOR, SEQUENCE, CMD_SUPERIOR}, {TK_PIPE, PIPE_SEMI_SEQUENCE, SEQUENCE, PIPE_SEMI_SEQUENCE}, @@ -38,7 +40,9 @@ t_aggrematch g_aggrematch[] = {TK_ESAC, TK_IN, CASE_CLAUSE, TK_CASE}, {TK_ESAC, CASE_LIST_NS, CASE_CLAUSE, TK_CASE}, {TK_RBRACE, COMPOUND_LIST, BRACE_GROUP, TK_LBRACE}, - {TK_PAREN_CLOSE, COMPOUND_LIST, SUBSHELL, TK_PAREN_OPEN}, + {TK_PAREN_CLOSE, MATH, MATH_PLUS, MATH}, + {TK_PAREN_CLOSE, MATH_PLUS, MATH_SUP, MATH_PLUS}, + {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}, @@ -48,14 +52,17 @@ t_aggrematch g_aggrematch[] = {TK_AND_IF, CMD_SUPERIOR, AND_OR_MINOR, CMD_SUPERIOR}, {TK_OR_IF, CMD_SUPERIOR, AND_OR_MINOR, CMD_SUPERIOR}, //watch this + {SEPARATOR_OP, MATH_SUP, CMD_SUPERIOR, MATH_SUP}, {SEPARATOR_OP, CMD_SUPERIOR, SEPARATOR, 0}, {SEPARATOR_OP, COMPOUND_LIST, SEPARATOR, 0}, {SEPARATOR_OP, CASE_LIST_NS, SEPARATOR, 0}, {SEPARATOR_OP, PIPE_SEMI_SEQUENCE, SEPARATOR, 0}, + {SEPARATOR, MATH_SUP, CMD_SUPERIOR, MATH_SUP}, {SEPARATOR, CMD_SUPERIOR, END_COMMAND, CMD_SUPERIOR}, {SEPARATOR, CASE_LIST_NS, CASE_LIST_NS, CASE_LIST_NS}, {SEPARATOR, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST}, {SEPARATOR, PIPE_SEMI_SEQUENCE, PIPE_SEQUENCE, PIPE_SEMI_SEQUENCE}, + {LINEBREAK, MATH_SUP, CMD_SUPERIOR, MATH_SUP}, {LINEBREAK, SEPARATOR_OP, SEPARATOR, SEPARATOR_OP}, {LINEBREAK, TK_SEMI, SEQUENTIAL_SEP, TK_SEMI}, @@ -67,6 +74,7 @@ t_aggrematch g_aggrematch[] = {LINEBREAK, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST}, {LINEBREAK, CASE_LIST_NS, CASE_LIST_NS, CASE_LIST_NS}, {LINEBREAK, COMPLETE_COMMANDS, PROGRAM, LINEBREAK}, + {NEWLINE_LIST, MATH_SUP, CMD_SUPERIOR, MATH_SUP}, {NEWLINE_LIST, CMD_NAME, CMD_SUPERIOR, CMD_NAME}, {NEWLINE_LIST, SEQUENTIAL_SEP, SEQUENTIAL_SEP, SEQUENTIAL_SEP}, {NEWLINE_LIST, TK_DO, TK_DO, TK_DO}, diff --git a/42sh/src/parser/eval_sym.c b/42sh/src/parser/eval_sym.c index f17ae9c4..d9a3de5c 100644 --- a/42sh/src/parser/eval_sym.c +++ b/42sh/src/parser/eval_sym.c @@ -23,6 +23,7 @@ t_stackmatch g_stackmatch[] = {TK_WORD, COMPLETE_COMMANDS}, {TK_WORD, TK_IN}, {TK_WORD, FOR_WORDLIST}, + {TK_WORD, MATH}, {TK_ASSIGNEMENT_WORD, CMD_PREFIX}, {TK_IO_NUMBER, REDIRECT_LIST}, {TK_IO_NUMBER, CMD_SUFFIX}, @@ -430,17 +431,20 @@ t_stackmatch g_stackmatch[] = {END_COMMAND, COMPOUND_LIST}, {END_COMMAND, CASE_LIST_NS}, {END_COMMAND, COMPLETE_CONDITION}, + {SEPARATOR, MATH_SUP}, {SEPARATOR, CMD_SUPERIOR}, {SEPARATOR, TERM}, {SEPARATOR, COMPOUND_LIST}, {SEPARATOR, CASE_LIST_NS}, {SEPARATOR, PIPE_SEMI_SEQUENCE}, + {SEPARATOR_OP, MATH_SUP}, {SEPARATOR_OP, CMD_SUPERIOR}, {SEPARATOR_OP, LIST}, {SEPARATOR_OP, TERM}, {SEPARATOR_OP, CASE_LIST_NS}, {SEPARATOR_OP, COMPOUND_LIST}, {SEPARATOR_OP, PIPE_SEMI_SEQUENCE}, + {LINEBREAK, MATH_SUP}, {LINEBREAK, TK_SEMI}, {LINEBREAK, END_COMMAND}, {LINEBREAK, SEPARATOR_OP}, @@ -459,6 +463,8 @@ t_stackmatch g_stackmatch[] = {LINEBREAK, PROGRAM}, {LINEBREAK, TK_PAREN_OPEN}, {LINEBREAK, TK_LBRACE}, + {TK_PAREN_CLOSE, MATH}, + {TK_PAREN_CLOSE, MATH_PLUS}, {TK_PAREN_CLOSE, TK_SEMI}, {TK_PAREN_CLOSE, END_COMMAND}, {TK_PAREN_CLOSE, SEPARATOR_OP}, @@ -478,6 +484,7 @@ t_stackmatch g_stackmatch[] = {TK_PAREN_CLOSE, PATTERN}, {TK_PAREN_CLOSE, COMPOUND_LIST}, {TK_PAREN_CLOSE, FUNC_NAME}, + {NEWLINE_LIST, MATH_SUP}, {NEWLINE_LIST, TK_DO}, {NEWLINE_LIST, CASE_LIST_NS}, {NEWLINE_LIST, TK_PAREN_CLOSE}, @@ -628,6 +635,19 @@ t_stackmatch g_stackmatch[] = // watch ! {CMD_SUPERIOR, AND_OR_MAJOR}, + {MATH, LINEBREAK}, + {MATH, NEWLINE_LIST}, + {MATH, SEPARATOR}, + {MATH, SEPARATOR_OP}, + {MATH_PLUS, LINEBREAK}, + {MATH_PLUS, NEWLINE_LIST}, + {MATH_PLUS, SEPARATOR}, + {MATH_PLUS, SEPARATOR_OP}, + {MATH_SUP, LINEBREAK}, + {MATH_SUP, NEWLINE_LIST}, + {MATH_SUP, SEPARATOR}, + {MATH_SUP, SEPARATOR_OP}, + {SIMPLE_COMMAND, TK_WHILE}, {SIMPLE_COMMAND, TK_UNTIL}, {SIMPLE_COMMAND, TK_DO}, diff --git a/42sh/src/parser/produce_sym.c b/42sh/src/parser/produce_sym.c index c7432e03..754f1205 100644 --- a/42sh/src/parser/produce_sym.c +++ b/42sh/src/parser/produce_sym.c @@ -64,6 +64,7 @@ t_prodmatch g_prodmatch[] = {TK_NAME, SEPARATOR_OP, FNAME}, {TK_NAME, NEWLINE_LIST, FNAME}, {TK_NAME, TK_FOR, NAME}, + {TK_NEWLINE, MATH_SUP, NEWLINE_LIST}, {TK_NEWLINE, CASE_LIST_NS, NEWLINE_LIST}, {TK_NEWLINE, TK_DO, NEWLINE_LIST}, {TK_NEWLINE, TK_PAREN_CLOSE, NEWLINE_LIST}, @@ -89,9 +90,11 @@ t_prodmatch g_prodmatch[] = {TK_NEWLINE, CONDITION, NEWLINE_LIST}, {TK_NEWLINE, FOR_WORDLIST, NEWLINE_LIST}, {TK_NEWLINE, SEQUENTIAL_SEP, NEWLINE_LIST}, + {TK_SEMI, MATH_SUP, SEPARATOR_OP}, {TK_SEMI, CMD_SUPERIOR, SEPARATOR_OP}, {TK_SEMI, LIST, SEPARATOR_OP}, {TK_SEMI, PIPE_SEMI_SEQUENCE, SEPARATOR_OP}, + {TK_AMP, MATH_SUP, SEPARATOR_OP}, {TK_AMP, CMD_SUPERIOR, SEPARATOR_OP}, {TK_AMP, LIST, SEPARATOR_OP}, {TK_AMP, PIPE_SEMI_SEQUENCE, SEPARATOR_OP},