Hydrogen/include/types.hpp
2025-06-05 21:29:46 +08:00

86 lines
2.1 KiB
C++

#pragma once
#include <string>
#include <vector>
#include "syntax/token.h"
enum type_kind {
TYPE_BOOL = 1,
TYPE_INT8,
TYPE_UINT8, // uint8 ~ int 的顺序不可变,用于隐式类型转换
TYPE_INT16,
TYPE_UINT16,
TYPE_INT32,
TYPE_UINT32, // value=10
TYPE_INT64,
TYPE_UINT64,
TYPE_FLOAT32,
TYPE_FLOAT64, // value = 5
// 复合类型
TYPE_STRING,
TYPE_VEC,
TYPE_MAP, // value = 20
TYPE_TUPLE,
TYPE_STRUCT,
TYPE_FN, // 具体的 fn 类型
TYPE_FN_T, // 底层类型
TYPE_INTEGER_T, // 底层类型
TYPE_FLOATER_T, // 底层类型
TYPE_ALL_T, // 通配所有类型
TYPE_VOID, // 表示函数无返回值
TYPE_UNKNOWN, // var a = 1, a 的类型就是 unknown
TYPE_RAW_STRING, // c 语言中的 string, 目前主要用于 lir 中的 string imm
// TYPE_ALIAS, // 声明一个新的类型时注册的 type 的类型是这个
// TYPE_PARAM, // type formal param type foo<f1, f2> = f1|f2, 其中 f1 就是一个 param
TYPE_IDENT,
};
// 语法分析扫描器指证
struct scanner_cursor_t {
std::string source;
std::string::size_type current;
std::string::size_type guard;
int length;
int line; // 扫描器当前所在的行
int column; // 扫描器当前所在的列
char space_prev; // 记录空行,注释前的上一个字符
char space_next;
};
struct parser_cursor_t {
std::vector<token_t> tokens;
std::string::size_type current;
};
struct module_t {
std::string source;
// 在语法分析中需要用到的变量
scanner_cursor_t s_cursor;
std::vector<token_t> token_list;
// 在语义分析中需要用到的变量
parser_cursor_t parser_cursor;
module_t(std::string source)
: source(source) {
s_cursor.source = source;
s_cursor.line = 1;
s_cursor.column = 1;
s_cursor.length = 0;
s_cursor.current = 0;
s_cursor.guard = 0;
s_cursor.space_prev = '\0';
s_cursor.space_next = '\0';
}
};