#pragma once #include "ClassDeclaration.h" #include "GenericType.h" #include "AsyncNodes.h" #include "CppGenerator.h" class CGenerator : public CppGenerator { public: std::string commentPrefix() const { return "// "; } std::string generate(const ASTNode* node) override { return dispatchGenerate(this, node, "/* Unknown concept: "); } std::string visitModule(const Module* module) override { std::ostringstream oss; for (auto* s : module->getChildren("statements")) oss << generate(s) << "\n"; if (!module->getChildren("statements").empty()) oss << "\n"; for (auto* c : module->getChildren("classes")) oss << generate(c) << "\n"; for (auto* v : module->getChildren("variables")) oss << generate(v) << "\n"; if (!module->getChildren("variables").empty()) oss << "\n"; for (auto* f : module->getChildren("functions")) oss << generate(f) << "\n"; return oss.str(); } std::string visitClassDeclaration(const ASTNode* node) override { auto* cls = static_cast(node); std::ostringstream oss; oss << "typedef struct " << cls->name << " {\n"; for (auto* f : cls->getChildren("fields")) { std::string line = generate(f); if (!line.empty() && line.back() == ';') line.pop_back(); oss << " " << line << ";\n"; } oss << "} " << cls->name << ";"; return oss.str(); } std::string visitMethodDeclaration(const ASTNode* node) override { auto* meth = static_cast(node); std::ostringstream oss; oss << "void " << meth->className << "_" << meth->name << "("; auto params = meth->getChildren("parameters"); for (size_t i = 0; i < params.size(); ++i) { if (i > 0) oss << ", "; oss << visitParameter(static_cast(params[i])); } oss << ") {\n"; for (auto* s : meth->getChildren("body")) oss << " " << generate(s) << "\n"; oss << "}"; return oss.str(); } std::string visitNullLiteral(const NullLiteral* /*lit*/) override { return "NULL"; } std::string visitStringLiteral(const StringLiteral* lit) override { return "\"" + lit->value + "\""; } std::string visitTypeAlias(const ASTNode* node) override { auto* ta = static_cast(node); return "typedef " + ta->targetType + " " + ta->aliasName + ";"; } std::string visitEnumDeclaration(const ASTNode* node) override { auto* e = static_cast(node); std::ostringstream oss; oss << "enum " << e->name << " { "; auto members = e->getChildren("members"); for (size_t i = 0; i < members.size(); ++i) { auto* m = static_cast(members[i]); if (i > 0) oss << ", "; oss << m->name; if (!m->value.empty()) oss << " = " << m->value; } oss << " };"; return oss.str(); } std::string visitIncludeDirective(const ASTNode* node) override { auto* inc = static_cast(node); if (inc->isSystem) return "#include <" + inc->path + ">"; return "#include \"" + inc->path + "\""; } std::string visitPragmaDirective(const ASTNode* node) override { auto* p = static_cast(node); return "#pragma " + p->directive; } std::string visitMacroDefinition(const ASTNode* node) override { auto* m = static_cast(node); std::ostringstream oss; oss << "#define " << m->name; if (m->isFunctionLike) { oss << "("; for (size_t i = 0; i < m->parameters.size(); ++i) { if (i > 0) oss << ", "; oss << m->parameters[i]; } oss << ")"; } if (!m->body.empty()) oss << " " << m->body; return oss.str(); } };