diff options
Diffstat (limited to 'src/compiler/ast-tree.c')
-rw-r--r-- | src/compiler/ast-tree.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index 4153d0d..6f96f49 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -1039,6 +1039,21 @@ AstTree *astTreeParse(ParserNode *parserNode, AstTreeHelper *helper) { case PARSER_TOKEN_OPERATOR_ASSIGN: return astTreeParseBinaryOperator(parserNode, helper, AST_TREE_TOKEN_OPERATOR_ASSIGN); + case PARSER_TOKEN_OPERATOR_SUM_ASSIGN: + return astTreeParseOperateAssignOperator(parserNode, helper, + AST_TREE_TOKEN_OPERATOR_SUM); + case PARSER_TOKEN_OPERATOR_SUB_ASSIGN: + return astTreeParseOperateAssignOperator(parserNode, helper, + AST_TREE_TOKEN_OPERATOR_SUB); + case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN: + return astTreeParseOperateAssignOperator(parserNode, helper, + AST_TREE_TOKEN_OPERATOR_MULTIPLY); + case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN: + return astTreeParseOperateAssignOperator(parserNode, helper, + AST_TREE_TOKEN_OPERATOR_DIVIDE); + case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN: + return astTreeParseOperateAssignOperator(parserNode, helper, + AST_TREE_TOKEN_OPERATOR_MODULO); case PARSER_TOKEN_OPERATOR_SUM: return astTreeParseBinaryOperator(parserNode, helper, AST_TREE_TOKEN_OPERATOR_SUM); @@ -1449,6 +1464,44 @@ AstTree *astTreeParseUnaryOperator(ParserNode *parserNode, parserNode->str_end); } +AstTree *astTreeParseOperateAssignOperator(ParserNode *parserNode, + AstTreeHelper *helper, + AstTreeToken token) { + ParserNodeInfixMetadata *node_metadata = parserNode->metadata; + + AstTree *left = astTreeParse(node_metadata->left, helper); + if (left == NULL) { + return NULL; + } + AstTree *right = astTreeParse(node_metadata->right, helper); + if (right == NULL) { + return NULL; + } + + AstTreeInfix *metadata = a404m_malloc(sizeof(*metadata)); + + metadata->left = *left; + metadata->right = *right; + + free(left); + free(right); + + AstTreeInfix *assignMetadata = a404m_malloc(sizeof(*assignMetadata)); + + AstTree *assignLeft = astTreeParse(node_metadata->left, helper); + AstTree *assignRight = newAstTree(token, metadata, NULL, + parserNode->str_begin, parserNode->str_end); + + assignMetadata->left = *assignLeft; + assignMetadata->right = *assignRight; + + free(assignLeft); + free(assignRight); + + return newAstTree(AST_TREE_TOKEN_OPERATOR_ASSIGN, assignMetadata, NULL, + parserNode->str_begin, parserNode->str_end); +} + bool astTreeParseConstant(ParserNode *parserNode, AstTreeHelper *helper) { ParserNodeVariableMetadata *node_metadata = parserNode->metadata; |