compiler-construction - 有人可以将伪代码解释为更简单的语言吗?
问题描述
有人能解释一下这个伪代码是什么意思吗?我真的不明白,因为我不熟悉这种类型的写作。
我还需要制作激活树。如果你能指导我,那就太好了。
(1) program ret (input, output) ;
(2) var f: function (integer): integer;
(3) function a : function (integer): integer ;
(4) var m : integer ;
(5) function addm(n: integer) : integer;
(6) begin return m + n end;
(7) begin m := 0; return addm end;
(8) procedure b(g: function (integer) : integer);
(9) begin writeln(g(2)) end;
(10) begin
(11) f := a ; b (f)
(12) end
解决方案
实际上,这并不是真正的伪代码,而是简单的 Pascal 编码。但是,如果您正在学习编译器课程,我希望您的导师以前使用过这样的示例。但是,在从问题表中转录此示例时,您犯了一些错误!
此示例说明了嵌套函数调用以及范围问题以及编译器需要在目标代码中维护以启用变量访问和递归功能的必要堆栈激活记录。
在嵌套方面,您有:
ret
一个称为执行输入和输出的主程序。其中嵌套:f
当前未分配的函数变量a
一个包含以下内容的函数:m
一个整数变量- 一个名为的函数
addm
一个名为的函数
b
在主程序中,过程变量
f
被赋予函数体a
通过函数
b
变量调用该函数f
函数按值
b
获取函数变量f
,其中包含a
局部函数变量中的函数g
。g
使用参数 2 调用a
,使用该值调用a
接收值 2addm
被调用来计算返回值a
addm
计算m + n
=0 + 2
> 2- 2 被退回
a
现在返回 2
g
现在返回 2writeln
现在输出 2b
返回
程序完成执行
现在可以更详细地检查显示每个堆栈激活记录的内容,但我将省略该级别的详细信息。
推荐阅读
- python - Python timeit 模块导致无限循环
- javascript - Fullcalendar:在 dayGrid 视图中单击按钮时删除事件
- c# - 在来自 android 的 WCF 多部分数据图像中,特定图像未从服务器获得任何响应(已上传 20 张图像中的 15 张)
- python - sqlalchemy.exc.OperationalError:无法在 docker 中连接到 mysql
- if-statement - 如何使用主动下拉发布以过滤显示的数据?
- java - 如何使用“预测”Sgnature Def 在 Java 中加载 Tensorflow SavedModel?
- sql-server - 如何显示 DISTINCT 值 Group Wise
- c# - 在 .NET 核心中返回 HttpResponseMessage 时出错
- android - 更新到 androidx.appcompat:appcompat:1.1.0 后的语言更改问题
- hibernate - 在 Quarkus 中添加 Hibernate ORM Panache 时在测试中发生异常