BIT 2024 编译原理 Lab. 4 四代编译器实验说明和要求

实验四:四代编译器实验

一、实验要求

详细实验要求请参考文件《Lab4实验说明和要求.pdf》。

二、实验思路

1、与 lab3 的对比

如果你在 lab3 就已经像我一样单独写了个函数处理表达式,那么理论上,lab4 相比于 lab3,不过就是多了对 ifwhile 等语句的处理,而其他部分几乎不需要任何改变!

这样一来,lab4 就非常简单了。因此,本文是基于 lab3 的代码上进行修改,关于 lab3 的文章在这里:http://t.csdnimg.cn/sQcsP

2、函数的划分

现在,不能简单地通过 } 的出现位置来区分不同的函数块,这是因为函数内的 ifwhile 语句块通常也会出现 }.

如果你仍然希望实现预先对函数进行划分,一种可行的做法是:维护一个变量 left_brace_minus_right_brace,它等于 左大括号的数量-右大括号的数量,当且仅当 } 的位置满足left_brace_minus_right_brace = 0 时,表明这个 } 用于划分函数是有效的。

3、句子的识别

现在,句子不总是以 ; 作为结尾,因为 ifwhile 语句块通常以 } 结尾,这意味着仅使用 ; 分割两个句子是不完全正确的。为了解决这个问题,你需要添加一些其他的条件判断。

4、句子的处理

注意:这里仅提供我的方法,实际上你应该结合自己的理解和自己的代码进行修改!

对于 ifwhile ,你觉得一个句子应该在什么地方进行划分?

我这里的做法简单来说,是按照有效的 } 进行划分,我举一个例子。有如下代码:

if ( a>3 ) {if ( a<10 ) {println_int(a);}while ( a<b ) {println_int(b);a=a+1;}
}

那么,对于上面的例子,我认为

if (a>3) { if (a<10) { println_int(a); } while (a<b) { println_int(b); a=a+1; } }Δ																		Δ

是一个句子。在这个句子中,含有两个子句,它们分别是

if (a<10) { println_int(a); }Δ					Δ
while (a<b) { println_int(b); a=a+1; }Δ					 	 Δ

对于前者,它又含有一个子句

println_int(a);

对于后者,它含有两个子句,分别是

println_int(b);
a=a+1;

这样的结构,令我想到了递归。显然,如同我在 lab3 中单独写一个函数处理表达式,现在,我要单独写一个函数处理句子

对于一个句子,直接调用该函数;如果句子内部又含有句子,则递归调用这个函数。

说实话,到这个时候,我也不敢说自己的做法是不是高明,所以请你自己思考一下,你会用什么样的方法来处理 ifwhile 的语句块?

5、if 对应的汇编语句

if 语句处理十分简单,它的代码结构一定是:

if ( 表达式 ) {一些句子
}

对应的汇编是:

if结构

6、while 对应的汇编语句

while 语句处理相比于 if 稍微复杂一些,我们先不考虑 continuebreak,它的代码结构一定是:

while ( 表达式 ) {一些句子
}

对应的汇编是:

while结构

while 的内部每多一个 continue,就多一对 jump,如下图所示:(可以交换 jump1:jump3:

continue结构

while 的内部每多一个 break,就多一对 jump,如下图所示:(可以交换jump2:jump4:

break结构

你最好先理解了再写代码,不然写起来会很费劲的。

三、实验注意

  1. 该部分主要阐述本人在做该实验时踩过的坑

  2. 提交方式:和 lab3 一样

  3. 任何跳转的入口名都不能一样,例如有汇编语句:

    ...
    je .L_while_end_1	# 入口名一样
    ...
    je .L_while_end_1	# 入口名一样
    ...
    .L_while_end_1:... 
    

    这样写就会报错。

  4. 局部变量

    这里指的是 ifwhile 内部定义的变量,例如:

    if (a==b) {int c;c = a+b;println_int(c);
    }
    

    有时候,你可能需要注意对这种变量的处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/21208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ComfyUi安装OOTDiffusion插件的diffusers版本问题

OOTDiffusion换装 在github上有近5K的star了&#xff08;https://github.com/levihsu/OOTDiffusion&#xff09;。 diffusers版本问题 最新版是0.27.2&#xff0c;不能低于0.25&#xff0c;但是OOT换装需要0.24&#xff0c;否则会报错&#xff1a; ComfyUI\custom_nodes\Comf…

系统架构设计师【第14章】: 云原生架构设计理论与实践 (核心总结)

文章目录 14.1 云原生架构产生背景14.2 云原生架构内涵14.2.1 云原生架构定义14.2.2 云原生架构原则14.2.3 主要架构模式14.2.4 典型的云原生架构反模式 14.3 云原生架构相关技术14.3.1 容器技术14.3.2 云原生微服务14.3.3 无服务器技术14.3.4 服务网格 14.4 云原生…

HTML+CSS 文本动画卡片

效果演示 实现了一个图片叠加文本动画效果的卡片&#xff08;Card&#xff09;布局。当鼠标悬停在卡片上时&#xff0c;卡片上的图片会变为半透明&#xff0c;同时显示隐藏在图片上的文本内容&#xff0c;并且文本内容有一个从左到右的渐显动画效果&#xff0c;伴随着一个白色渐…

YOLOV10训练自己的数据集

*************************************************** 码字不易&#xff0c;收藏之余&#xff0c;别忘了给我点个赞吧&#xff01; *************************************************** Start YOLOV10训练自己的数据集 官方论文&#xff1a;https://arxiv.org/abs/2405…

使用busybox快速创建rootfs系统(硬件:atk-dl6y2c)

目录 概述 1 编译busybox 1.1 配置Makefile 1.2 需改参数 1.3 配置busybox 1.4 编译busybox 2 完善 rootfs下文件 2.1 rootfs 的“/lib”目录添加库文件 2.2 rootfs 的“usr/lib”目录添加库文件 2.3 创建其他目录 3 完善其他文件 3.1 完善etc/init.d/rcS 3.2 完善…

Golang | Leetcode Golang题解之第128题最长连续序列

题目&#xff1a; 题解&#xff1a; func longestConsecutive(nums []int) int {numSet : map[int]bool{}for _, num : range nums {numSet[num] true}longestStreak : 0for num : range numSet {if !numSet[num-1] {currentNum : numcurrentStreak : 1for numSet[currentNum…

【CMake】CMake入门(五)打包安装程序 使用CMake管理库 打包调试版和发行版

本篇文章不是新手入门教学文章&#xff0c;主要是记录笔者个人的学习笔记 CMake入门&#xff08;五&#xff09; 一、打包二、使用CMake管理库三、打包调试版和发行版 一、打包 发布程序可以有多种形式&#xff0c;比如安装包、压缩包、源文件等。CMake也提供了打包程序cpack可…

金钱的认知,你如何理解呢?

金钱的认知 建立在金钱之上的爱情是纯真的爱&#xff0c;朋友关系也才够纯粹&#xff0c;才是单纯的世界&#xff0c;反之没了钱的条件爱情和友情的美好关系极易破碎&#xff0c;也极易反目成仇。 心若美好钱就美好&#xff0c;心有欲望狰狞钱就是只咬人的老虎&#xff0c;钱…

Linux 僵尸进程和孤儿进程

一.Z(zombie)-僵尸进程 1.僵死状态&#xff08;Zombies&#xff09;是一个比较特殊的状态。当进程退出并且父进程&#xff08;使用wait()系统调用后&#xff09;没有读取到子进程退出的返回代码时就会产生僵死(尸)进程 2.僵死进程会以终止状态保持在进程表中&#xff0c;并且会…

Java17 --- SpringCloud之seate

目录 一、创建seata需要的mysql数据库表 二、修改seata的配置文件 三、启动nacos及seata 四、创建需要的数据库及表 一、创建seata需要的mysql数据库表 CREATE DATABASE seata;CREATE TABLE IF NOT EXISTS global_table(xid VARCHAR(128) NOT NULL,…

C++ | Leetcode C++题解之第128题最长连续序列

题目&#xff1a; 题解&#xff1a; class Solution { public:int longestConsecutive(vector<int>& nums) {unordered_set<int> num_set;for (const int& num : nums) {num_set.insert(num);}int longestStreak 0;for (const int& num : num_set) {…

隐马尔可夫链

1 马尔可夫链 马尔科夫链&#xff08;Markov Chain&#xff09;是一种数学模型&#xff0c;它描述了一系列可能事件的概率&#xff0c;其中每个事件的发生仅依赖于前一个事件的状态。这一特性称为“无记忆性”或“马尔可夫性质”。我将用一个简单的天气预测模型作为例子来解释马…

T-Pot多功能蜜罐实践@debian12@FreeBSD

T-Pot介绍 T-Pot是一个集所有功能于一身的、可选择分布式的多构架&#xff08;amd64&#xff0c;arm64&#xff09;蜜罐平台&#xff0c;支持20多个蜜罐和很多可视化选项&#xff0c;使用弹性堆栈、动画实时攻击地图和许多安全工具来进一步改善欺骗体验。GitHub - telekom-sec…

SpringBootWeb登录认证

JWT令牌 JSON Web Token JSON Web Tokens - jwt.ioJSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is digitally signed using JSON Web Signatur…

文件系统和日志分析

文件系统 概述 文件是存储在硬盘上的。硬盘上的最小存储单位是扇区&#xff0c;每个扇区的大小是512字节。 inode号&#xff1a;又叫索引号&#xff0c;保存的是元信息&#xff08;主要有文件的属性 &#xff1a;包括权限&#xff0c;创建者&#xff0c;创建日期等&#xff…

Renesas MCU之使用e² studio搭建开发环境

目录 概述 1 e studio介绍 2 搭建Renesas MUC开发环境 2.1 软件版本信息 2.2 安装软件 3 创建工程 3.1 板卡硬件接口 3.2 FSP配置IO 4 Generate Project 4.1 项目目录介绍 4.2 LED接口相关驱动 5 调试 5.1 测试代码 5.2 J-Link调试代码 5.3 硬件结构 概述 本文主…

ES6-01-简介

一、什么是ES6&#xff1f; 每年一个版本o(╥﹏╥)o。 二、javaScript新特性的特点 1、语法简洁&#xff0c;功能丰富&#xff1b; 2、框架开发应用。 3、岗位需求&#xff01; 三、let关键字 3-1、声明变量 let a;let a,b;let e100;let f521, gmilk-love, h[]; 3-2、声明的…

python采集汽车价格数据

python采集汽车价格数据 一、项目简介二、完整代码一、项目简介 本次数据采集的目标是车主之家汽车价格数据,采集的流程包括寻找数据接口、发送请求获取响应、解析数据和持久化存储,先来看一下数据情况,完整代码附后: 二、完整代码 #输入请求页面url #返回html文档 imp…

属性(property)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 1 创建用于计算的属性 在Python中&#xff0c;可以通过property&#xff08;装饰器&#xff09;将一个方法转换为属性&#xff0c;从而实现用于计算…

几种更新 npm 项目依赖的实用方法

引言 在软件开发的过程中&#xff0c;我们知道依赖管理是其中一个至关重要的环节。npm&#xff08;Node Package Manager&#xff09; 是 Node.js 的包管理器&#xff0c;它主要用于 Node.js 项目的依赖管理和包发布。随着项目的不断发展&#xff0c;依赖库的版本更新和升级成…