在编译器构造中实现类型系统

Implementation of a type system in compiler construction

提问人:DisplayName 提问时间:11/15/2023 更新时间:11/15/2023 访问量:44

问:

我正在研究一个愚蠢的小编译器。我现在在 AST 创建步骤中,我无法弄清楚如何处理类型检查。

编译器将代码“分解”为基本类型,如整数和浮点数。所有不是基本类型的内容都被视为基本类型/其他自定义类型的聚合,我从各种书籍中得到这部分。
但是,我能够找到并理解的所有关于类型检查的信息都非常模糊,并且仅涵盖基本情况,例如“如果允许左类型是 int 并且允许右类型是 int 操作,否则尝试强制转换类型,如果强制转换失败抛出错误”。

那么,应该如何存储有关类型的信息呢?

假设有代码(C族语法)

struct thing
{
   int a;
   short int b;
   some_struct * st;
}

AST 形式的结构声明应包含类似内容的内容,省略技术细节,如源位置、行号等。

name:thing
type:struct
fields:[{name:a, type:int}, {name:b, type:short int},{name:st, type:some_struct*}]

但。。。接下来呢?有关字段和函数的信息应该放在某个不同的、单独的容器中吗?或者它应该是符号表的一部分?
如果 struct 继承自其他结构,如何处理这种情况?引用类型?还是应该参考父母的声明?

我试着读《龙书》。对我来说太复杂了。
谷歌搜索只返回非常基本的信息

编译器构造 类型系统

评论

0赞 user207421 11/15/2023
试试《绿龙》一书。太宽泛了。
0赞 500 - Internal Server Error 11/15/2023
假设编译器采用面向对象的实现语言,您将拥有一个名为 的类,以及用于基本内置类型(如 、 等)的编译器构建的该类型的实例。用户定义类型(如结构)将分别获得一个具有类型名称和字段列表的新实例,每个实例都具有对基础字段类型的引用。这有帮助吗?typeintfloattype
0赞 n. m. could be an AI 11/15/2023
一次有太多问题。首先找出语言中基元类型的规则。如果你不想,你不必进行隐式类型转换,或者如果你有隐式类型转换,它们不需要像在其他语言中那样工作(C 我在看着你)。选择并实施自己的规则。以后担心用户定义的类型。
0赞 DisplayName 11/15/2023
@500-InternalServerError不完全是。我问的是类/结构类型STORAGE。我已经有了基本类型,但我不知道如何存储和检索解析的类型。
0赞 500 - Internal Server Error 11/15/2023
类型信息只是与变量、常量、函数等一起存储在符号表中的另一类数据。

答: 暂无答案