#pragma once #include #include #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 就是一个 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 tokens; std::string::size_type current; }; struct module_t { std::string source; // 在语法分析中需要用到的变量 scanner_cursor_t s_cursor; std::vector 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'; } };