Newer
Older
libj / modules / parser / src / node.cpp
#include <iostream>
#include <iomanip>
#include <token_type.hpp>
#include <node.hpp>

namespace parser
{
    // Node

    std::unique_ptr<Node> Node::create(const xtokenizer::Token &token, std::unique_ptr<Node> lhs, std::unique_ptr<Node> rhs)
    {
        std::cout << "Node::create token="
                  << xtokenizer::toTokenTypeSymbol(token.type)
                  << token.value.i << std::endl;
        auto node = std::make_unique<Node>(token, std::move(lhs), std::move(rhs));
        std::cout << "Node::create token="
                  << node.get()
                  << xtokenizer::toTokenTypeSymbol(node->token.type)
                  << node->token.value.i << std::endl;
        return node;
    }

    Node::Node(const xtokenizer::Token &token, std::unique_ptr<Node> lhs, std::unique_ptr<Node> rhs)
        : token(token), lhs(std::move(lhs)), rhs(std::move(rhs))
    {
        std::cout << xtokenizer::toTokenTypeSymbol(token.type) << ", " << token.value.i << std::endl;
        if (lhs)
        {
            std::cout << "lhs:" << xtokenizer::toTokenTypeSymbol(lhs->token.type) << ", " << lhs->token.value.i << std::endl;
        }
        if (rhs)
        {
            std::cout << "rhs:" << xtokenizer::toTokenTypeSymbol(rhs->token.type) << ", " << rhs->token.value.i << std::endl;
        }
        // NOP
    }

    Node::Node(Node &&other) noexcept
        : token(std::move(other.token)), lhs(std::move(other.lhs)), rhs(std::move(other.rhs))
    {
        // NOP
    }

    Node::~Node()
    {
    }

    void Node::dump()
    {
        std::cout << std::setw(5) << xtokenizer::toTokenTypeSymbol(token.type) << std::endl;
        if (lhs == nullptr)
        {
            std::cout << "[lhs=nullptr]" << std::endl;
        }
        dump(lhs, 1);
        dump(rhs, 1);
    }

    void Node::dump(const std::unique_ptr<Node> &node, int depth)
    {
        if (!node)
        {
            return;
        }

        for (int i = depth; i >= 0; i--)
        {
            std::cout << "   ";
        }
        std::cout << std::setw(5) << xtokenizer::toTokenTypeSymbol(node->token.type) << ":" << node->token.value.i << std::endl;
        dump(node->lhs, depth + 1);
        dump(node->rhs, depth + 1);
    }
}