#include #include class FormatVisitor : public BaseVisitor { public: void Visit(const BaseNode *node) override { node->Visit(this); } void Visit(const ClassDeclarationNode *node) override { this->node_class = "class"; this->formattedCode.push_back("class " + node->ClassName() + " {"); if (!node->PublicFields().empty()) this->formattedCode.push_back(" public:"); for (auto i : node->PublicFields()) { auto Fv = new FormatVisitor(); Fv->Visit(i); for (auto j : Fv->GetFormattedCode()) { this->formattedCode.push_back(" " + j + (j[j.size() - 1] == ';' || j[j.size() - 1] == ':' || j[j.size() - 1] == '{' ? "" : ";")); } delete Fv; } if (!node->ProtectedFields().empty()) { this->formattedCode.push_back(""); this->formattedCode.push_back(" protected:"); } for (auto i : node->ProtectedFields()) { auto Fv = new FormatVisitor(); Fv->Visit(i); for (auto j : Fv->GetFormattedCode()) { this->formattedCode.push_back(" " + j + (j[j.size() - 1] == ';' || j[j.size() - 1] == ':' || j[j.size() - 1] == '{' ? "" : ";")); } delete Fv; } if (!node->PrivateFields().empty()) { this->formattedCode.push_back(""); this->formattedCode.push_back(" private:"); } for (auto i : node->PrivateFields()) { auto Fv = new FormatVisitor(); Fv->Visit(i); for (auto j : Fv->GetFormattedCode()) { this->formattedCode.push_back(" " + j + (j[j.size() - 1] == ';' || j[j.size() - 1] == ':' || j[j.size() - 1] == '{' ? "" : ";")); } delete Fv; } this->formattedCode.push_back("};"); }; void Visit(const VarDeclarationNode *node) override { this->node_class = "var"; this->formattedCode.push_back(node->TypeName() + " " + node->VarName()); }; void Visit(const MethodDeclarationNode *node) override { this->node_class = "method"; std::string tmp = node->ReturnTypeName() + " " + node->MethodName() + "("; auto args = node->Arguments(); for (size_t i = 0; i < args.size(); ++i) { auto Fv = new FormatVisitor(); Fv->Visit(args[i]); tmp += Fv->GetFormattedCode()[0] + (args.size() - i == 1 ? "" : ", "); delete Fv; } tmp += ");"; this->formattedCode.push_back(tmp); }; const std::vector &GetFormattedCode() const { return this->formattedCode; } private: std::string node_class; std::vector formattedCode{}; };