编译器的几乎所有部分都以某种方式处理数据类型。符号担心数据类型最多,这是大多数编译时类型检查是基于的。AST节点还具有数据类型,用于处理表达式(包括转换/转换)。
数据类型表示为以下组合:
- dtype整数
- 5位:原始类型:
- void(未知类型,例如:任何ptr,t类型t)
- byte, ubyte
- char(zstring指针及其deref表达式)
- short, ushort
- wchar(wstring指针及其deref表达式)
- integer, uinteger
- enum(整数)
- long, ulong
- longint, ulongint
- single, double
- string(可变长度)
- fixstr(固定长度字符串,string * N,N是类型的长度)
- struct(UDT, - >子类型)
- namespace(在名称变化期间使用?)
- function(用于函数指针, - >子类型包含完整的函数声明)
- forward reference(如果已知使用了 - >子类型,将会更改为实际的原始类型)
- pointer(此值仅作为typeGet()宏的结果暂时使用)
- xmmword(由SSE发射器使用)
- 4位:PTR计数
类型上有多少个PTR,最多8个。如果>0,那么数据类型是一个指针。
Example CONST mask
const integer 000000001 (first CONST bit set)
integer const ptr 000000001 (ditto)
const integer ptr 000000010 (pointer to const)
const integer ptr const ptr 000000101 (const pointer to pointer to const)
- subtype,其中某些类型指向符号:
- 对于UDT类型(结构体/类,枚举),它指向相应的UDT符号
- 对于前向引用的typedef,它指向一个特殊的前向引用符号,最终将被实际的子类型符号替换,当它是已知的。
- 对于过程指针,它指向进一步定义调用约定等级的匿名符号最重要的是结果和参数的类型。
- length整数
这用于必须计算大小的地方(例如,结构尺寸计算,指针算术,堆栈偏移)。