#include "cxx_codegen.hh" #include "codegen.hh" #include "ast.hh" #include using namespace ast; using namespace codegen; using namespace std; typedef void (*emitter_t)(ast::DProg *dprog, const char *output_name); struct EmitterEntry { const char *name; emitter_t emitter; }; static EmitterEntry emitter_table[] = { { "C++", cxx_emit_code }, { 0 }, // sentinel }; // build list of supported languages static vector * init_list() { vector *lang_list = new vector; EmitterEntry *i; for (i = emitter_table; i->name != 0; ++i) lang_list->push_back(i->name); return lang_list; } // build table mapping languages to emitters static map * init_table() { map *table = new map; EmitterEntry *i; for (i = emitter_table; i->name != 0; ++i) (*table)[i->name] = i->emitter; return table; } static vector *lang_list = init_list(); static map *emitters = init_table(); const vector & codegen::supported() { return *lang_list; } bool codegen::supported(const string &lang) { return (emitters->find(lang) != emitters->end()); } void codegen::emit_code(const string &lang, DProg *dprog, const char *output_name) { if (supported(lang)) (*emitters)[lang](dprog, output_name); else cerr << "Backend language \"" << lang << "\" not supported.\n"; }