编译 Pascal 函数 return 赋值

Compiling Pascal function return value assignment

我正在 Haskell 中编写玩具 Pascal 编译器。我可以生成带类型注释的 AST。 我一直忽略函数 return 赋值:

function foo : integer;
begin
    foo := 12
end;    

鉴于语法不区分它们和任何其他常规赋值语句,我该如何处理它们?
是否应修改 the AST 以专门突出显示 return 赋值?

以及如何在类型检查阶段处理它们(到目前为止,由函数签名和上下文堆栈组成的环境 Symbol table 就足够了)?

赋值可能发生多次,Delphi方言也允许读取。

最好的方法是将函数声明简单地视为声明 return 变量的隐式变量及其声明类型的东西。

然后你可以分配和读取它,并且在过程出口点(procedure/function 或 EXIT 关键字的结尾)你将值从隐式变量复制到用于 return 值的寄存器中.

如果 return 值是复数(数组、结构)并且不适合寄存器,典型的解决方案是通过隐式 var 参数传递 return 值。然后,您可以将该位置直接用于 return 变量。

稍后添加:对于更高级的用户:嵌套在其他函数中的函数在它们的父声明之后,因此可以通过它们获得的帧指针访问它们的父 return 值。 Pascal 嵌套过程可能会变得相对复杂。