编译原理中间代码生成实验代码C++
时间: 2023-09-09 15:12:15 浏览: 219
以下是一个简单的 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;
}
```
这个代码生成器仅支持加法和减法操作,可以通过添加更多的操作符和类型来扩展其功能。
阅读全文