Make a few more things classes.

This commit is contained in:
Danila Fedorin 2020-09-17 18:30:41 -07:00
parent 5e13047846
commit 7a631b3557
7 changed files with 54 additions and 49 deletions

View File

@ -415,7 +415,7 @@ void compile_case(const ast_case& node, const env_ptr& env, const type* type, st
void ast_case::compile(const env_ptr& env, std::vector<instruction_ptr>& into) const {
type_app* app_type = dynamic_cast<type_app*>(input_type.get());
type_data* data;
type_internal* internal;
type_base *base;
of->compile(env, into);
into.push_back(instruction_ptr(new instruction_eval()));
@ -423,11 +423,11 @@ void ast_case::compile(const env_ptr& env, std::vector<instruction_ptr>& into) c
if(app_type && (data = dynamic_cast<type_data*>(app_type->constructor.get()))) {
compile_case<case_strategy_data>(*this, env, data, into);
return;
} else if(app_type && (internal = dynamic_cast<type_internal*>(app_type->constructor.get()))) {
if(internal->name == "Bool") {
compile_case<case_strategy_bool>(*this, env, data, into);
return;
}
} else if (app_type && (base = dynamic_cast<type_base *>(app_type->constructor.get()))) {
if (base->name == "Bool") {
compile_case<case_strategy_bool>(*this, env, data, into);
return;
}
}
throw type_error("attempting unsupported case analysis", of->loc);

View File

@ -16,13 +16,12 @@
#include "llvm/Target/TargetMachine.h"
void compiler::add_default_types() {
global_env->bind_type("Int", type_ptr(new type_internal("Int")));
global_env->bind_type("Bool", type_ptr(new type_internal("Bool")));
global_env->bind_type("Int", type_ptr(new type_base("Int")));
global_env->bind_type("Bool", type_ptr(new type_base("Bool")));
}
void compiler::add_binop_type(binop op, type_ptr type) {
auto name = mng.new_mangled_name(op_action(op));
binop_names[op] = name;
global_env->bind(op_name(op), std::move(type), visibility::global);
global_env->set_mangled_name(op_name(op), name);
}
@ -53,7 +52,7 @@ void compiler::add_default_function_types() {
}
void compiler::parse() {
if(!driver.run_parse())
if(!driver())
throw compiler_error("failed to open file");
}
@ -78,7 +77,8 @@ void compiler::compile() {
}
void compiler::create_llvm_binop(binop op) {
auto new_function = ctx.create_custom_function(binop_names.at(op), 2);
auto new_function =
ctx.create_custom_function(global_env->get_mangled_name(op_name(op)), 2);
std::vector<instruction_ptr> instructions;
instructions.push_back(instruction_ptr(new instruction_push(1)));
instructions.push_back(instruction_ptr(new instruction_eval()));
@ -95,7 +95,8 @@ void compiler::create_llvm_binop(binop op) {
}
void compiler::create_llvm_bool(bool b) {
auto new_function = ctx.create_custom_function(b ? "True" : "False", 0);
auto new_function = ctx.create_custom_function(
global_env->get_mangled_name(b ? "True" : "False"), 0);
std::vector<instruction_ptr> instructions;
instructions.push_back(instruction_ptr(new instruction_pushint(b)));
instructions.push_back(instruction_ptr(new instruction_update(0)));
@ -158,7 +159,7 @@ void compiler::output_llvm(const std::string& into) {
compiler::compiler(const std::string& filename)
: file_m(), global_defs(), driver(file_m, global_defs, filename),
mng(), global_scp(mng), global_env(new type_env), type_m(), ctx() {
global_env(new type_env), type_m(), mng(), global_scp(mng), ctx() {
add_default_types();
add_default_function_types();
}

View File

@ -10,14 +10,13 @@
class compiler {
private:
std::map<binop, std::string> binop_names;
file_mgr file_m;
definition_group global_defs;
parse_driver driver;
mangler mng;
global_scope global_scp;
type_env_ptr global_env;
type_mgr type_m;
mangler mng;
global_scope global_scp;
llvm_context ctx;
void add_default_types();

View File

@ -65,8 +65,8 @@ void definition_data::insert_constructors() const {
for(auto& var : vars) {
if(var_set.find(var) != var_set.end())
throw compiler_error(
std::string("type variable ") +
var + std::string(" used twice in data type definition."), loc);
"type variable " + var +
" used twice in data type definition.", loc);
var_set.insert(var);
return_app->arguments.push_back(type_ptr(new type_var(var)));
}

View File

@ -7,38 +7,43 @@
using maybe_location = std::optional<yy::location>;
struct compiler_error : std::exception {
std::string description;
maybe_location loc;
class compiler_error : std::exception {
private:
std::string description;
maybe_location loc;
compiler_error(std::string d, maybe_location l = std::nullopt)
: description(std::move(d)), loc(std::move(l)) {}
public:
compiler_error(std::string d, maybe_location l = std::nullopt)
: description(std::move(d)), loc(std::move(l)) {}
const char* what() const noexcept override;
const char* what() const noexcept override;
void print_about(std::ostream& to);
void print_location(std::ostream& to, file_mgr& fm, bool highlight = false);
void print_about(std::ostream& to);
void print_location(std::ostream& to, file_mgr& fm, bool highlight = false);
void pretty_print(std::ostream& to, file_mgr& fm);
void pretty_print(std::ostream& to, file_mgr& fm);
};
struct type_error : compiler_error {
std::optional<yy::location> loc;
class type_error : compiler_error {
private:
type_error(std::string d, maybe_location l = std::nullopt)
: compiler_error(std::move(d), std::move(l)) {}
public:
type_error(std::string d, maybe_location l = std::nullopt)
: compiler_error(std::move(d), std::move(l)) {}
const char* what() const noexcept override;
void pretty_print(std::ostream& to, file_mgr& fm);
const char* what() const noexcept override;
void pretty_print(std::ostream& to, file_mgr& fm);
};
struct unification_error : public type_error {
type_ptr left;
type_ptr right;
class unification_error : public type_error {
private:
type_ptr left;
type_ptr right;
unification_error(type_ptr l, type_ptr r, maybe_location loc = std::nullopt)
: left(std::move(l)), right(std::move(r)),
public:
unification_error(type_ptr l, type_ptr r, maybe_location loc = std::nullopt)
: left(std::move(l)), right(std::move(r)),
type_error("failed to unify types", std::move(loc)) {}
void pretty_print(std::ostream& to, file_mgr& fm, type_mgr& mgr);
void pretty_print(std::ostream& to, file_mgr& fm, type_mgr& mgr);
};

View File

@ -45,7 +45,7 @@ void file_mgr::print_location(
stream.write(content + highlight_end, print_end - highlight_end);
}
bool parse_driver::run_parse() {
bool parse_driver::operator()() {
FILE* stream = fopen(file_name.c_str(), "r");
if(!stream) return false;
yyscan_t scanner;

View File

@ -41,16 +41,16 @@ class parse_driver {
file_mgr* file_m;
public:
parse_driver(
file_mgr& mgr,
definition_group& defs,
const std::string& file)
: file_name(file), file_m(&mgr), global_defs(&defs) {}
parse_driver(
file_mgr& mgr,
definition_group& defs,
const std::string& file)
: file_name(file), file_m(&mgr), global_defs(&defs) {}
bool run_parse();
yy::location& get_current_location();
file_mgr& get_file_manager() const;
definition_group& get_global_defs() const;
bool operator()();
yy::location& get_current_location();
file_mgr& get_file_manager() const;
definition_group& get_global_defs() const;
};
#define YY_DECL yy::parser::symbol_type yylex(yyscan_t yyscanner, parse_driver& drv)