Add a struct to contain groups of mutually recursive definitions.

This commit is contained in:
Danila Fedorin 2020-05-25 22:11:45 -07:00
parent 71bc55c696
commit 5b6378c9e4
3 changed files with 14 additions and 10 deletions

View File

@ -1,6 +1,7 @@
#pragma once
#include <memory>
#include <vector>
#include <map>
#include <set>
#include "instruction.hpp"
#include "llvm_context.hpp"
@ -70,3 +71,8 @@ struct definition_data {
};
using definition_data_ptr = std::unique_ptr<definition_data>;
struct definition_group {
std::map<std::string, definition_data_ptr> defs_data;
std::map<std::string, definition_defn_ptr> defs_defn;
};

View File

@ -21,8 +21,7 @@ void yy::parser::error(const std::string& msg) {
std::cout << "An error occured: " << msg << std::endl;
}
extern std::map<std::string, definition_data_ptr> defs_data;
extern std::map<std::string, definition_defn_ptr> defs_defn;
extern definition_group global_defs;
void typecheck_program(
const std::map<std::string, definition_data_ptr>& defs_data,
@ -180,7 +179,7 @@ int main() {
type_env_ptr env(new type_env);
parser.parse();
for(auto& def_defn : defs_defn) {
for(auto& def_defn : global_defs.defs_defn) {
std::cout << def_defn.second->name;
for(auto& param : def_defn.second->params) std::cout << " " << param;
std::cout << ":" << std::endl;
@ -188,9 +187,9 @@ int main() {
def_defn.second->body->print(1, std::cout);
}
try {
typecheck_program(defs_data, defs_defn, mgr, env);
compile_program(defs_defn);
gen_llvm(defs_data, defs_defn);
typecheck_program(global_defs.defs_data, global_defs.defs_defn, mgr, env);
compile_program(global_defs.defs_defn);
gen_llvm(global_defs.defs_data, global_defs.defs_defn);
} catch(unification_error& err) {
std::cout << "failed to unify types: " << std::endl;
std::cout << " (1) \033[34m";

View File

@ -7,8 +7,7 @@
#include "parser.hpp"
#include "parsed_type.hpp"
std::map<std::string, definition_data_ptr> defs_data;
std::map<std::string, definition_defn_ptr> defs_defn;
definition_group global_defs;
extern yy::parser::symbol_type yylex();
@ -63,8 +62,8 @@ definitions
;
definition
: defn { auto name = $1->name; defs_defn[name] = std::move($1); }
| data { auto name = $1->name; defs_data[name] = std::move($1); }
: defn { auto name = $1->name; global_defs.defs_defn[name] = std::move($1); }
| data { auto name = $1->name; global_defs.defs_data[name] = std::move($1); }
;
defn