A simple scripting language in C++
Ferenc Szontágh
2025-04-18 a76181288ae27b85521838ee87352727c3cba2f8
src/Parser/ParsedExpression.hpp
@@ -3,9 +3,11 @@
#include <memory>
#include <string>
#include <vector>
#include "../Symbols/SymbolContainer.hpp"
#include "../Symbols/Value.hpp"
#include "../Symbols/FunctionSymbol.hpp"
namespace Parser {
@@ -14,7 +16,7 @@
using ParsedExpressionPtr = std::unique_ptr<ParsedExpression>;
struct ParsedExpression {
    enum class Kind : std::uint8_t { Literal, Variable, Binary, Unary };
    enum class Kind : std::uint8_t { Literal, Variable, Binary, Unary, Call };
    Kind kind;
@@ -25,6 +27,8 @@
    std::string         op;
    ParsedExpressionPtr lhs;
    ParsedExpressionPtr rhs;
    // For function call arguments
    std::vector<ParsedExpressionPtr> args;
    // Constructor for literal
    static ParsedExpressionPtr makeLiteral(const Symbols::Value & val) {
@@ -60,6 +64,14 @@
        expr->rhs  = std::move(operand);
        return expr;
    }
    // Constructor for function call
    static ParsedExpressionPtr makeCall(const std::string &name, std::vector<ParsedExpressionPtr> arguments) {
        auto expr        = std::make_unique<ParsedExpression>();
        expr->kind       = Kind::Call;
        expr->name       = name;
        expr->args       = std::move(arguments);
        return expr;
    }
    Symbols::Variables::Type getType() const {
        switch (kind) {
@@ -93,6 +105,17 @@
                    }
                    break;
                }
            case Kind::Call:
                {
                    const std::string ns = Symbols::SymbolContainer::instance()->currentScopeName() + ".functions";
                    auto symbol = Symbols::SymbolContainer::instance()->get(ns, name);
                    if (!symbol) {
                        throw std::runtime_error("Unknown function: " + name + " in namespace: " + ns);
                    }
                    // FunctionSymbol holds return type
                    auto funcSym = std::static_pointer_cast<Symbols::FunctionSymbol>(symbol);
                    return funcSym->returnType();
                }
            default:
                throw std::runtime_error("Unknown expression kind");