编译Pascal函数返回值赋值

sam*_*m46 1 compiler-construction haskell pascal semantics

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

function foo : integer;
begin
    foo := 12
end;    
Run Code Online (Sandbox Code Playgroud)

我如何处理这些,因为语法不区分它们和任何其他常规赋值语句?
是否应修改AST以特别突出显示返回值分配?

以及如何在类型检查阶段处理它们(环境包含函数签名和一堆上下文的符号表到目前为止已足够)?

Mar*_*ort 5

作业可能会多次发生,而Delphi方言也允许阅读.

最好的方法是简单地将函数声明视为声明返回变量的隐式变量,并声明其类型.

然后,您可以分配和读取它,并在过程出口点(过程/函数结束或EXIT关键字)上将值从隐式变量复制到用于返回值的寄存器中.

如果返回值是复数(array,struct)并且不适合寄存器,则典型的解决方案是通过隐式var参数传递返回值.然后,您可以直接将该位置用于返回变量.

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