sunlang/src/ast_printer.cpp

133 lines
3.2 KiB
C++

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