diff --git a/src/ast/expression/BinaryExpression.cpp b/src/ast/expression/BinaryExpression.cpp index 8768e18..ce7beee 100644 --- a/src/ast/expression/BinaryExpression.cpp +++ b/src/ast/expression/BinaryExpression.cpp @@ -16,10 +16,37 @@ * along with Zhivo. If not, see . */ +#include #include +#include #include DynamicObject BinaryExpression::visit(SymbolTable& symbols) { + if(auto* varAccess = dynamic_cast(this->left.get())) { + DynamicObject rValue = this->right->visit(symbols); + symbols.setSymbol(varAccess->getName().getImage(), rValue); + + return rValue; + } + else if(auto* arrayAccess = dynamic_cast(this->left.get())) { + auto arrayExpr = arrayAccess->getArrayExpression(); + auto arrayIdx = arrayAccess->getIndexExpression(); + + DynamicObject arrayVal = arrayExpr->visit(symbols); + if(!arrayVal.isArray()) + throw std::runtime_error("Error updating array element (1)"); + + DynamicObject indexVal = arrayIdx->visit(symbols); + if(!indexVal.isNumber()) + throw std::runtime_error("Error updating array element (2)"); + + DynamicObject rValue = this->right->visit(symbols); + std::unique_ptr rValuePtr = std::make_unique(rValue); + + arrayVal.setArrayElement((int) indexVal.getNumber(), std::move(rValuePtr)); + return arrayVal; + } + DynamicObject lValue = this->left->visit(symbols); DynamicObject rValue = this->right->visit(symbols);