A simple scripting language in C++
Ferenc Szontágh
2025-04-19 558e0191ba5a5b0ab99825de7d7d2219387e559e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#ifndef INTERPRETER_MEMBER_EXPRESSION_NODE_HPP
#define INTERPRETER_MEMBER_EXPRESSION_NODE_HPP
 
#include "ExpressionNode.hpp"
#include "Symbols/Value.hpp"
#include <stdexcept>
 
namespace Interpreter {
 
// Expression node for member access: object->property
class MemberExpressionNode : public ExpressionNode {
  public:
    MemberExpressionNode(std::unique_ptr<ExpressionNode> objectExpr, std::string propertyName)
        : objectExpr_(std::move(objectExpr)), propertyName_(std::move(propertyName)) {}
 
    Symbols::Value evaluate(Interpreter & interpreter) const override {
        Symbols::Value objVal = objectExpr_->evaluate(interpreter);
        if (objVal.getType() != Symbols::Variables::Type::OBJECT) {
            throw std::runtime_error("Attempted to access member '" + propertyName_ + "' of non-object");
        }
        const auto &map = std::get<Symbols::Value::ObjectMap>(objVal.get());
        auto it = map.find(propertyName_);
        if (it == map.end()) {
            throw std::runtime_error("Property '" + propertyName_ + "' not found on object");
        }
        return it->second;
    }
 
    std::string toString() const override {
        return objectExpr_->toString() + "->" + propertyName_;
    }
 
  private:
    std::unique_ptr<ExpressionNode> objectExpr_;
    std::string                     propertyName_;
};
 
} // namespace Interpreter
 
#endif // INTERPRETER_MEMBER_EXPRESSION_NODE_HPP