编译Pascal函数返回值分配

时间:2018-07-28 22:23:45

标签: haskell compiler-construction pascal semantics

我正在用Haskell编写玩具Pascal编译器。我可以生成带有类型注释的AST。 我一直在忽略函数的返回值分配:

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

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

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

1 个答案:

答案 0 :(得分:5)

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

最好是将函数声明简单地当作是为返回变量声明其隐式类型的隐式变量。

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

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

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