Start working on type code
This commit is contained in:
parent
cf3d2f5d8b
commit
11716f21e7
1
03/ast.cpp
Normal file
1
03/ast.cpp
Normal file
|
@ -0,0 +1 @@
|
||||||
|
#include "ast.hpp"
|
|
@ -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
25
03/type.cpp
Normal 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
39
03/type.hpp
Normal 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();
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user