86 lines
2.1 KiB
C++
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';
|
|
}
|
|
}; |