133 lines
3.2 KiB
C++
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 << "}";
|
|
}
|