一个好的编程语言需要有一个好的类型系统
笔者计划为 XSharp 开发一个静态且可拓展的类型系统,其中支持基本类型(如i32,i64),数组,函数,Closure,类等类型及其复合
而复合的需求就意味着类型必须是多层次,且多种类型的形式,而树这种数据结构正好符合要求
于是TypeNode出现了
我们社设计具体类型的类型相关设置,从而构建不同的类型结构,如 ArrayType 有 elementType 的子类型,FunctionType 有 paramTypes 的子节点列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class TypeNode;
struct ArrayType { uint arrayDimension; TypeNode* elementType; };
struct FunctionType { std::vector<TypeNode*> paramTypes; TypeNode* returnValueType; };
|
而TypeNode则用枚举Category表示类型的范畴,即类型相关的类型设置(typeSpecifiedInfo)的范畴
从而确定 TypeNode 的类型结构,使用std::variant使存储多种类型相关设置成为可能
搭配上Category,就可根据category解析 variant 类型的typeSpecifiedInfo,获得具体的类型信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class TypeNode { public: TypeNode(); TypeNode(const TypeNode& other); ~TypeNode(); bool equals(const TypeNode& other) const;
BasicType basicType() const;
TypeNode* returnValueType() const; std::vector<TypeNode*> paramsType() const;
uint arrayDimension() const; TypeNode* elementType() const;
XString typeName() const;
uint typeID; XString baseName; bool isConst; enum Categories { Basic, Array, Function, Closure, Class } category;
std::variant<BasicType, ClassType, FunctionType, ArrayType, ClosureType> typeSpecifiedInfo; };
|
同时注意到typeID,我们将会在编译时为特定类型分配唯一(unique)的 typeID,并通过 typeID 实现运行时反射
在 TypeSystem 中我们将实现这一功能