Start working on type code

This commit is contained in:
Danila Fedorin 2019-08-25 01:36:34 -07:00
parent cf3d2f5d8b
commit 11716f21e7
4 changed files with 66 additions and 0 deletions

1
03/ast.cpp Normal file
View File

@ -0,0 +1 @@
#include "ast.hpp"

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <memory> #include <memory>
#include <vector> #include <vector>
#include "type.hpp"
struct ast { struct ast {
virtual ~ast() = default; virtual ~ast() = default;

25
03/type.cpp Normal file
View File

@ -0,0 +1,25 @@
#include "type.hpp"
#include <sstream>
#include <algorithm>
std::string type_mgr::new_type_name() {
std::ostringstream oss;
int temp = last_id++;
do {
oss << (char) ('a' + (temp % 26));
temp /= 26;
} while(temp);
std::string str = oss.str();
std::reverse(str.begin(), str.end());
return str;
};
type_ptr type_mgr::new_type() {
return type_ptr(new type_var(new_type_name()));
}
type_ptr type_mgr::new_arrow_type() {
return type_ptr(new type_arr(new_type(), new_type()));
}

39
03/type.hpp Normal file
View File

@ -0,0 +1,39 @@
#pragma once
#include <memory>
#include <map>
struct type {
virtual ~type() = default;
};
using type_ptr = std::shared_ptr<type>;
struct type_var : public type {
std::string name;
type_var(std::string n)
: name(std::move(n)) {}
};
struct type_id : public type {
int id;
type_id(int i)
: id(i) {}
};
struct type_arr : public type {
type_ptr left;
type_ptr right;
type_arr(type_ptr l, type_ptr r)
: left(std::move(l)), right(std::move(r)) {}
};
struct type_mgr {
int last_id = 0;
std::string new_type_name();
type_ptr new_type();
type_ptr new_arrow_type();
};