编译原理中间代码生成实验代码C++

时间: 2023-09-09 12:12:15 浏览: 49
以下是一个简单的 C++ 中间代码生成器,它可以将输入的简单算术表达式转换成三地址码: ```c++ #include <iostream> #include <string> #include <vector> using namespace std; // 定义符号表项结构体 struct SymbolItem { string name; // 符号名字 string type; // 符号类型 int address; // 符号地址 }; // 定义符号表结构体 struct SymbolTable { vector<SymbolItem> items; // 符号表项列表 // 向符号表中添加一个符号 void addSymbol(string name, string type, int address) { SymbolItem item = {name, type, address}; items.push_back(item); } // 从符号表中查找一个符号 int findSymbol(string name) { for (int i = 0; i < items.size(); i++) { if (items[i].name == name) { return i; } } return -1; } }; // 定义中间代码结构体 struct IntermediateCode { string op; // 操作符 string arg1; // 参数1 string arg2; // 参数2 string res; // 结果 }; // 将算术表达式转换为三地址码 vector<IntermediateCode> generateIntermediateCode(string expr) { vector<IntermediateCode> codes; // 中间代码表 SymbolTable table; // 符号表 int address = 0; // 下一个符号的地址 // 将输入的算术表达式按空格分割成单词 vector<string> tokens; int start = 0; for (int i = 0; i < expr.length(); i++) { if (expr[i] == ' ') { tokens.push_back(expr.substr(start, i-start)); start = i+1; } } tokens.push_back(expr.substr(start)); // 生成中间代码 for (int i = 0; i < tokens.size(); i++) { string token = tokens[i]; if (token == "+" || token == "-") { // 生成中间代码 string op = (token == "+") ? "ADD" : "SUB"; string arg1 = table.items.back().name; table.items.pop_back(); string arg2 = table.items.back().name; table.items.pop_back(); string res = "t" + to_string(address++); codes.push_back({op, arg1, arg2, res}); // 将结果加入符号表 table.addSymbol(res, "INT", address); } else { // 将操作数加入符号表 table.addSymbol(token, "INT", address); } } return codes; } // 打印中间代码 void printIntermediateCode(vector<IntermediateCode> codes) { for (int i = 0; i < codes.size(); i++) { IntermediateCode code = codes[i]; cout << code.res << " = " << code.arg1 << " " << code.op << " " << code.arg2 << endl; } } int main() { string expr = "1 + 2 - 3 + 4"; vector<IntermediateCode> codes = generateIntermediateCode(expr); printIntermediateCode(codes); return 0; } ``` 这个代码生成器仅支持加法和减法操作,可以通过添加更多的操作符和类型来扩展其功能。

相关推荐

最新推荐

recommend-type

编译原理中间代码生成实验报告——完整版

熟悉算术表达式的语法分析与中间代码生成原理。 三、实验内容 1. 构造算术表达式的四元式翻译文法 2. 设计算术表达式的递归下降子程序分析算法 3. 设计算术表达的四元式生成算法 4. 实现代码并调试运行 四、实验...
recommend-type

编译原理实验报告——生成中间代码

编译原理实验报告——生成中间代码,从文件中读入表达式,输出其四元式的结果序列
recommend-type

表达式中间代码生成 编译原理实验报告

熟悉算术表达式的语法分析与中间代码生成原理 二、实验内容 1. 构造算术表达式的四元式翻译文法 2. 设计算术表达式的递归下降子程序分析算法 3. 设计算术表达的四元式生成算法 4. 实现代码并调试运行 三、实验...
recommend-type

中间代码生成器的设计(实验报告+代码+运行结果) 编译方法

(1) 设计语法制导翻译生成表达式的四元式的算法; (2) 编写代码并上机调试运行通过。 ·输入——算术表达式 ·输出——语法分析结果 相应的四元式序列 (3) 本实验已给出递归子程序法的四元式属性翻译文法的设计,...
recommend-type

编译原理实验报告 熟悉算术表达式的语法分析与中间代码生成原理

1. 构造算术表达式的四元式翻译文法 2. 设计算术表达式的递归下降子程序分析算法 3. 设计算术表达的四元式生成算法 4. 实现代码并调试运行
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB取整函数与Web开发的作用:round、fix、floor、ceil在Web开发中的应用

![MATLAB取整函数与Web开发的作用:round、fix、floor、ceil在Web开发中的应用](https://img-blog.csdnimg.cn/2020050917173284.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2thbmdqaWVsZWFybmluZw==,size_16,color_FFFFFF,t_70) # 1. MATLAB取整函数概述** MATLAB取整函数是一组强大的工具,用于对数值进行
recommend-type

我想做python的算法工程师,我应该学什么?学习的顺序是什么?网上有什么推荐的免费课程吗?回答具体精确一点不要太笼统

对于想要成为 Python 算法工程师的人来说,他们应该先从掌握 Python 的基础语法开始,然后学习数据结构和算法,并且要深入了解 Python 中的一些科学计算和数据处理库,比如 NumPy、Pandas 等。 学习的顺序可以是先学习基础语法和编程技巧,然后再学习数据结构和算法相关的知识,最后深入了解数据处理和科学计算相关的库。 对于免费课程的推荐,我建议你可以先去 Coursera、edX、Udacity 等网站上寻找相关课程,这些网站上有很多优质的 Python 编程和算法课程,你可以根据自己的需求和学习进度进行选择。此外,还可以考虑一些在线编程网站,如 HackerRank、L
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。