Factor out definition into separate file in compiler series

This commit is contained in:
Danila Fedorin 2019-11-05 10:40:51 -08:00
parent ba807cb7bc
commit b3cee61b61
6 changed files with 68 additions and 56 deletions

View File

@ -43,27 +43,6 @@ struct branch {
using branch_ptr = std::unique_ptr<branch>; using branch_ptr = std::unique_ptr<branch>;
struct constructor {
std::string name;
std::vector<std::string> types;
constructor(std::string n, std::vector<std::string> ts)
: name(std::move(n)), types(std::move(ts)) {}
};
using constructor_ptr = std::unique_ptr<constructor>;
struct definition {
virtual ~definition() = default;
virtual void typecheck_first(type_mgr& mgr, type_env& env) = 0;
virtual void typecheck_second(type_mgr& mgr, const type_env& env) const = 0;
virtual void resolve(const type_mgr& mgr) = 0;
virtual void compile() = 0;
};
using definition_ptr = std::unique_ptr<definition>;
struct ast_int : public ast { struct ast_int : public ast {
int value; int value;
@ -160,37 +139,3 @@ struct pattern_constr : public pattern {
void print(std::ostream &to) const; void print(std::ostream &to) const;
void match(type_ptr t, type_mgr&, type_env& env) const; void match(type_ptr t, type_mgr&, type_env& env) const;
}; };
struct definition_defn : public definition {
std::string name;
std::vector<std::string> params;
ast_ptr body;
type_ptr return_type;
std::vector<type_ptr> param_types;
std::vector<instruction_ptr> instructions;
definition_defn(std::string n, std::vector<std::string> p, ast_ptr b)
: name(std::move(n)), params(std::move(p)), body(std::move(b)) {
}
void typecheck_first(type_mgr& mgr, type_env& env);
void typecheck_second(type_mgr& mgr, const type_env& env) const;
void resolve(const type_mgr& mgr);
void compile();
};
struct definition_data : public definition {
std::string name;
std::vector<constructor_ptr> constructors;
definition_data(std::string n, std::vector<constructor_ptr> cs)
: name(std::move(n)), constructors(std::move(cs)) {}
void typecheck_first(type_mgr& mgr, type_env& env);
void typecheck_second(type_mgr& mgr, const type_env& env) const;
void resolve(const type_mgr& mgr);
void compile();
};

View File

@ -1,5 +1,6 @@
#include "ast.hpp" #include "definition.hpp"
#include "error.hpp" #include "error.hpp"
#include "ast.hpp"
void definition_defn::typecheck_first(type_mgr& mgr, type_env& env) { void definition_defn::typecheck_first(type_mgr& mgr, type_env& env) {
return_type = mgr.new_type(); return_type = mgr.new_type();

63
08/definition.hpp Normal file
View File

@ -0,0 +1,63 @@
#pragma once
#include <memory>
#include <vector>
#include "instruction.hpp"
#include "type_env.hpp"
struct ast;
using ast_ptr = std::unique_ptr<ast>;
struct definition {
virtual ~definition() = default;
virtual void typecheck_first(type_mgr& mgr, type_env& env) = 0;
virtual void typecheck_second(type_mgr& mgr, const type_env& env) const = 0;
virtual void resolve(const type_mgr& mgr) = 0;
virtual void compile() = 0;
};
using definition_ptr = std::unique_ptr<definition>;
struct constructor {
std::string name;
std::vector<std::string> types;
constructor(std::string n, std::vector<std::string> ts)
: name(std::move(n)), types(std::move(ts)) {}
};
using constructor_ptr = std::unique_ptr<constructor>;
struct definition_defn : public definition {
std::string name;
std::vector<std::string> params;
ast_ptr body;
type_ptr return_type;
std::vector<type_ptr> param_types;
std::vector<instruction_ptr> instructions;
definition_defn(std::string n, std::vector<std::string> p, ast_ptr b)
: name(std::move(n)), params(std::move(p)), body(std::move(b)) {
}
void typecheck_first(type_mgr& mgr, type_env& env);
void typecheck_second(type_mgr& mgr, const type_env& env) const;
void resolve(const type_mgr& mgr);
void compile();
};
struct definition_data : public definition {
std::string name;
std::vector<constructor_ptr> constructors;
definition_data(std::string n, std::vector<constructor_ptr> cs)
: name(std::move(n)), constructors(std::move(cs)) {}
void typecheck_first(type_mgr& mgr, type_env& env);
void typecheck_second(type_mgr& mgr, const type_env& env) const;
void resolve(const type_mgr& mgr);
void compile();
};

View File

@ -1,5 +1,6 @@
#include "ast.hpp" #include "ast.hpp"
#include <iostream> #include <iostream>
#include "definition.hpp"
#include "parser.hpp" #include "parser.hpp"
#include "error.hpp" #include "error.hpp"
#include "type.hpp" #include "type.hpp"

View File

@ -2,6 +2,7 @@
#include <string> #include <string>
#include <iostream> #include <iostream>
#include "ast.hpp" #include "ast.hpp"
#include "definition.hpp"
#include "parser.hpp" #include "parser.hpp"
std::vector<definition_ptr> program; std::vector<definition_ptr> program;

View File

@ -3,6 +3,7 @@
%{ %{
#include <iostream> #include <iostream>
#include "ast.hpp" #include "ast.hpp"
#include "definition.hpp"
#include "parser.hpp" #include "parser.hpp"
#define YY_DECL yy::parser::symbol_type yylex() #define YY_DECL yy::parser::symbol_type yylex()