初代编译器实验

news2024/11/25 12:25:57

 

 

        此文章用于记录第一次编译器实验的实践心得以及一些知识记录。

        次实验主要目的是将C语言代码转换成对应的汇编代码,这就涉及到对与表达式的处理。

        我们一般使用的表达式是中缀表达式,这对于我们人来说是比较好识别并且计算的。但对于机器,内部都是按照从左到右的顺序来处理表达式,所以在面对含有不同优先级的表达式时并不是很好处理,这时我们就需要把中缀表达式转换成后缀表达式,来便于计算机的运算。

中缀表达式转换为后缀表达式_中缀表达式转后缀表达式-CSDN博客

        这篇博客主要介绍了两种转换方法: 

使用栈的方法:(逆波兰算法)

括号法:

    vector<string> infixToPostfix(const vector<string>& tokens) {
        stack<string> ops;  // 运算符栈
        vector<string> postfix;  // 后缀表达式令牌
        for (int i = 0; i < tokens.size();i++) {
            if (isdigit(tokens[i][0]) || isalpha(tokens[i][0])) {  // 数字或变量直接输出
                postfix.push_back(tokens[i]);
            }
            else if (tokens[i] == "(") {
                ops.push(tokens[i]);
            }
            else if (tokens[i] == ")") {//弹出字符直到为空或者遇到左括号
                while (!ops.empty() && ops.top() != "(") {
                    postfix.push_back(ops.top());
                    ops.pop();
                }
                ops.pop();  // 弹出"("
            }
            else if (isOperator(tokens[i])) {
                while (!ops.empty() && isOperator(ops.top()) && getPrecedence(ops.top()) >= getPrecedence(tokens[i])) {
                    postfix.push_back(ops.top());
                    ops.pop();
                }
                ops.push(tokens[i]);  // 将当前运算符压入栈
            }
        }
        while (!ops.empty()) {
            postfix.push_back(ops.top());
            ops.pop();
        }
        return postfix;
    }

         然后我们需要根据得到的后缀表达式,一次扫描来得到对应的汇编代码。

    void evalutePostfix(const vector<string>& postfix, const unordered_map<string, int>& variables) {
        for (const string& token : postfix) {
            if (isdigit(token[0])) {
                cout << "mov eax, "<<token<<"" << endl;
                cout << "push eax" << endl;
            }
            else if (isalpha(token[0])) {
                cout << "mov eax, DWORD PTR [ebp" << variables.at(token) << "]" << endl;
                cout << "push eax" << endl;
            }
            else {
                if (token == "+") {
                    cout << "pop ebx" << endl;
                    cout << "pop eax" << endl;
                    cout << "add eax, ebx" << endl;
                    cout << "push eax" << endl;
                }
                else if (token == "-") {
                    cout << "pop ebx" << endl;
                    cout << "pop eax" << endl;
                    cout << "sub eax, ebx" << endl;
                    cout << "push eax" << endl;
                }
                else if (token == "*") {
                    cout << "pop ebx" << endl;
                    cout << "pop eax" << endl;
                    cout << "imul eax, ebx" << endl;
                    cout << "push eax" << endl;
                }
                else if (token == "/") {
                    cout << "pop ebx" << endl;
                    cout << "pop eax" << endl;
                    cout << "cdq" << endl;
                    cout << "idiv ebx" << endl;
                    cout << "push eax" << endl;
                }
            }
        }
        cout << "pop eax" << endl;
    }

        其他的就还比较好解决 。

 

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

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

相关文章

ES 8.x的全程编译实践与问题解决

摘要 本文整理和记录ES 8.x的编译过程问题与解决方案&#xff0c;主要解决gradle下载问题以及国内源、Hadoop环境设置与hadoop附件缺失、编译时jdk版本指定、esql的compute超时报错、编译时警告导致编译失败等问题&#xff01; 本地目录结构 . ├── build.sh ├── hadoo…

交叉注意力融合时域、频域特征的FFT + CNN -BiLSTM-CrossAttention电能质量扰动识别模型

往期精彩内容&#xff1a; 电能质量扰动信号数据介绍与分类-Python实现-CSDN博客 Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(三)基于Transformer…

大模型第一讲笔记

目录 1、人工智能基础概念全景介绍... 2 1.1 人工智能全景图... 2 1.2 人工智能历史... 2 1.3 人工智能——机器学习... 3 监督学习、非监督学习、强化学习、机器学习之间的关系... 3 监督学习... 4 无监督学习... 5 强化学习... 5 深度学习... 6 2、语言模型的发展及…

MySQL 多表查询强化练习

环境准备 create table dept(id int PRIMARY KEY,dname VARCHAR(50),loc VARCHAR(50) ); insert into dept values (10,研发部,北京), (20,学工部, 上海), (30,销售部,广州 ), (40,财务部,深圳);create table job(id int PRIMARY KEY,jname VARCHAR(20),descripition VARCHAR(…

小米汽车定价较预期下调3万至5万,发布之前仍有可能微调

跨界造车的新势力小米汽车正逐渐揭开其神秘面纱。最新爆料显示&#xff0c;小米汽车内部对车辆的定价进行了讨论&#xff0c;较之前的预期下调了3万至5万的幅度。然而&#xff0c;在正式发布之前&#xff0c;这一价格仍有可能进行微调。 历经三年的精心筹备&#xff0c;小米汽车…

5G网络架构与组网部署03--5G网络组网部署

1. SA组网与NSA组网 &#xff08;1&#xff09;NSA 非独立组网&#xff1a;终端同时接入4G基站和5G基站&#xff0c;只能实现5G部分功能 &#xff08;2&#xff09;SA组网【最终目标】&#xff1a;5G基站可以单独提供服务&#xff0c;接入的是5G核心网 区别&#xff1a;同一时间…

双轨模式的优势、弊端与未来发展:私域分销的考量

在多元化的商业环境中&#xff0c;双轨模式作为一种独特的经营策略&#xff0c;已经逐渐引起了广泛关注。这种模式通过并行运行两个或多个互补的轨道&#xff0c;旨在实现资源整合、风险分散和灵活性增强。然而&#xff0c;与此同时&#xff0c;双轨模式也伴随着一些弊端和挑战…

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+HLS图像缩放+多路视频拼接,提供4套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博主所有FPGA工程项目-->汇总目录本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收OSD动态字符叠加输出应用本方案的SDI接收HLS…

【LeetCode每日一题】1793. 好子数组的最大分数

文章目录 [1793. 好子数组的最大分数](https://leetcode.cn/problems/maximum-score-of-a-good-subarray/)思路&#xff1a;单调栈代码&#xff1a; 1793. 好子数组的最大分数 思路&#xff1a;单调栈 1遍历数组&#xff0c;用单调栈来找到该位置左边比该位置小的数&#xff0…

Linux/Monitored

Enumeration nmap 用 nmap 扫描了常见的端口&#xff0c;发现对外开放了 22,80,389,443,5667 端口&#xff0c;端口详细信息如下 ┌──(kali㉿kali)-[~/vegetable/HTB/Monitored] └─$ nmap -sC -sV -p 22,80,389,443,5667 10.10.11.248 Starting Nmap 7.93 ( https://nm…

印度金融公司数据遭泄露,泄露数据超过3TB

近期&#xff0c;印度非银行金融公司 IKF Finance 泄露了超过 3 TB 的敏感客户和员工数据&#xff0c;可能会暴露其整个用户群。 Cybernews 研究团队发现&#xff0c;一个配置错误的 MongoDB 实例导致超过 400 万份 IKF Finance 文档被公开。 企业通常使用 MongoDB 来组织和存…

Linux——程序地址空间

我们先来看这样一段代码&#xff1a; #include <stdio.h> #include <unistd.h> #include <stdlib.h>int g_val 0;int main() {pid_t id fork();if(id < 0){perror("fork");return 0;}else if(id 0){ //child,子进程肯定先跑完&#xff0c;也…

时序分解 | Matlab实现GWO-CEEMDAN基于灰狼算法优化CEEMDAN时间序列信号分解

时序分解 | Matlab实现GWO-CEEMDAN基于灰狼算法优化CEEMDAN时间序列信号分解 目录 时序分解 | Matlab实现GWO-CEEMDAN基于灰狼算法优化CEEMDAN时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.CEEMDAN方法的分解效果取决于白噪声幅值权重(Nstd)和噪声添…

SpringCloud从入门到精通速成(一)

文章目录 1.认识微服务1.0.学习目标1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结 2.服务拆分和远程调用2.1.服务拆分原则2.2.服务拆分示例2.2.1.导入Sql语句2.2.2.导入demo工程 2.3.实现远程调用案例2.3.1.案例需求&#xff1a;2.3.2.注册RestTemplate2.3.3.实…

Python爬虫获取接口数据

Python爬虫获取接口数据 正常人的操作​​​​​​​​​​爬虫的思路标题获取请求信息标题请求转换为代码完整代码请求返回信息执行程序获取静态网页数据的教程,适用于我们要爬取的数据在网页源代码中出现,但是还是有很多的数据是源代码中没有的,需要通过接口访问服务器来获…

游戏服务端配置“热更”及“秒启动”终极方案(golang/ygluu/卢益贵)

游戏服务端配置“热更”及“秒启动”终极方案 ygluu 卢益贵 关键词&#xff1a;游戏微服务架构、游戏服务端热更、模块化解耦、golang 目录 一、前言 二、异步线程加载/重载方案 三、配置表碎片化方案 四、指针间接引用 五、重载通知 六、示例代码 七、相关连接 一、…

【CKA模拟题】别再犯难!一文教你用两种方式快速创建Pod!

题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetesCreate a pod called sleep-pod using the nginx image and also sleep for give any value for seconds. 使用nginx image创建一个名…

探索山海鲸可视化:相较于Excel的独特优势分析

作为一名新用户&#xff0c;我近期开始接触并尝试使用山海鲸可视化工具&#xff0c;这款软件最初吸引我的点在其免费可视化编辑、本地化部署的特点&#xff0c;用了一段时间后&#xff0c;我发现相较于之前使用的Excel来制作可视化看板&#xff0c;两者在多个方面有着显著的区别…

WordPress Plugin NotificationX插件 SQL注入漏洞复现(CVE-2024-1698)

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。 0x02 漏洞概述 WordPress plugin NotificationX是一个应用插件。2.8.2版本及之前 存在安全漏洞,该…

数据库简介与MySQL编译安装

1数据库基础 什么是数据库 数据库&#xff08;Database&#xff09;是一个有组织的数据存储系统&#xff0c;用于有效地存储、检索、管理和维护数据。数据库系统允许用户以结构化的方式存储和操作大量数据&#xff0c;并提供了一种可靠的方法来管理和维护这些数据&#xff0c…