作者:手机用户2602925995 | 来源:互联网 | 2022-12-09 12:28
我正在Haskell中编写一个玩具Pascal编译器.我可以生成一个带类型注释的AST.我一直在忽略函数返回值赋值:
function foo : integer;
begin
foo := 12
end;
我如何处理这些,因为语法不区分它们和任何其他常规赋值语句?
是否应修改AST以特别突出显示返回值分配?
以及如何在类型检查阶段处理它们(环境包含函数签名和一堆上下文的符号表到目前为止已足够)?
1> Marco van de..:
作业可能会多次发生,而Delphi方言也允许阅读.
最好的方法是简单地将函数声明视为声明返回变量的隐式变量,并声明其类型.
然后,您可以分配和读取它,并在过程出口点(过程/函数结束或EXIT关键字)上将值从隐式变量复制到用于返回值的寄存器中.
如果返回值是复数(array,struct)并且不适合寄存器,则典型的解决方案是通过隐式var参数传递返回值.然后,您可以直接将该位置用于返回变量.
后来添加:对于更高级的用户:嵌套在其他函数中的函数是在其父级声明之后,因此可以通过它们获得的帧指针访问其父级返回值.Pascal嵌套程序可能会相对复杂.