#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::string; using std::vector; using std::stringstream; class FormatVisitor : public BaseVisitor { vector res; stringstream s; public: void Visit(const BaseNode* node) override { node->Visit(this); }; void Visit(const ClassDeclarationNode* node) override { string shift = s.str(); s << "class " << node->ClassName() << " {"; res.push_back(s.str()); s.str(""); const vector& pub = node->PublicFields(); int len = pub.size(); if (len > 0) { s << shift << " public:"; res.push_back(s.str()); s.str(""); for (int i = 0; i < len; ++i) { s << " " << shift; Visit(pub[i]); s << ";"; res.push_back(s.str()); s.str(""); } } const vector& prot = node->ProtectedFields(); len = prot.size(); if (len > 0) { res.push_back(s.str()); s.str(""); s << shift << " protected:"; res.push_back(s.str()); s.str(""); for (int i = 0; i < len; ++i) { s << " " << shift; Visit(prot[i]); s << ";"; res.push_back(s.str()); s.str(""); } } const vector& priv = node->PrivateFields(); len = priv.size(); if (len > 0) { res.push_back(s.str()); s.str(""); s << shift << " private:"; res.push_back(s.str()); s.str(""); for (int i = 0; i < len; ++i) { s << " " << shift; Visit(priv[i]); s << ";"; res.push_back(s.str()); s.str(""); } } s << shift << "}"; }; void Visit(const VarDeclarationNode* node) override { s << node->TypeName() << " " << node->VarName(); }; void Visit(const MethodDeclarationNode* node) override { s << node->ReturnTypeName() << " " << node->MethodName() << "("; const vector& arguments = node->Arguments(); int arguments_len = arguments.size(); if (arguments_len > 0) { for (int i = 0; i < arguments_len - 1; ++i) { Visit(arguments[i]); s << ", "; } Visit(arguments[arguments_len - 1]); } s << ")"; } const vector& GetFormattedCode() { s << ";"; res.push_back(s.str()); return res; } };