// // Created by Bobby Lucero on 5/23/23. // #include "../headers/ASTPrinter.h" std::shared_ptr ASTPrinter::visitBinaryExpr(BinaryExpr>* expression){ std::cout << expression->left << std::endl; return parenthesize(expression->oper.lexeme, std::vector>>>{expression->left, expression->right}); } std::shared_ptr ASTPrinter::visitGroupingExpr(GroupingExpr>* expression){ return parenthesize("group", std::vector>>>{expression->expression}); } std::shared_ptr ASTPrinter::visitLiteralExpr(LiteralExpr>* expression){ return std::make_shared(expression->value); } std::shared_ptr ASTPrinter::visitUnaryExpr(UnaryExpr>* expression){ return parenthesize(expression->oper.lexeme, std::vector>>>{expression->right}); } std::shared_ptr ASTPrinter::print(Expr> *expr) { return expr->accept(this); } std::shared_ptr ASTPrinter::parenthesize(std::string name, std::vector>>> exprs) { std::string builder; builder += "(" + name; for(const std::shared_ptr>>& expr : exprs) { builder += " "; builder += std::dynamic_pointer_cast(expr->accept(this))->value; } builder += ")"; return std::make_shared(builder); }