#include "ast_printer.h" void ASTPrinter::print(ASTNode& node) { node.accept(*this); std::cout << std::endl; } void ASTPrinter::visit(NumberExpr& node) { std::cout << node.value; } void ASTPrinter::visit(StringExpr& node) { std::cout << "\"" << node.value << "\""; } void ASTPrinter::visit(VariableExpr& node) { std::cout << node.name; } void ASTPrinter::visit(AssignExpr& node) { std::cout << "(" << node.name << " = "; node.value->accept(*this); std::cout << ")"; } void ASTPrinter::visit(CallExpr& node) { std::cout << node.callee << "("; for (size_t i = 0; i < node.args.size(); ++i) { node.args[i]->accept(*this); if (i < node.args.size() - 1) std::cout << ", "; } std::cout << ")"; } void ASTPrinter::visit(BinaryExpr& node) { std::cout << "("; node.left->accept(*this); std::cout << " " << node.op << " "; node.right->accept(*this); std::cout << ")"; } void ASTPrinter::visit(ReturnStmt& node) { std::cout << "return "; if (node.value) { node.value->accept(*this); } std::cout << ";"; } void ASTPrinter::visit(VarDeclStmt& node) { std::cout << "var " << node.name << " = "; node.initializer->accept(*this); std::cout << ";"; } void ASTPrinter::visit(BlockStmt& node) { std::cout << " {" << std::endl; for (const auto& stmt : node.statements) { std::cout << " "; stmt->accept(*this); std::cout << std::endl; } std::cout << "}"; } void ASTPrinter::visit(IfStmt& node) { std::cout << "if ("; node.condition->accept(*this); std::cout << ") "; node.thenBranch->accept(*this); if (node.elseBranch) { std::cout << " else "; node.elseBranch->accept(*this); } } void ASTPrinter::visit(WhileStmt& node) { std::cout << "while ("; node.condition->accept(*this); std::cout << ") "; node.body->accept(*this); } void ASTPrinter::visit(ForStmt& node) { std::cout << "for ("; if (node.init) node.init->accept(*this); std::cout << "; "; if (node.condition) node.condition->accept(*this); std::cout << "; "; if (node.increment) node.increment->accept(*this); std::cout << ") "; node.body->accept(*this); } void ASTPrinter::visit(ExpressionStmt& node) { node.expression->accept(*this); std::cout << ";"; } void ASTPrinter::visit(FunctionDef& node) { std::cout << "function " << node.name << "("; for (size_t i = 0; i < node.args.size(); ++i) { std::cout << node.args[i]; if (i < node.args.size() - 1) std::cout << ", "; } std::cout << ")"; node.body->accept(*this); } void ASTPrinter::visit(NewExpr& node) { std::cout << "new " << node.className << "()"; } void ASTPrinter::visit(GetPropExpr& node) { node.object->accept(*this); std::cout << "." << node.name; } void ASTPrinter::visit(SetPropExpr& node) { node.object->accept(*this); std::cout << "." << node.name << " = "; node.value->accept(*this); } void ASTPrinter::visit(ClassDef& node) { std::cout << "class " << node.name << " {" << std::endl; for (const auto& field : node.fields) { std::cout << " var " << field << ";" << std::endl; } std::cout << "}"; }