diff --git a/ast/include/ast/ast.h b/ast/include/ast/ast.h index bc96ff80..1ab1d1cf 100644 --- a/ast/include/ast/ast.h +++ b/ast/include/ast/ast.h @@ -6,7 +6,7 @@ /* By: maiboyer +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/11 14:23:40 by maiboyer #+# #+# */ -/* Updated: 2024/07/11 14:05:20 by rparodi ### ########.fr */ +/* Updated: 2024/07/21 16:28:16 by maiboyer ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,43 +18,38 @@ enum e_ast_node_kind { - S_AST_CATEGORY_MASK = 0xFFFF0000, - S_AST_NODETYPE_MASK = 0x0000FFFF, - S_AST_NONE = 0, - S_AST_COMPOUND_COMMAND = 1 << 16, - S_AST_COMMAND = 1 << 17, - S_AST_REDIRECT = 1 << 18, - S_AST_EXPANSION = 1 << 19, - AST_ARITHMETIC_EXPANSION = S_AST_EXPANSION | 0x0001, - AST_COMMAND_SUBSTITUTION = S_AST_EXPANSION | 0x0002, - AST_EXPANSION = S_AST_EXPANSION | 0x0003, - AST_COMMAND = S_AST_COMMAND | 0x0004, - AST_CASE_ITEM = S_AST_NONE | 0x0005, - AST_ELIF = S_AST_NONE | 0x0006, - AST_ELSE = S_AST_NONE | 0x0007, - AST_EMPTY = S_AST_NONE | 0x0008, - AST_RAW_STRING = S_AST_NONE | 0x000A, - AST_WORD = S_AST_NONE | 0x000C, - AST_VARIABLE_ASSIGNMENT = S_AST_NONE | 0x000E, - AST_EXTGLOB = S_AST_NONE | 0x001A, - AST_REGEX = S_AST_NONE | 0x001B, - AST_FILE_REDIRECTION = S_AST_REDIRECT | 0x000F, - AST_HEREDOC_REDIRECTION = S_AST_REDIRECT | 0x0010, - AST_FOR = S_AST_COMPOUND_COMMAND | 0x0011, - AST_CASE = S_AST_COMPOUND_COMMAND | 0x0012, - AST_COMPOUND_STATEMENT = S_AST_COMPOUND_COMMAND | 0x0013, - AST_IF = S_AST_COMPOUND_COMMAND | 0x0014, - AST_FUNCTION_DEFINITION = S_AST_COMPOUND_COMMAND | 0x000D, - AST_LIST = S_AST_COMPOUND_COMMAND | 0x0009, - AST_PIPELINE = S_AST_COMPOUND_COMMAND | 0x00015, - AST_PROGRAM = S_AST_COMPOUND_COMMAND | 0x0016, - AST_SUBSHELL = S_AST_COMPOUND_COMMAND | 0x00017, - AST_UNTIL = S_AST_COMPOUND_COMMAND | 0x0018, - AST_WHILE = S_AST_COMPOUND_COMMAND | 0x0019, + AST_ARITHMETIC_BINARY, + AST_ARITHMETIC_EXPANSION, + AST_CASE, + AST_CASE_ITEM, + AST_COMMAND, + AST_COMMAND_SUBSTITUTION, + AST_COMPOUND_STATEMENT, + AST_ELIF, + AST_ELSE, + AST_EMPTY, + AST_EXPANSION, + AST_EXTGLOB, + AST_FILE_REDIRECTION, + AST_FOR, + AST_FUNCTION_DEFINITION, + AST_HEREDOC_REDIRECTION, + AST_IF, + AST_LIST, + AST_PIPELINE, + AST_PROGRAM, + AST_RAW_STRING, + AST_REGEX, + AST_SUBSHELL, + AST_UNTIL, + AST_VARIABLE_ASSIGNMENT, + AST_WHILE, + AST_WORD, }; union u_ast_node_data { + t_ast_arithmetic_binary arithmetic_binary; t_ast_arithmetic_expansion arithmetic_expansion; t_ast_case case_; t_ast_case_item case_item; @@ -89,14 +84,4 @@ struct s_ast_node t_ast_node_data data; }; -static inline bool ast_category(t_ast_node node) -{ - return (node->kind & S_AST_CATEGORY_MASK); -} - -static inline bool ast_nodetype(t_ast_node node) -{ - return (node->kind & S_AST_NODETYPE_MASK); -} - #endif /* AST_H */ diff --git a/ast/include/ast/ast_forward_def.h b/ast/include/ast/ast_forward_def.h index f0d4fa34..c18ef3e1 100644 --- a/ast/include/ast/ast_forward_def.h +++ b/ast/include/ast/ast_forward_def.h @@ -6,7 +6,7 @@ /* By: maiboyer +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/11 14:24:24 by maiboyer #+# #+# */ -/* Updated: 2024/07/11 14:04:34 by rparodi ### ########.fr */ +/* Updated: 2024/07/21 16:26:36 by maiboyer ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,6 +17,7 @@ typedef enum e_ast_node_kind t_ast_node_kind; typedef enum e_ast_word_kind t_ast_word_kind; typedef enum e_ast_list_kind t_ast_list_kind; typedef enum e_ast_expansion_operator t_ast_expansion_operator; +typedef enum e_ast_arithmetic_operator t_ast_arithmetic_operator; typedef enum e_ast_terminator_kind t_ast_terminator_kind; typedef enum e_ast_redirection_kind t_ast_redirection_kind; typedef union u_ast_node_data t_ast_node_data; @@ -24,6 +25,7 @@ typedef union u_ast_node_data t_ast_node_data; typedef struct s_ast_node *t_ast_node; typedef struct s_ast_arithmetic_expansion t_ast_arithmetic_expansion; +typedef struct s_ast_arithmetic_binary t_ast_arithmetic_binary; typedef struct s_ast_case t_ast_case; typedef struct s_ast_case_item t_ast_case_item; typedef struct s_ast_command t_ast_command; diff --git a/ast/include/ast/ast_raw_structs.h b/ast/include/ast/ast_raw_structs.h index dccfe6cc..c3242f29 100644 --- a/ast/include/ast/ast_raw_structs.h +++ b/ast/include/ast/ast_raw_structs.h @@ -6,7 +6,7 @@ /* By: maiboyer +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/14 17:46:58 by maiboyer #+# #+# */ -/* Updated: 2024/07/21 15:29:33 by rparodi ### ########.fr */ +/* Updated: 2024/07/21 16:26:17 by maiboyer ### ########.fr */ /* */ /* ************************************************************************** */ @@ -39,6 +39,14 @@ enum e_ast_terminator_kind AST_TERM_FORK, }; +enum e_ast_arithmetic_operator +{ + ARITH_PLUS, + ARITH_MINUS, + ARITH_DIVIDE, + ARITH_MULT, +}; + /* E_OP_NONE = 0,= ${var} E_OP_DEFAULT, = ${var-word} @@ -409,14 +417,13 @@ struct s_ast_arithmetic_expansion t_ast_node expr; }; -struct s_ast_binary_op +struct s_ast_arithmetic_binary { - t_ast_node operator; + t_ast_node lhs; + t_ast_arithmetic_operator op; + t_ast_node rhs; }; -{ - t_ast_node expr; -}; /// Command Substitution /// ```shell /// $(command) diff --git a/ast/src/from_node.c b/ast/src/from_node.c index 50c8fe0b..ccd69229 100644 --- a/ast/src/from_node.c +++ b/ast/src/from_node.c @@ -83,6 +83,11 @@ void ast_free(t_ast_node elem) { ast_free(elem->data.arithmetic_expansion.expr); } + if (elem->kind == AST_ARITHMETIC_BINARY) + { + ast_free(elem->data.arithmetic_binary.lhs); + ast_free(elem->data.arithmetic_binary.rhs); + } if (elem->kind == AST_CASE) { ast_free(elem->data.case_.word); @@ -221,6 +226,12 @@ t_ast_node ast_alloc(t_ast_node_kind kind) { ret->data.arithmetic_expansion.expr = NULL; } + if (kind == AST_ARITHMETIC_BINARY) + { + ret->data.arithmetic_binary.lhs = NULL; + ret->data.arithmetic_binary.op = 0; + ret->data.arithmetic_binary.rhs = NULL; + } if (kind == AST_CASE) { ret->data.case_.cases = vec_ast_new(16, ast_free); @@ -560,6 +571,23 @@ t_ast_redirection_kind _get_redirection_op(t_parse_node self) return (me_abort("invalid redirection symbol"), 0); } +t_ast_arithmetic_operator _parse_operator(t_parse_node self) +{ + t_symbol symbol; + + symbol = ts_node_grammar_symbol(self); + if (symbol == anon_sym_PLUS) + return (ARITH_PLUS); + if (symbol == anon_sym_DASH) + return (ARITH_MINUS); + if (symbol == anon_sym_STAR) + return (ARITH_MULT); + if (symbol == anon_sym_SLASH) + return (ARITH_DIVIDE); + // anon_sym_PERCENT + return (me_abort("invalid arithmetic operator"), 0); +} + t_error ast_from_node(t_parse_node node, t_const_str input, t_ast_node *out); /* FUNCTION THAT ARE DONE */ @@ -615,27 +643,30 @@ t_error build_sym_heredoc_start(t_parse_node self, t_const_str input, t_ast_node #include -t_error build_sym_arithmetic_binary_expression(t_parse_node self, t_const_str input, t_ast_node *out); +t_error build_sym_arithmetic_binary_expression(t_parse_node self, t_const_str input, t_ast_node *out) { - t_usize i; - t_ast_node *ret; + t_usize i; + t_ast_node ret; + if (out == NULL) + return (ERROR); + if (ts_node_symbol(self) != sym_arithmetic_binary_expression) + return (ERROR); i = 0; - ret = ast_alloc(AST_ARITHMETIC_EXPANSION); - while (str[i] == '\0') + ret = ast_alloc(AST_ARITHMETIC_BINARY); + while (i < ts_node_child_count(self)) { - if (str[i] == '+') - ret->operator = '+'; - if (str[i] == '-') - ret->operator = '-'; - if (str[i] == '/') - ret->operator = '/'; - if (str[i] == '%') - ret->operator = '%'; - if (str[i] == '*') - ret->operator = '*'; + if (ts_node_field_id_for_child(self, i) == field_lhs) + if (ast_from_node(ts_node_child(self, i), input, &ret->data.arithmetic_binary.lhs)) + return (ERROR); + if (ts_node_field_id_for_child(self, i) == field_op) + ret->data.arithmetic_binary.op = _parse_operator(ts_node_child(self, i)); + if (ts_node_field_id_for_child(self, i) == field_rhs) + if (ast_from_node(ts_node_child(self, i), input, &ret->data.arithmetic_binary.rhs)) + return (ERROR); + i++; } - + return (*out = ret, NO_ERROR); } t_error build_sym_command_substitution(t_parse_node self, t_const_str input, t_ast_node *out)