#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); } }