static bool ir_assign(struct ast_node *node) { // TODO real number add struct ast_node *son1_node = node->sons[0]; struct ast_node *son2_node = node->sons[1]; // 赋值节点,自右往左运算 // 赋值运算符的左侧操作数 struct ast_node *left = ir_visit_ast_node(son1_node); if (!left) { // 某个变量没有定值 // 这里缺省设置变量不存在则创建,因此这里不会错误 return false; } // 赋值运算符的右侧操作数 struct ast_node *right = ir_visit_ast_node(son2_node); if (!right) { // 某个变量没有定值 return false; } // 这里只处理整型的数据,如需支持实数,则需要针对类型进行处理 // 创建临时变量保存IR的值,以及线性IR指令 node->blockInsts.addInst(right->blockInsts); node->blockInsts.addInst(left->blockInsts); node->blockInsts.addInst( new AssignIRInst(left->val, right->val)); node->val = left->val; return true; }这一部分可以同时处理整数型和实数型吗,如果不可以请进行相应修改。
时间: 2023-06-27 17:06:52 浏览: 39
不可以同时处理整数型和实数型,因为对于不同的数据类型,赋值操作的细节会有所不同。如果需要支持实数型,需要在创建临时变量保存IR的值时,针对不同的数据类型进行处理。具体修改方法如下:
1. 在赋值运算符的左侧操作数 `left` 和右侧操作数 `right` 获取后,需要判断它们的数据类型是否一致;
2. 如果数据类型一致,则直接创建临时变量保存IR的值;
3. 如果数据类型不一致,则需要进行数据类型的转换,然后再创建临时变量保存IR的值,这里需要针对不同的数据类型进行处理。
具体代码实现如下:
```
static bool ir_assign(struct ast_node *node) {
struct ast_node *son1_node = node->sons[0];
struct ast_node *son2_node = node->sons[1];
// 赋值节点,自右往左运算
// 赋值运算符的左侧操作数
struct ast_node *left = ir_visit_ast_node(son1_node);
if (!left) {
// 某个变量没有定值
// 这里缺省设置变量不存在则创建,因此这里不会错误
return false;
}
// 赋值运算符的右侧操作数
struct ast_node *right = ir_visit_ast_node(son2_node);
if (!right) {
// 某个变量没有定值
return false;
}
// 判断数据类型是否一致
if (left->type == right->type) {
// 创建临时变量保存IR的值,以及线性IR指令
node->blockInsts.addInst(right->blockInsts);
node->blockInsts.addInst(left->blockInsts);
node->blockInsts.addInst(new AssignIRInst(left->val, right->val));
node->val = left->val;
return true;
} else {
// 需要进行数据类型的转换
if (left->type == AST_REAL && right->type == AST_INTEGER) {
// 将整数型转换为实数型
struct ast_node *temp_node = new_ast_node(AST_REAL);
temp_node->blockInsts.addInst(right->blockInsts);
temp_node->val = newTemp();
node->blockInsts.addInst(temp_node->blockInsts);
node->blockInsts.addInst(left->blockInsts);
node->blockInsts.addInst(new AssignIRInst(left->val, temp_node->val));
node->val = left->val;
return true;
} else if (left->type == AST_INTEGER && right->type == AST_REAL) {
// 将实数型转换为整数型
struct ast_node *temp_node = new_ast_node(AST_INTEGER);
temp_node->blockInsts.addInst(right->blockInsts);
temp_node->val = newTemp();
node->blockInsts.addInst(temp_node->blockInsts);
node->blockInsts.addInst(left->blockInsts);
node->blockInsts.addInst(new AssignIRInst(left->val, temp_node->val));
node->val = left->val;
return true;
} else {
// 数据类型不支持转换,报错
printf("Error: unsupported data type conversion.\n");
return false;
}
}
}
```