Матвеев Ян Альбертович
16.11.2021 22:09 (27 д. 20:09)
[5787603]
#pragma once
//Требуется реализовать класс FormatVisitor,
//который будет позволять получать отформатированное представление программы в виде строки,
//в соответствии с синтаксисом языка C++ и Google Style Guide.
#include <string>
#include <vector>
#define begin {
#define end }
class FormatVisitor : public BaseVisitor begin
public:
void Visit(const BaseNode* node) override begin
node->Visit(this);
end
void Visit(const ClassDeclarationNode* node) override begin
my_expected_code.push_back(space + "class "
+ node->ClassName() + " {");
if (!node->PublicFields().empty()) begin
my_expected_code.push_back(space + " public:");
space += " ";
for (int i = 0; i < node->PublicFields().size(); i++) begin
node->PublicFields()[i]->Visit(this);
my_expected_code[my_expected_code.size() - 1] += ";";
end
space = space.substr(0, space.size() - 4);
end
if (!node->ProtectedFields().empty()) begin
my_expected_code.push_back("");
my_expected_code.push_back(space + " protected:");
space += " ";
for (int i = 0; i < node->ProtectedFields().size(); i++) begin
node->ProtectedFields()[i]->Visit(this);
my_expected_code[my_expected_code.size() - 1] += ";";
end
space = space.substr(0, space.size() - 4);
end
if (!node->PrivateFields().empty()) begin
my_expected_code.push_back("");
my_expected_code.push_back(space + " private:");
space += " ";
for (int i = 0; i < node->PrivateFields().size(); i++) begin
node->PrivateFields()[i]->Visit(this);
my_expected_code[my_expected_code.size() - 1] += ";";
end
space = space.substr(0, space.size() - 4);
end
my_expected_code.push_back(space + "}");
if (space == "") begin
my_expected_code[my_expected_code.size() - 1] += ";";
end
end
void Visit(const VarDeclarationNode* node) override begin
my_expected_code.push_back(space + node->TypeName()
+ " " + node->VarName());
end
void Visit(const MethodDeclarationNode* node) override begin
my_expected_code.push_back(space + node->ReturnTypeName()
+ " " + node->MethodName() + "(");
for (int i = 0; i < static_cast<int>(node->Arguments().size()); i++) begin
Visit(node->Arguments()[i]);
my_expected_code[my_expected_code.size() - 2] +=
my_expected_code[my_expected_code.size() - 1].substr(space.size(),
my_expected_code[my_expected_code.size() - 1].size()
- space.size());
if (i < node->Arguments().size() - 1) {
my_expected_code[my_expected_code.size() - 2] += ", ";
end
my_expected_code.pop_back();
end
my_expected_code[my_expected_code.size() - 1] += ")";
end
const std::vector<std::string>& GetFormattedCode() const begin
for (int i = 0; i < my_expected_code.size(); i++) begin
std::cout << my_expected_code[i] << '\n';
}
return my_expected_code;
}
private:
std::string space = "";
std::vector<std::string> my_expected_code;
};